夜風のMixedReality

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

Unityで任意の2点の座標を結ぶようにシリンダーオブジェクトを配置する

本日はUnity枠です。

Unityで線を再現する際はLineRendererなどを使用することができます。

 しかし今回は筆者の都合でシリンダーを使用して2点の座標を結ぶようにオブジェクトを配置してラインを引きたかったため今回は任意の2点を結ぶようにシリンダーオブジェクトを配置してラインを引くように実装していきます。

〇シリンダーの特性

 シリンダーはUnityエンジンでプリミティブな3Dオブジェクトして提供されています。 特徴として、デフォルトの大きさ(正規化されている状態)で幅1m高さが2mと決まっています。

 また原点が底面からY軸に1mの位置にあります。

 シリンダーをラインとして使用するときに原点の位置と原点に対して高さが決まっている場合、ラインを引きたい2点の中点にシリンダーを配置し回転とスケールを調整することで正確なラインを引くことができます。

〇コード

今回は拡張性を考えて2点のオブジェクトを直接代入するのではなく配列を使用することにしました。

lineはシリンダーのオブジェクトを配置する想定です。

    [SerializeField] GameObject[] point;
        [SerializeField] private GameObject line;
        // Start is called before the first frame update
        void Start()
        {
           Wireframe();
        }

        public void Wireframe()
        {
            line.transform.position = (point[0].transform.position + point[1].transform.position) / 2;
            line.transform.LookAt(point[1].transform.position);
            line.transform.localScale = new Vector3(0.01f, 0.01f, Vector3.Distance(point[0].transform.position, point[1].transform.position));
        }

処理は3つの工程で、2つのpointの中点座標を検出し配置、LookAtでシリンダーの向きを調整、最後にシリンダーの長さをDistance関数を使用して2つのpointの座標の距離を取得しスケールを合わせています。

 以上の処理によって2つの座標を結ぶようにシリンダーオブジェクトを配置することができます。

今回はからオブジェクトのにスクリプトをアタッチし、子オブジェクトにPoint1,Point2とからのオブジェクトを2つ配置しました。

実行すると次のように2点をつなぐようにシリンダーが配置されます。

 MRTKに提供されているToolTip機能のようにあるオブジェクトから別の座標に対して表示するUIなども同様の原理で実装されているもの、もしくはもっと軽量な処理で実装しているものと思われます。

 今回は自分で試行してやってみましたが、応用すれば非常に様々な表現ができそうです。

本日は以上です。