121 lines
4.9 KiB
C#
121 lines
4.9 KiB
C#
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<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;
|
|
}
|
|
}
|
|
}
|