powerfun-unity/Assets/AR/ARMeshFactory.cs

121 lines
4.9 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
namespace Assets.AR
{
public static class ARMeshFactory
{
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;
ARMeshFactory.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)
{
ARMeshFactory.CreateVertices(frame, route, lOffset, rOffset, out left, out right, margin);
if (ARMeshFactory.IsValidVertex(left) && ARMeshFactory.IsValidVertex(right))
{
Vector3[] vector3Array2 = vector3Array1;
int index1 = num2;
int num4 = index1 + 1;
Vector3 vector3_1 = left;
vector3Array2[index1] = vector3_1;
Vector3[] vector3Array3 = vector3Array1;
int index2 = num4;
num2 = index2 + 1;
Vector3 vector3_2 = right;
vector3Array3[index2] = vector3_2;
int[] numArray1 = indices;
int index3 = num3;
int num5 = index3 + 1;
int num6 = num2 - 3;
numArray1[index3] = num6;
int[] numArray2 = indices;
int index4 = num5;
int num7 = index4 + 1;
int num8 = num2 - 4;
numArray2[index4] = num8;
int[] numArray3 = indices;
int index5 = num7;
int num9 = index5 + 1;
int num10 = num2 - 1;
numArray3[index5] = num10;
int[] numArray4 = indices;
int index6 = num9;
int num11 = index6 + 1;
int num12 = num2 - 4;
numArray4[index6] = num12;
int[] numArray5 = indices;
int index7 = num11;
int num13 = index7 + 1;
int num14 = num2 - 2;
numArray5[index7] = num14;
int[] numArray6 = indices;
int index8 = num13;
num3 = index8 + 1;
int 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<MeshFilter>().sharedMesh = mesh;
trajectory.GetComponent<MeshCollider>().sharedMesh = trajectory.GetComponent<MeshFilter>().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;
}
}
}