Vector3 getInterpolationNormal(List <int> triIndexList, ref Vector3 movablePos, ref Vector3 headUp) { var triCount = triIndexList.Count; for (var i = 0; i < triCount; ++i) { var triIndex = triIndexList[i]; int v0Index = triangles[3 * triIndex]; int v1Index = triangles[3 * triIndex + 1]; int v2Index = triangles[3 * triIndex + 2]; var v0 = vertices[v0Index]; var v1 = vertices[v1Index]; var v2 = vertices[v2Index]; var parentPos = transform.position; v0 += parentPos; v1 += parentPos; v2 += parentPos; var N = GeometryTool.CalculateTriangleNormal(ref v0, ref v1, ref v2); // 擊中三角形所在的平面 Vector3 hitPos; if (!GeometryTool.RayHitPlane(movablePos, -N, N, v0, out hitPos)) { continue; } bool isGetValue; float a, b, r; GeometryTool.CalculateBarycentricCoordinates(ref v0, ref v1, ref v2, ref hitPos, out isGetValue, out a, out b, out r); if (!isGetValue) { continue; } if (!GeometryTool.isInTriangle(a, b, r)) { continue; } Debug.DrawLine(v0, v1, Color.red); Debug.DrawLine(v1, v2, Color.green); Debug.DrawLine(v2, v0, Color.blue); var n0 = normals[v0Index]; var n1 = normals[v1Index]; var n2 = normals[v2Index]; Debug.DrawRay(v0, n0 * 5); Debug.DrawRay(v1, n1 * 5); Debug.DrawRay(v2, n2 * 5); var normal = GeometryTool.CalculateInterpolationValueByBarycentricCoordinates(ref n0, ref n1, ref n2, a, b, r); return(normal.normalized); } return(headUp); }
bool rayHitPlane(Vector3 from, Vector3 dir, SphereTerrain sTerrain, out Vector3 hitPoint) { if (!GeometryTool.RayHitPlane(from, dir, sTerrain.getPlaneNormal(), sTerrain.getPlanePoint(), out hitPoint)) { return(false); } var localHitPoint = sTerrain.transform.InverseTransformPoint(hitPoint); var half = 1023.0f * 0.5f; var inRect = Mathf.Abs(localHitPoint.x) < half && Mathf.Abs(localHitPoint.z) < half; controller.hitOnPlane.position = inRect ? hitPoint : Vector3.zero; return(inRect); }
public bool DoClick(Vector3 from, Vector3 dir, out int floor, out int y, out int x, bool onlyUseVoxel = false) { floor = -1; x = -1; y = -1; bool hit = GeometryTool.RayHitPlane(from, dir, Vector3.up, transform.position + GetNowFlowerHeight(), out hitPoint); if (!hit) { return(false); } var voxel = GetHitVoxel(hitPoint); if (voxel == null) { return(false); } if (onlyUseVoxel) { if (!voxel.IsUse()) { return(false); } } bool hitSphere = voxel.IsHit(hitPoint); if (!hitSphere) { return(false); } x = voxel.x; y = voxel.y; floor = voxel.floor; return(true); }