夜風のMixedReality

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

Unityで2つのメッシュオブジェクトを一つの新たなメッシュに統合する

本日はUnity枠です。

Unityでは基本的にfbxやobjなどのファイルをインポートして3Dモデルを扱います。

メッシュの削減や改変は基本的にはUnityのワークフローではありませんが、Meshクラスのスクリプトを使用することで手動でメッシュの改変を行うことはでき舞うs。

今回はスクリプトで2つのメッシュを一つのメッシュに統合していきます。

〇コード

//Unity2022.3.5で動作確認
using UnityEngine;

public class MeshCombiner : MonoBehaviour
{
    void Start()
    {
        // 2つのメッシュを取得
        MeshFilter meshFilter1 = GameObject.Find("Mesh1").GetComponent<MeshFilter>();
        MeshFilter meshFilter2 = GameObject.Find("Mesh2").GetComponent<MeshFilter>();

        // メッシュを統合する
        CombineInstance[] combine = new CombineInstance[2];

        combine[0].mesh = meshFilter1.mesh;
        combine[0].transform = meshFilter1.transform.localToWorldMatrix;

        combine[1].mesh = meshFilter2.mesh;
        combine[1].transform = meshFilter2.transform.localToWorldMatrix;

        Mesh combinedMesh = new Mesh();
        combinedMesh.CombineMeshes(combine);

        // 統合されたメッシュを新しいオブジェクトに適用
        GameObject combinedObject = new GameObject("CombinedMesh");
        combinedObject.AddComponent<MeshFilter>().mesh = combinedMesh;
        combinedObject.AddComponent<MeshRenderer>().material = meshFilter1.GetComponent<MeshRenderer>().material;

        // 元のメッシュを非アクティブ
        meshFilter1.gameObject.SetActive(false);
        meshFilter2.gameObject.SetActive(false);
    }
}

このコードではシーン内のMesh1及びMesh2を一つのCombinedMeshという名前のオブジェクトに統合します。

Primitiveキューブとcapsuleを統合した新しいメッシュが生成される

〇CombineInstance

CombineInstanceはメッシュの統合を行うことができます。

角配列にはそれぞれ統合したいメッシュのデータが入り、最後に combinedMesh.CombineMeshes(Combineinstance[])の処理を実行することでメッシュが統合され新しいMeshオブジェクトが生成されます。

docs.unity3d.com

Meshの頂点や法線などから再生成すると思ってやってみましたが、意外と便利なメソッドのおかげで簡単に実現できました。

本日は以上です。