static void _ProcessBoundingBoxAABB( ref SharedMinBounding sharedMinBounding, Vector3[] vertices, bool[] usedVertices, Vector3 minCenter, Euler beginEuler, Euler endEuler, int stepEuler) { if (vertices == null || usedVertices == null) { return; } Matrix4x4 transform = Matrix4x4.identity; MinBounding minBounding = new MinBounding(); for (int rz = beginEuler.z; rz < endEuler.z; rz += stepEuler) { for (int ry = beginEuler.y; ry < endEuler.y; ry += stepEuler) { for (int rx = beginEuler.x; rx < endEuler.x; rx += stepEuler) { transform.SetTRS(Vector3.zero, Quaternion.Euler(rx, ry, rz), Vector3.one); Vector3 tempBoxA = Vector3.zero, tempBoxB = Vector3.zero; _GetBoundingBoxAABB(vertices, usedVertices, ref tempBoxA, ref tempBoxB, ref minCenter, ref transform); Vector3 v = (tempBoxB - tempBoxA); float tempVolume = _GetVolume(v); Euler tempEuler = new Euler(rx, ry, rz); minBounding.Contain(tempBoxA, tempBoxB, tempEuler, tempVolume); } } } sharedMinBounding.Contain(ref minBounding); }
void _GetMinBoundingBoxAABB(ref Vector3 minCenter, ref Vector3 minBoxA, ref Vector3 minBoxB, ref Vector3 minEular) { if (_centerEnabled) { minCenter = _center; } else { minCenter = _GetBoundingBoxCenterAABB(); } //minCenter = Vector3.zero; if (_rotationEnabled) { minBoxA = Vector3.zero; minBoxB = Vector3.zero; minEular = Vector3.zero; Matrix4x4 transform = _RotationMatrix(InversedRotation(_rotation)); _GetBoundingBoxAABB(ref minBoxA, ref minBoxB, ref minCenter, ref transform); return; } #if false { minBoxA = Vector3.zero; minBoxB = Vector3.zero; minEular = Vector3.zero; Matrix4x4 transform = Matrix4x4.identity; _GetBoundingBoxAABB(ref minBoxA, ref minBoxB, ref minCenter, ref transform); } #else int stepEuler = 20; int stepEuler2 = 5; int stepEuler3 = 1; SharedMinBounding sharedMinBounding = new SharedMinBounding(); { Euler beginEuler = new Euler(0, 0, 0); Euler endEuler = new Euler(180, 180, 180); if (!_optimizeRotation.x) { beginEuler.x = 0; endEuler.x = 1; } if (!_optimizeRotation.y) { beginEuler.y = 0; endEuler.y = 1; } if (!_optimizeRotation.z) { beginEuler.z = 0; endEuler.z = 1; } _ProcessBoundingBoxAABB( ref sharedMinBounding, _vertexList, _usedVertexList, minCenter, beginEuler, endEuler, stepEuler); } { int fx = sharedMinBounding.minBounding.euler.x; int fy = sharedMinBounding.minBounding.euler.y; int fz = sharedMinBounding.minBounding.euler.z; Euler beginEuler = new Euler(fx - stepEuler, fy - stepEuler, fz - stepEuler); Euler endEuler = new Euler(fx + stepEuler, fy + stepEuler, fz + stepEuler); if (!_optimizeRotation.x) { beginEuler.x = 0; endEuler.x = 1; } if (!_optimizeRotation.y) { beginEuler.y = 0; endEuler.y = 1; } if (!_optimizeRotation.z) { beginEuler.z = 0; endEuler.z = 1; } _ProcessBoundingBoxAABB( ref sharedMinBounding, _vertexList, _usedVertexList, minCenter, beginEuler, endEuler, stepEuler2); } { int fx = sharedMinBounding.minBounding.euler.x; int fy = sharedMinBounding.minBounding.euler.y; int fz = sharedMinBounding.minBounding.euler.z; Euler beginEuler = new Euler(fx - stepEuler2, fy - stepEuler2, fz - stepEuler2); Euler endEuler = new Euler(fx + stepEuler2, fy + stepEuler2, fz + stepEuler2); if (!_optimizeRotation.x) { beginEuler.x = 0; endEuler.x = 1; } if (!_optimizeRotation.y) { beginEuler.y = 0; endEuler.y = 1; } if (!_optimizeRotation.z) { beginEuler.z = 0; endEuler.z = 1; } _ProcessBoundingBoxAABB( ref sharedMinBounding, _vertexList, _usedVertexList, minCenter, beginEuler, endEuler, stepEuler3); } Euler euler = sharedMinBounding.minBounding.euler; minBoxA = sharedMinBounding.minBounding.boxA; minBoxB = sharedMinBounding.minBounding.boxB; minEular = new Vector3((float)euler.x, (float)euler.y, (float)euler.z); #endif }