using UnityEngine; using UnityEngine.Rendering; namespace Assets.AR { public static class ARGameObjectFactory { private static bool IsValidVertex(Vector3 v) => !float.IsNaN(v.x) && !float.IsInfinity(v.x) && !float.IsNaN(v.y) && !float.IsInfinity(v.y) && !float.IsNaN(v.z) && !float.IsInfinity(v.z); //创建轨迹 public static GameObject CreateTrajectory( ARRoute route, int segment, float lOffset, float rOffset, float margin = float.NaN) { int start; int end; route.GetSlamSegmentRange(segment, out start, out end); int num1 = end - start + 1; int[] indices = new int[(num1 - 1) * 6]; Vector3[] vector3Array1 = new Vector3[num1 * 2]; Vector3 left; Vector3 right; ARGameObjectFactory.CreateVertices(start, route, lOffset, rOffset, out left, out right, margin); vector3Array1[0] = left; vector3Array1[1] = right; int num2 = 2; int num3 = 0; for (int frame = start + 1; frame <= end; ++frame) { ARGameObjectFactory.CreateVertices(frame, route, lOffset, rOffset, out left, out right, margin); if (ARGameObjectFactory.IsValidVertex(left) && ARGameObjectFactory.IsValidVertex(right)) { var vector3Array2 = vector3Array1; var index1 = num2; var num4 = index1 + 1; var vector3_1 = left; vector3Array2[index1] = vector3_1; var vector3Array3 = vector3Array1; var index2 = num4; num2 = index2 + 1; Vector3 vector3_2 = right; vector3Array3[index2] = vector3_2; var numArray1 = indices; var index3 = num3; var num5 = index3 + 1; var num6 = num2 - 3; numArray1[index3] = num6; var numArray2 = indices; var index4 = num5; var num7 = index4 + 1; var num8 = num2 - 4; numArray2[index4] = num8; var numArray3 = indices; var index5 = num7; var num9 = index5 + 1; var num10 = num2 - 1; numArray3[index5] = num10; var numArray4 = indices; var index6 = num9; var num11 = index6 + 1; var num12 = num2 - 4; numArray4[index6] = num12; var numArray5 = indices; var index7 = num11; var num13 = index7 + 1; var num14 = num2 - 2; numArray5[index7] = num14; var numArray6 = indices; var index8 = num13; num3 = index8 + 1; var num15 = num2 - 1; numArray6[index8] = num15; } } Mesh mesh = new Mesh(); mesh.vertices = vector3Array1; mesh.indexFormat = IndexFormat.UInt32; mesh.SetIndices(indices, MeshTopology.Triangles, 0); GameObject trajectory = new GameObject(string.Format("Segment {0}", (object)segment), new System.Type[3] { typeof (MeshFilter), typeof (MeshRenderer), typeof (MeshCollider) }); trajectory.GetComponent().sharedMesh = mesh; trajectory.GetComponent().sharedMesh = trajectory.GetComponent().sharedMesh; return trajectory; } private static void CreateVertices( int frame, ARRoute route, float lOffset, float rOffset, out Vector3 left, out Vector3 right, float margin = float.NaN) { Quaternion trajectoryOrientationAt = route.GetTrajectoryOrientationAt(frame); Vector3 vector3 = route.GetCameraPositionAt(frame) - trajectoryOrientationAt * Vector3.up * route.CameraHeight; if ((double)lOffset == 0.0) lOffset = route.GetLeftSideOffset((float)frame); if (float.IsNaN(margin)) lOffset += route.RouteMargin; else lOffset += margin; left = vector3 + trajectoryOrientationAt * Vector3.left * lOffset; if ((double)rOffset == 0.0) rOffset = route.GetRightSideOffset((float)frame); if (float.IsNaN(margin)) rOffset += route.RouteMargin; else rOffset += margin; right = vector3 - trajectoryOrientationAt * Vector3.left * rOffset; left.y = right.y = vector3.y; } } }