夜風のMixedReality

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

Unityであるオブジェクトの頂点ごとのワールド座標を取得する

本日はUnityの実験枠です。

Unityで配置したオブジェクトは通常Transformコンポーネントでオブジェクト全体の座標を確認することはできますが、オブジェクトを構成している頂点自体の情報を取得することはできません。

今回はUnityに配置したオブジェクトの頂点ごとのワールド座標を取得していきます。

〇コード

今回のコードは以下になります。

using UnityEngine;

public class VertexPositionPrinter : MonoBehaviour
{
    void Start()
    {
        // オブジェクトがMeshFilterを持っていることを確認
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        if (meshFilter == null)
        {
            Debug.LogError("can not find MeshFilter");
            return;
        }

        // Mesh情報を取得
        Mesh mesh = meshFilter.mesh;
        Vector3[] vertices = mesh.vertices;

        // ワールド座標に変換して頂点の位置を出力
        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 worldPosition = transform.TransformPoint(vertices[i]);
            Debug.Log("vertics" + i + "transform: " + worldPosition);
        }
    }
}

任意のオブジェクトにアタッチして実行することでコンソールにログが出力されます。

この処理ではオブジェクトのローカル座標ではなくワールド座標に依存して頂点の値を返します。

例えばオブジェクトのTransformをいじってみるとログの結果も移動した位置の頂点ごとの座標が取得できています。

 この処理としてはMeshFilterからmesh.verticesとして取得することで頂点の情報を取得しています。

 この頂点はxyzの座標であり、配列として提供されます。

 transform.TransformPoint(vertices[i])を使用することで頂点のワールド座標を取得できます。

 このメソッドはローカル座標をワールド座標に変換するメソッドです。

docs.unity3d.com

 本日は以上です。

 パフォーマンス的な懸念などはありますが、使い方によってはコライダーに依存しない判定などが行える可能性があります。