void StructureSphere(SphereStructureMode mode, Matrix4x4 local2world) { Mesh mesh = transform.GetComponent <MeshFilter>().sharedMesh; List <Vector3> vertices = Util.GetNoRepeatVertices(mesh); for (int i = 0; i < vertices.Count; i++) { vertices[i] = local2world * MathUtil.Vector4(vertices[i], 1); } switch (mode) { case SphereStructureMode.Ritter: RitterSphere(vertices); break; case SphereStructureMode.RitterIter: RitterIterSphere(vertices); break; case SphereStructureMode.RitterEigen: RitterEigenSphere(vertices); break; } }
public Sphere(Transform transform, SphereStructureMode mode) { this.transform = transform; this.mode = mode; matrix = transform.localToWorldMatrix; StructureSphere(mode, matrix); }
public void UpdateSphere(SphereStructureMode mode) { Matrix4x4 m = transform.localToWorldMatrix; //发生缩放需要重构包围球 if (MathUtil.IsContainScale(matrix, m) || this.mode != mode) { StructureSphere(mode, m); this.mode = mode; } else { //旋转不需要改变包围球 //平移只需把球心偏移即可 Vector3 translation = MathUtil.GetTranslation(matrix, m); center += translation; } matrix = m; }