4 using System.Collections.Generic;
19 readonly
int[] face0 = { 0, 1, 3, 2 };
20 readonly
int[] face1 = { 1, 5, 7, 3 };
21 readonly
int[] face2 = { 5, 4, 6, 7 };
22 readonly
int[] face3 = { 4, 0, 2, 6 };
23 readonly
int[] face4 = { 6, 2, 3, 7 };
24 readonly
int[] face5 = { 1, 0, 4, 5 };
25 readonly
int[] noFaceIndices = { };
26 readonly Vector3[] noFaceVertices = { };
28 private List<Vector3> rawBoundingCorners =
new List<Vector3>();
29 private List<Vector3> worldBoundingCorners =
new List<Vector3>();
30 private GameObject targetObject;
31 private bool rawBoundingCornersObtained =
false;
42 if (target != targetObject || rawBoundingCornersObtained ==
false)
44 GetRawBBCorners(target, ignoreLayers);
47 if (target == targetObject && rawBoundingCornersObtained)
50 for (
int i = 0; i < rawBoundingCorners.Count; ++i)
52 boundsPoints.Add(target.transform.localToWorldMatrix.MultiplyPoint(rawBoundingCorners[i]));
55 worldBoundingCorners.Clear();
56 worldBoundingCorners.AddRange(boundsPoints);
67 targetObject = target;
68 rawBoundingCorners.Clear();
69 rawBoundingCornersObtained =
false;
71 GetUntransformedCornersFromObject(target, rawBoundingCorners, ignoreLayers);
73 if (rawBoundingCorners != null && rawBoundingCorners.Count >= 4)
75 rawBoundingCornersObtained =
true;
102 return noFaceIndices;
112 Vector3[] corners = GetFaceCorners(index);
113 Vector3[] midpoints =
new Vector3[4];
114 midpoints[0] = (corners[0] + corners[1]) * 0.5f;
115 midpoints[1] = (corners[1] + corners[2]) * 0.5f;
116 midpoints[2] = (corners[2] + corners[3]) * 0.5f;
117 midpoints[3] = (corners[3] + corners[0]) * 0.5f;
129 int[] face = GetFaceIndices(index);
131 if (face.Length == 4)
133 Vector3 ab = (worldBoundingCorners[face[1]] - worldBoundingCorners[face[0]]).normalized;
134 Vector3 ac = (worldBoundingCorners[face[2]] - worldBoundingCorners[face[0]]).normalized;
135 return Vector3.Cross(ab, ac).normalized;
149 int[] faceIndices = GetFaceIndices(index);
151 if (faceIndices.Length == 4)
153 return (worldBoundingCorners[faceIndices[0]] +
154 worldBoundingCorners[faceIndices[1]] +
155 worldBoundingCorners[faceIndices[2]] +
156 worldBoundingCorners[faceIndices[3]]) * 0.25f;
169 Vector3[] edgeCentroids = GetFaceEdgeMidpoints(index);
171 Vector3 leastYPoint = edgeCentroids[0];
172 for (
int i = 1; i < 4; ++i)
174 leastYPoint = edgeCentroids[i].y < leastYPoint.y ? edgeCentroids[i] : leastYPoint;
186 int[] faceIndices = GetFaceIndices(index);
188 if (faceIndices.Length == 4)
190 Vector3[] face =
new Vector3[4];
191 face[0] = worldBoundingCorners[faceIndices[0]];
192 face[1] = worldBoundingCorners[faceIndices[1]];
193 face[2] = worldBoundingCorners[faceIndices[2]];
194 face[3] = worldBoundingCorners[faceIndices[3]];
198 return noFaceVertices;
209 int highestDotIndex = -1;
210 float hightestDotValue =
float.MinValue;
211 for (
int i = 0; i < 6; ++i)
213 Vector3 a = (lookAtPoint - GetFaceCentroid(i)).normalized;
214 Vector3 b = GetFaceNormal(i);
215 float dot = Vector3.Dot(a, b);
216 if (hightestDotValue < dot)
218 hightestDotValue = dot;
222 return highestDotIndex;
236 GetUntransformedCornersFromObject(target, boundsPoints, ignoreLayers);
239 for (
int i = 0; i < boundsPoints.Count; ++i)
241 boundsPoints[i] = target.transform.localToWorldMatrix.MultiplyPoint(boundsPoints[i]);
253 GameObject clone = GameObject.Instantiate(target);
254 clone.transform.localRotation = Quaternion.identity;
255 clone.transform.position = Vector3.zero;
256 clone.transform.localScale = Vector3.one;
257 Renderer[] renderers = clone.GetComponentsInChildren<Renderer>();
259 for (
int i = 0; i < renderers.Length; ++i)
261 var rendererObj = renderers[i];
262 if (ignoreLayers == (1 << rendererObj.gameObject.layer | ignoreLayers))
266 Vector3[] corners = null;
267 rendererObj.bounds.GetCornerPositionsFromRendererBounds(ref corners);
268 AddAABoundingBoxes(boundsPoints, corners);
271 GameObject.Destroy(clone);
281 if (points.Count < 8)
284 points.AddRange(pointsToAdd);
288 for (
int i = 0; i < pointsToAdd.Length; ++i)
290 if (pointsToAdd[i].x < points[0].x)
292 points[0].Set(pointsToAdd[i].x, points[0].y, points[0].z);
293 points[1].Set(pointsToAdd[i].x, points[1].y, points[1].z);
294 points[2].Set(pointsToAdd[i].x, points[2].y, points[2].z);
295 points[3].Set(pointsToAdd[i].x, points[3].y, points[3].z);
297 if (pointsToAdd[i].x > points[4].x)
299 points[4].Set(pointsToAdd[i].x, points[4].y, points[4].z);
300 points[5].Set(pointsToAdd[i].x, points[5].y, points[5].z);
301 points[6].Set(pointsToAdd[i].x, points[6].y, points[6].z);
302 points[7].Set(pointsToAdd[i].x, points[7].y, points[7].z);
305 if (pointsToAdd[i].y < points[0].y)
307 points[0].Set(points[0].x, pointsToAdd[i].y, points[0].z);
308 points[1].Set(points[1].x, pointsToAdd[i].y, points[1].z);
309 points[4].Set(points[4].x, pointsToAdd[i].y, points[4].z);
310 points[5].Set(points[5].x, pointsToAdd[i].y, points[5].z);
312 if (pointsToAdd[i].y > points[2].y)
314 points[2].Set(points[2].x, pointsToAdd[i].y, points[2].z);
315 points[3].Set(points[3].x, pointsToAdd[i].y, points[3].z);
316 points[6].Set(points[6].x, pointsToAdd[i].y, points[6].z);
317 points[7].Set(points[7].x, pointsToAdd[i].y, points[7].z);
320 if (pointsToAdd[i].z < points[0].z)
322 points[0].Set(points[0].x, points[0].y, pointsToAdd[i].z);
323 points[2].Set(points[2].x, points[2].y, pointsToAdd[i].z);
324 points[6].Set(points[6].x, points[6].y, pointsToAdd[i].z);
325 points[4].Set(points[4].x, points[4].y, pointsToAdd[i].z);
327 if (pointsToAdd[i].z > points[1].z)
329 points[1].Set(points[1].x, points[1].y, pointsToAdd[i].z);
330 points[5].Set(points[5].x, points[5].y, pointsToAdd[i].z);
331 points[7].Set(points[7].x, points[7].y, pointsToAdd[i].z);
332 points[3].Set(points[3].x, points[3].y, pointsToAdd[i].z);