Table of Contents
Unity に取り込んだ3Dモデル(メッシュ)のピボット(重心)位置を変更する方法についてです。
ヒエラルキー上で空のオブジェクトを作り、それをメッシュの親として設定することで擬似的にピボットをずらすことは可能ですが、場合によってはメッシュそのもののピボットを変えたいことがあります。
そんなときは Unity Asset Store で公開されているあるアセットと、ちょっとしたEditorスクリプトを作って組み合わせることで実現可能です。
メッシュのピボット位置を任意の位置に変更できるアセット
まずメッシュのピボット位置を変えられる無料のアセットとその使い方を紹介します。
アセット名は「Adjust Pivot」です。その名の通り、簡単操作でピボット位置を調節可能です。
Adjust Pivot | Utilities Tools | Unity Asset Store
例として、以下のようなポールコーンのモデルのピボット位置を変えてみます。
現在は底面にあるピボット位置を適当に変えるための準備をします。
アセット使用のための準備
ポールコーンの子要素に空のオブジェクトを追加し、この位置を新しいピボットとしたい位置まで移動させます。
準備はこれだけです。
Adjust Pivot の使い方
上記アセットをストアから Unity にインポートしていれば、メニューの Window 内に Adjust Pivot という項目が増えているはずです。
これを選択してアセットを起動してから、ポールコーン(ピボットを変えたいメッシュを持つオブジェクト)の子要素とした空のオブジェクトを選択すると、以下のような画面になります。
「Move TrafficCone’s pivot here」というボタンが押せる状態になります。
これを押すと、親要素であるポールコーンのピボットが選択している子要素と全く同じ位置に変更されます。
変更後は、子要素とした空のオブジェクトを削除して構いません。
基本的な使い方は以上になります。
Prefab で再利用するための手順
もしピボットを変更したオブジェクトを Prefab として保存して再利用したい場合は、もうひとつ手順が必要になります。
このピボット位置が変更された新たなメッシュデータをファイル(.asset)として保存する必要があるのです。これもアセットで行ってくれます。
ピボット変更後のオブジェクトを選択すると、画面内の以下の赤枠をつけたボタンが押せるようになります。これでデータを Assets ディレクトリ内に保存してください。
メッシュの中心にピボットを変更したいときは
「Adjust Pivot」は非常に便利なアセットですが、残念ながら、デフォルトではメッシュの中心位置を検出してくれる機能はありません。
そこで、メッシュの中心位置に子要素を配置するためのEditorスクリプトを自作し、作業を楽にする方法を紹介します。
以下のC#スクリプトを Editor ディレクトリ内に保存してください。
MoveToCenterOfParent.cs
using UnityEditor; using UnityEngine; public class MoveToCenterOfParent : MonoBehaviour { [MenuItem("MyTools/Move To Center Of Parent")] public static void MoveToCenter() { Transform parent = Selection.activeTransform.parent; if (parent == null) { Debug.LogError("No Parent Found"); return; } Renderer renderer = parent.GetComponent<Renderer>(); if (renderer == null) { Debug.LogError("No Renderer Found"); return; } print("Old Pos: " + Selection.activeTransform.position); Selection.activeTransform.position = renderer.bounds.center; print("New Pos: " + Selection.activeTransform.position); } }
これは、選択したオブジェクトの親要素のレンダラーからその中心位置を割り出し、選択したオブジェクトをその位置に移動させるスクリプトです。
メニューの MyTools > Move To Center Of Parent から実行可能です(任意の名前に変更して大丈夫です)。
これをピボット位置を設定するために作る空のオブジェクトに対して実行すると、親のメッシュの中心位置に自動的に移動してくれます。
スクリプト実行後に上記の手順でアセットを利用してピボット位置を変更すれば、中心をピボットとする新たなメッシュを作成することが可能です。
以上、3Dモデル(メッシュ)のピボット位置を中心に変える方法についてでした。