public AABB(Transform transform) { this.transform = transform; Mesh mesh = transform.GetComponent <MeshFilter>().sharedMesh; originMin = originMax = mesh.vertices[0]; for (int i = 1; i < mesh.vertices.Length; i++) { for (int j = 0; j < 3; j++) { if (mesh.vertices[i][j] < originMin[j]) { originMin[j] = mesh.vertices[i][j]; } if (mesh.vertices[i][j] > originMax[j]) { originMax[j] = mesh.vertices[i][j]; } } } transformMin = originMin; transformMax = originMax; matrix = Matrix4x4.identity; mode = AABBStructureMode.None; }
public void UpdateAABB(AABBStructureMode mode) { Matrix4x4 m = transform.localToWorldMatrix; //只发生平移的话不需要重新计算包围盒,直接加上偏移量即可 if (MathUtil.IsOnlyContainTranslation(matrix, m) && this.mode == mode) { Vector3 translation = MathUtil.GetTranslation(matrix, m); transformMin += translation; transformMax += translation; } else { this.mode = mode; //加速模式:只对max和min进行变换,不保证计算得到的包围盒是紧凑的 if (mode == AABBStructureMode.Accelerate) { Vector3 translate = new Vector3(m.m03, m.m13, m.m23); transformMin = translate; transformMax = translate; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { float e = m[j, i] * originMin[i]; float f = m[j, i] * originMax[i]; if (e < f) { transformMin[j] += e; transformMax[j] += f; } else { transformMin[j] += f; transformMax[j] += e; } } } } //紧凑模式:对所有顶点进行变换,计算得到的包围盒是紧凑的 else if (mode == AABBStructureMode.Compact) { Mesh mesh = transform.GetComponent <MeshFilter>().sharedMesh; List <Vector3> vertices = Util.GetNoRepeatVertices(mesh); transformMin = transformMax = m * MathUtil.Vector4(vertices[0], 1); for (int i = 1; i < vertices.Count; i++) { for (int j = 0; j < 3; j++) { Vector3 tmp = m * MathUtil.Vector4(vertices[i], 1); if (tmp[j] < transformMin[j]) { transformMin[j] = tmp[j]; } if (tmp[j] > transformMax[j]) { transformMax[j] = tmp[j]; } } } } } matrix = m; }