夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unity内でメッシュを細分化する

本日はUnity枠です。

UnityはDCCツールというよりはゲームエンジンのためBlenderやMayaに比べて本格的な3Dモデル構築機能があるわけではありません。

しかしながらmeshクラスを扱うことでモデルの構築や、ProBuilderなどのツールを使用してUnity内でのモデリングを可能としています。

〇環境

・Windows11PC

・Unity2022.3.26f1

〇メッシュの細分化

 BlenderやMaya,ZBrushなどのDCCツールにはSubdivisionSurfaceなどのように呼ばれるメッシュを分割する機能が含まれています。

 Unityでメッシュの分割を行うことで、MeshColliderのメッシュを細かくするなど様々な使い方ができます。

今回はUnity内でランタイムにメッシュを分割する機能を実装します。

〇コード

今回はこのようなコードを書きました。

       public void SubDivideMesh()
        {
            Mesh _mesh = GetComponent<MeshFilter>().mesh;
            Vector3[] vertices = _mesh.vertices;
            int[] triangles = _mesh.triangles;
            List<Vector3> newVertices = new List<Vector3>();
            List<int> newTriangles = new List<int>();

            for (int i = 0; i < triangles.Length; i += 3)
            {
                Vector3 v0 = vertices[triangles[i]];
                Vector3 v1 = vertices[triangles[i + 1]];
                Vector3 v2 = vertices[triangles[i + 2]];

                Vector3 v01 = (v0 + v1) / 2;
                Vector3 v12 = (v1 + v2) / 2;
                Vector3 v20 = (v2 + v0) / 2;

                int i0 = newVertices.Count;
                newVertices.Add(v0);
                int i1 = newVertices.Count;
                newVertices.Add(v1);
                int i2 = newVertices.Count;
                newVertices.Add(v2);
                int i01 = newVertices.Count;
                newVertices.Add(v01);
                int i12 = newVertices.Count;
                newVertices.Add(v12);
                int i20 = newVertices.Count;
                newVertices.Add(v20);

                newTriangles.Add(i0);
                newTriangles.Add(i01);
                newTriangles.Add(i20);

                newTriangles.Add(i01);
                newTriangles.Add(i1);
                newTriangles.Add(i12);

                newTriangles.Add(i12);
                newTriangles.Add(i2);
                newTriangles.Add(i20);

                newTriangles.Add(i01);
                newTriangles.Add(i12);
                newTriangles.Add(i20);
            }

            _mesh.vertices = newVertices.ToArray();
            _mesh.triangles = newTriangles.ToArray();
            _mesh.RecalculateNormals();

            this.mesh = _mesh;
            this.vertices = _mesh.vertices;
            this.originalVertices = (Vector3[])this.vertices.Clone();
        }

ここでoriginalVerticesとはvertices = mesh.vertices;originalVertices = (Vector3[])vertices.Clone();であり、メッシュオブジェクトの持つ調点数になります

この処理は①メッシュの取得②頂点と三角形の取得③新しい頂点と三角形のリストの作成④三角形の細分化⑤新しいメッシュの作成⑥メッシュの更新という手順でメッシュを細分化しています。

この処理を実行することでもともとのメッシュから分割が入ります。

以上でUnity内でメッシュを細分化できました。

本日は以上です。