以下の内容はhttps://hacchi-man.hatenablog.com/entry/2025/03/06/220000より取得しました。


【Unity】四面体分割法を用いたメッシュの体積計算

3Dゲーム開発において、メッシュの体積を求めることは、物理シミュレーションやゲームロジックにおいて重要な要素となります。 本記事では、Unityで四面体分割法(Tetrahedral Decomposition Method)を使用して、メッシュの体積を計算する方法を解説します。

四面体分割法とは?

四面体分割法とは、3Dメッシュを原点と三角形の頂点を結ぶ四面体に分割し、それぞれの体積を計算する手法です。これにより、複雑な形状の体積も正確に求めることができます。

四面体分割法の流れ

メッシュの各三角形を取得

3Dオブジェクトのメッシュは複数の三角形で構成されています。

各三角形を原点と結んで四面体を作成

各三角形の3点と原点を使って四面体を形成します(上の画像のような形)。

四面体の体積を計算

四面体の体積は、以下の式で求められます:

すべての四面体の体積を合計

最後に、全ての四面体の体積を足し合わせることで、メッシュ全体の体積を得ることができます。

Unityでの実装

UnityのC#スクリプトでメッシュの体積を計算するためには、以下のメソッドになります

public static float CalculateMeshVolume(Mesh mesh)
{
    float volume = 0f;
    Vector3[] vertices = mesh.vertices;
    int[] triangles = mesh.triangles;

    // 各三角形について体積の寄与を計算
    for (int i = 0; i < triangles.Length; i += 3)
    {
        Vector3 v0 = vertices[triangles[i + 0]];
        Vector3 v1 = vertices[triangles[i + 1]];
        Vector3 v2 = vertices[triangles[i + 2]];

        // 原点を含む四面体の体積を計算
        volume += Vector3.Dot(v0, Vector3.Cross(v1, v2)) / 6f;
    }
    return Mathf.Abs(volume);
}

もしオブジェクトの Scale を考慮する場合は以下のようになります また cm³ にする場合は 1000000 (100³) をかけることで変換できます

MeshFilter meshFilter = GetComponent<MeshFilter>();
if (meshFilter != null && meshFilter.mesh != null)
{
    float volume = CalculateMeshVolume(meshFilter.mesh);
    var scaleFactor = transform.localScale.x * transform.localScale.y * transform.localScale.z;
    volume *= scaleFactor;
    Debug.Log("Mesh Volume: " + volume);
}

実際に Unity のメッシュを利用して体積を計算

確認してみたところ、以下のような結果になりました。
球体を含む形状ではメッシュの形状によって誤差が大きくなっていますが、概ね近い値が求められています。

Shape Scale 計算結果 (m³) 理論値 (m³)
Cube 1 0.9999999 1.0000
Cube 2 7.999999 8.0000
Sphere 1 0.5123354 0.5236
Sphere 2 4.098683 4.1900
Capsule 1 1.294622 1.3100
Capsule 2 10.35698 10.4700

※「計算結果」は Unity のメッシュを用いた体積計算値であり、「理論値」は数学的に求められる正確な体積値です。




以上の内容はhttps://hacchi-man.hatenablog.com/entry/2025/03/06/220000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14