10 [ExecuteInEditMode, RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
13 public SteamVR_TrackedObject.EIndex index;
15 public float fovLeft = 45, fovRight = 45, fovTop = 45, fovBottom = 45, nearZ = 0.5f, farZ = 2.5f;
17 public void UpdateModel()
19 fovLeft = Mathf.Clamp(fovLeft, 1, 89);
20 fovRight = Mathf.Clamp(fovRight, 1, 89);
21 fovTop = Mathf.Clamp(fovTop, 1, 89);
22 fovBottom = Mathf.Clamp(fovBottom, 1, 89);
23 farZ = Mathf.Max(farZ, nearZ + 0.01f);
24 nearZ = Mathf.Clamp(nearZ, 0.01f, farZ - 0.01f);
26 var lsin = Mathf.Sin(-fovLeft * Mathf.Deg2Rad);
27 var rsin = Mathf.Sin(fovRight * Mathf.Deg2Rad);
28 var tsin = Mathf.Sin(fovTop * Mathf.Deg2Rad);
29 var bsin = Mathf.Sin(-fovBottom * Mathf.Deg2Rad);
31 var lcos = Mathf.Cos(-fovLeft * Mathf.Deg2Rad);
32 var rcos = Mathf.Cos(fovRight * Mathf.Deg2Rad);
33 var tcos = Mathf.Cos(fovTop * Mathf.Deg2Rad);
34 var bcos = Mathf.Cos(-fovBottom * Mathf.Deg2Rad);
36 var corners =
new Vector3[] {
37 new Vector3(lsin * nearZ / lcos, tsin * nearZ / tcos, nearZ),
38 new Vector3(rsin * nearZ / rcos, tsin * nearZ / tcos, nearZ),
39 new Vector3(rsin * nearZ / rcos, bsin * nearZ / bcos, nearZ),
40 new Vector3(lsin * nearZ / lcos, bsin * nearZ / bcos, nearZ),
41 new Vector3(lsin * farZ / lcos, tsin * farZ / tcos, farZ ),
42 new Vector3(rsin * farZ / rcos, tsin * farZ / tcos, farZ ),
43 new Vector3(rsin * farZ / rcos, bsin * farZ / bcos, farZ ),
44 new Vector3(lsin * farZ / lcos, bsin * farZ / bcos, farZ ),
47 var triangles =
new int[] {
63 var vertices =
new Vector3[triangles.Length];
64 var normals =
new Vector3[triangles.Length];
65 for (
int i = 0; i < triangles.Length / 3; i++)
67 var a = corners[triangles[i * 3 + 0]];
68 var b = corners[triangles[i * 3 + 1]];
69 var c = corners[triangles[i * 3 + 2]];
70 var n = Vector3.Cross(b - a, c - a).normalized;
71 normals[i * 3 + 0] = n;
72 normals[i * 3 + 1] = n;
73 normals[i * 3 + 2] = n;
74 vertices[i * 3 + 0] = a;
75 vertices[i * 3 + 1] = b;
76 vertices[i * 3 + 2] = c;
77 triangles[i * 3 + 0] = j++;
78 triangles[i * 3 + 1] = j++;
79 triangles[i * 3 + 2] = j++;
82 var mesh =
new Mesh();
83 mesh.vertices = vertices;
84 mesh.normals = normals;
85 mesh.triangles = triangles;
87 GetComponent<MeshFilter>().mesh = mesh;
90 private void OnDeviceConnected(
int i,
bool connected)
95 GetComponent<MeshFilter>().mesh = null;
99 var system = OpenVR.System;
100 if (system != null && system.GetTrackedDeviceClass((uint)i) == ETrackedDeviceClass.TrackingReference)
102 var error = ETrackedPropertyError.TrackedProp_Success;
103 var result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_FieldOfViewLeftDegrees_Float, ref error);
104 if (error == ETrackedPropertyError.TrackedProp_Success)
107 result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_FieldOfViewRightDegrees_Float, ref error);
108 if (error == ETrackedPropertyError.TrackedProp_Success)
111 result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_FieldOfViewTopDegrees_Float, ref error);
112 if (error == ETrackedPropertyError.TrackedProp_Success)
115 result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_FieldOfViewBottomDegrees_Float, ref error);
116 if (error == ETrackedPropertyError.TrackedProp_Success)
119 result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_TrackingRangeMinimumMeters_Float, ref error);
120 if (error == ETrackedPropertyError.TrackedProp_Success)
123 result = system.GetFloatTrackedDeviceProperty((uint)i, ETrackedDeviceProperty.Prop_TrackingRangeMaximumMeters_Float, ref error);
124 if (error == ETrackedPropertyError.TrackedProp_Success)
134 GetComponent<MeshFilter>().mesh = null;
135 SteamVR_Events.DeviceConnected.Listen(OnDeviceConnected);
140 SteamVR_Events.DeviceConnected.Remove(OnDeviceConnected);
141 GetComponent<MeshFilter>().mesh = null;
147 if (!Application.isPlaying)