ak備忘録

レガシーブログ

HingeJointについて

Unityのヒンジジョイントをいろいろ触っていて不可解なこととか色々あったけど
大体解決したのでまとめておこうと思います。

Hingeジョイントとは・・・
一番イメージしやすいのはドアとか。
剛体と剛体の間に一本の軸を作り、その軸で拘束(コンストレイン)する。

今回テストしたかったのはこういうもの。

http://keiro.iiyudana.net/Unity/PhysHinge/BuildWeb.html

下の黒いバーがドア、
スフィアが入ってくる人々みたいなイメージです。

下の黒いバーは重力をかけていません。
黒いバーと左のバーにヒンジジョイントをつけています。
ヒンジジョイントの軸はZ軸(0, 0, -1)です。
スフィアは重力がかかっているので落ちてきます。

まず最初にすべてのバーをCubeで作っていたのですが、
なんか思った通りにヒンジジョイントが働いてくれませんでした。

なんかヒンジジョイントの軸がずれてしまうイメージ。

なかなか言葉では言い表せないのですが、
これはダメだ・・・と思うレベル。

今回期待している動作としては、
「カウボーイがバーに入ってくるときにバン!って押して入ってくるあの扉」
の動作をやりたいです。

で、ここで一つポイント。

・剛体の回転軸は剛体に設定されているコリジョンに依存する

ヒンジジョイントをつけているから、そこを軸に勝手に回転してくれるのかな、
と思っていたのですが、そうではありませんでした。

今回の場合、XY軸は不要なのでフリーズさせてZ軸だけ有効にしていたのですが
普通のキューブで作ると回転軸がキューブの中心なので
いくらヒンジジョイントで軸を設定していてもきれいに回転してくれません。

なので、ヒンジジョイントの軸とは別に
そのオブジェクトの回転軸そのものが、そもそも重要です。

→解決方法:中心がキューブの中心ではなく、左端が中心のモデルを別に用意して
 そのモデルをコリジョンとして利用する。

これで、きれいに扉が開くようになりました。

で次の問題ですが、扉はきれいに開いたもののどこまでも開きつづけます。

→解決方法:回転量のリミット設定を行う

ヒンジジョイントに回転量のリミット指定があるので、
UseLimitsを有効にして設定します。

これで90度を限度に回せるようになりました。

で最後の問題ですが、扉は綺麗に開くしちゃんと90度で止まるんですが
扉がもとにもどらないという問題です。

→解決方法:ばね係数を指定する

UseSpringを有効にしてバネ係数を適当に設定します。
こうすることで扉を開くと自動的にもとに戻ってきます。

めでたしめでたし。