140 lines
5.1 KiB
C#
140 lines
5.1 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);
|
|
|
|
var num1 = end - start + 1;
|
|
var indices = new int[(num1 - 1) * 6];
|
|
var vector3Array1 = new Vector3[num1 * 2];
|
|
|
|
Vector3 left, right;
|
|
CreateVertices(start, route, lOffset, rOffset, out left, out right, margin);
|
|
vector3Array1[0] = left;
|
|
vector3Array1[1] = right;
|
|
|
|
var num2 = 2;
|
|
var num3 = 0;
|
|
for (var frame = start + 1; frame <= end; ++frame)
|
|
{
|
|
CreateVertices(frame, route, lOffset, rOffset, out left, out right, margin);
|
|
if (IsValidVertex(left) && 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;
|
|
var 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;
|
|
}
|
|
}
|
|
|
|
var mesh = new Mesh
|
|
{
|
|
vertices = vector3Array1,
|
|
indexFormat = IndexFormat.UInt32
|
|
};
|
|
mesh.SetIndices(indices, MeshTopology.Triangles, 0);
|
|
var 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)
|
|
{
|
|
var trajectoryOrientationAt = route.GetTrajectoryOrientationAt(frame);
|
|
var vector3 = route.GetCameraPositionAt(frame) - trajectoryOrientationAt * Vector3.up * route.CameraHeight;
|
|
|
|
if (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 (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;
|
|
}
|
|
}
|
|
}
|