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;
    }