Пример #1
0
        private void Generate()
        {
            Vector3[] vertices = inputMesh.vertices;
            int vertexCount = inputMesh.vertexCount;

            int[] triangles = inputMesh.triangles;
            int trianglesCount = triangles.Length / 3;

            int nodesCount = 0;
            int edgesCount = 0;
            int facesCount = 0;
            int tetrasCount = 0;

            int err = TetrahedralizeGetSizes2(vertices, vertexCount, triangles, trianglesCount, out nodesCount, out edgesCount, out facesCount, out tetrasCount);

            if (err != 0)
            {
                PrintError(err);
                return;
            }

            float[] nodesOut = new float[nodesCount * 3];
            float[] attribsOut = new float[nodesCount * 2];
            Link[] edgesOut = new Link[edgesCount];
            int[] edgesNeighboursOut = new int[edgesCount];
            Triangle[] facesOut = new Triangle[facesCount];
            int[] facesNeighboursOut = new int[facesCount * 2];
            int[] facesMarkersOut = new int[facesCount];

            Tetrahedron[] tetrasOut = new Tetrahedron[tetrasCount];

            int err2 = Tetrahedralize2(vertices, vertexCount, triangles, trianglesCount, nodesOut, out nodesCount, edgesOut, out edgesCount, facesOut, out facesCount, tetrasOut, out tetrasCount);
            if (err2 != 0)
            {
                PrintError(err2);
                return;
            }

            GameObject go = new GameObject();
            go.name = newName;

            go.layer = colliderLayer;

            TetMesh tetMesh = go.AddComponent<TetMesh>();
            tetMesh.InitArrays(nodesCount);

            for (int i = 0; i < nodesCount; i++)
            {
                tetMesh.nodesPositions[i] = new Vector3(nodesOut[i * 3 + 0], nodesOut[i * 3 + 1], nodesOut[i * 3 + 2]);
            }

            tetMesh.edges = new Link[edgesCount];
            tetMesh.edgesCount = edgesCount;
            for (int i = 0; i < edgesCount; i++)
            {
                tetMesh.edges[i] = edgesOut[i];
            }

            tetMesh.trianglesCount = facesCount;
            tetMesh.triangles = new Triangle[facesCount];
            for (int i = 0; i < facesCount; i++)
            {
                tetMesh.triangles[i] = facesOut[i];

            }

            tetMesh.tetrasCount = tetrasCount;
            tetMesh.tetras = new Tetrahedron[tetrasCount];
            for (int i = 0; i < tetrasCount; i++)
            {
                tetMesh.tetras[i] = tetrasOut[i];
            }

            //NODES GENERATING
            if (generateNodes && nodePrefab != null)
            {
                Rigidbody[] rigidbodies = new Rigidbody[tetMesh.pointsCount];

                PhysXMassSpringModel physXmsm = go.AddComponent<PhysXMassSpringModel>();
                physXmsm.m_rigidBodiesCount = nodesCount;

                physXmsm.m_rigidBodies = rigidbodies;
                physXmsm.m_stiffness = springKs;
                physXmsm.m_damping = springKd;

                PhysXMeshUpdater softMesh = go.AddComponent<PhysXMeshUpdater>();

                for (int i = 0; i < tetMesh.pointsCount; i++)
                {
                    GameObject nodeGO = PrefabUtility.InstantiatePrefab(nodePrefab) as GameObject;
                    nodeGO.transform.position = tetMesh.nodesPositions[i];

                    nodeGO.name = newName+"Node_" + i;
                    nodeGO.transform.parent = tetMesh.transform;

                    rigidbodies[i] = nodeGO.GetComponent<Rigidbody>();

                }

                if (generateSpringJoints)
                {
                    SpringJoint[] springJoints = new SpringJoint[tetMesh.edgesCount];

                    for (int i = 0; i < tetMesh.edgesCount; i++)
                    {
                        Link link = tetMesh.edges[i];

                        int idA = link.idA;
                        int idB = link.idB;

                        Rigidbody rbA = rigidbodies[idA].GetComponent<Rigidbody>();
                        Rigidbody rbB = rigidbodies[idB].GetComponent<Rigidbody>();

                        SpringJoint sj = rbA.gameObject.AddComponent<SpringJoint>();
                        sj.connectedBody = rbB;
                        sj.spring = springKs;
                        sj.damper = springKd;

                        springJoints[i] = sj;
                    }
                    physXmsm.m_springsCount = edgesCount;
                    physXmsm.m_springJoints = springJoints;
                }
            }

            //MESH GENERATING
            MeshFilter meshFilter = go.AddComponent<MeshFilter>();
            MeshRenderer meshRenderer = go.AddComponent<MeshRenderer>();

            Material mat = new Material(Shader.Find("Diffuse"));
            mat.name = this.newName + "Mat";
            meshRenderer.material = mat;

            meshFilter.sharedMesh = this.inputMesh;
            meshFilter.sharedMesh.MarkDynamic();

            if (addMeshCollider)
            {
                MeshCollider mc = go.AddComponent<MeshCollider>();
                mc.sharedMesh = this.inputMesh;
            }

            //   if (deletePrevious && previousGameObject != null)
            //       DestroyImmediate(previousGameObject, false);

            previousGameObject = go;
            Selection.objects = new Object[]{go};
            Debug.Log("TetGen: "+nodesCount +" nodes, "+edgesCount +" links, "+facesCount +" faces, " +tetrasCount +" tetras.");

            this.Close();
        }
Пример #2
0
 public static extern int Tetrahedralize2(Vector3[] vertices, int verticesCount, int[] triangles, int trianglesCount, float[] nodes, out int nodesCount, Link[] links, out int linksCount, Triangle[] tris, out int trisCount, Tetrahedron[] tetras, out int tetrasCount);