ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

Unityでの回転の罠

Unityで、振り子のような挙動をするはずのモデルを作ったんだけど重力が働いていないような、無重力のような挙動をされて一晩はまってしまった。以下モデルの構成と現象、原因、対策。

モデルの構成

2つのGameObjectからなるモデル。一方のObject Aは空間に固定され、もう一方のObject Bは回転系のJointを介してObject Aにつながっている。挙動はHingeJoint, ConfigurableJointのどちらでも同じ。Jointの回転LimitはFree、つまり制約なし。

各ObjectにはTransform, RigidBodyとJointが含まれる。またMeshを有する子オブジェクトがある。

現象

Object Bには回転軸の制約がないので、重力により振り子のような挙動をするはず。なのに、やたらゆっくりとした動きをする。まるで重力が無いか、小さいように見える。

原因

近くにボールを置いてみたが、ボールはそれっぽい速さで落ちていった。故に重力は問題なし。となると慣性モーメントしか原因が無いのでぐぐってみると、Unityでは慣性モーメントを自動計算または手動設定できるが、自動計算する場合はColliderの形状を援用することが判明。今回のモデルではColliderを設定していなかったため、慣性モーメントを正しく自動計算出来ていなかったのだろうと推測し、試したところ大成功。以下、Collider有無で挙動がどう変わるかの動画。

youtu.be

対策

回転対称の大まかな形状に沿ったColliderを作る。