powerfun-unity/Assets/AR/ARGameObjectFactory.cs
2023-04-18 17:10:48 +08:00

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;
}
}
}