Unity HingeJoint

Unity

前回はSpringJointを学習したが今回はHingeJointの理解を深めよう。ヒンジとはドアなどについている以下のような部品だ。

1軸に対して回転を行うことのできるパーツを作成することができる。
ドアはもちろんのことその性質をいかして振り子のような挙動も実現できる。
なかなかおもしろいコンポーネントなのでこの機会にしっかりと使えるようになってしまおう!

プロジェクトの作成

いつものように一緒に手を動かしていこう。まずは新規3Dプロジェクトを作成してHingeJointExというプロジェクトを作成しよう。

○新規にCubeを作成し、PositionのYに5を入力してRigidbodyを付与する。
その際、Use Gravityはオフにし、isKinematicをオンにする。isKinematicをオンにすることでこのオブジェクトは外部の物理的影響を受けなくなる。

○同じようにもう一つCubeを作成する。Rigidbodyを付与し、今回の主役であるHingeJointコンポーネントを付与する。ConnectedBodyに最初に作成したCubeを登録してみよう。

まずは最重要ポイントを押さえよう。ヒンジの回転軸となる部分が赤囲みによって設定されている。AnchorのYが0.5となっているのでこのキューブの上面でAxis(軸)がx軸に設定されている(よく見るとオレンジ色の矢印が描画されている)。

確認

実行して確認してみよう。シーンビューにしてz軸(青矢印)を動かしてみる。

設定された軸に対して回転することがわかった。

Connected Anchor

Connected Anchorの項目で先程確認した軸をどこに配置するかを決める。
試しに以下のようにConnected Anchor を上のCubeの中心に設定してみよう。

実行してみよう。軸の固定位置が上のキューブの原点に設定されたことがわかる。
2つのキューブに衝突判定がないのは他のジョイントと共通だ(EnableCollisionの設定で変更できる)

今度はAnchorを以下のように上方に移動する

実行してみよう。振り子動きが実現できている。このようにAnchorの位置はオブジェクトの見た目とは関係なく任意の位置に設定できる。

スプリング

扉を開けると自動的に閉まる仕組みがある。その仕組みの多くにはスプリングが使われている。

バネ付きヒンジを実装してみよう。以下のようにSpringを設定する。
TargetPositionは角度を入れる。(今回は見やすいように-90度にして手前にした)

実行してみよう。スプリングの力によってもとの位置に戻ろうとすることがわかる。
(バネの力はSpringの項目で設定できる)

これがもしドアの仕組みだったとしたらドアをくぐり抜けた途端にふっとばされてしまいそうだ。こういった時にはダンパーを設定する。以下のようにDamperを設定しよう。

実行してみよう。ダンパーの働きによって振動の速度がゆっくりになった。

Motor

先程はバネによって力を加えたが、モーターによって力を加えることもできる。
さっそくやってみよう。
Use Motorにチェックを入れ以下のように設定する。

実行してみよう。モーターの力によって回転が始まった。
Target Velocityは目標角速度(今回は1秒間に100度、360度にすると1秒で1周)
Forceはそれを実現するのに使えるMaxの力だ。なのでこの値が小さいと下向きの重力に勝てず回転させることはできない。

Free Spin

Free Spinという項目があるがこれはなんだろうか?その挙動を確かめるために以下のように回転速度を遅くしてみよう。

実行してみよう。

尺が長いのでポイントのみを抽出したが、注目してもらいたい部分は下りに差し掛かったところだ。実際には下向きに重力が働いているので下りのところではもっとスピードが出るはずだ。しかし、この状態はそうなってはいない、なぜならばMotorが反対方向に力を発生させてTarget Velocityに近づけているからだ。

Free SpinをON

では、Free Spinをオンにしてみよう。

実行してみよう。FreeSpinをオンにすると反対方向には力を発生させないので下りではかなり加速している。

なるべく一定速度で回転させたい場合にはFree Spinの項目はオフにしておいたほうが良さそうだ。

SpringとMotorを同時に設定した場合

ちなみに今回のようにUse SpringとUse Motorを同時にオンにした場合Spring設定は無視される。適用できるのはどちらか一つだ。

Limit

人間の関節や実際のドアなどには可動域があるが、HingeJointにも制限をつけることができる。
SpringやMotorを設定した場合もLimitは適用されるが今回はわかりやすいようにSpringとMotorのチェックを外そう。
稼働域を-30度~30度に制限する。

実行して、上のキューブの青矢印を動かしてみよう。

稼働域が-30度~30度に制限されたことがわかる

Bounciness

Limit値まで来たときの跳ね返り係数を設定できるのでやってみよう。
ここを最大の1に設定する。

先程と同じようにゆすってみると、跳ね返ることがわかる。

応用

さて、だいぶHingeJointについての理解ができたと思うのでいつものように簡単なプロジェクトを作成してみよう。

地面の追加

○新規Planeを作成する

○ボール台の作成
新規にCubeを作成し、以下のようにトランスフォームを設定する。

○ボールの作成
新規にSphereを作成し、トランスフォームを調整し、Rigidbodyを付与する。
飛びやすいようにMassを0.1にする。

以下のようになっていればOKだ

HingeJointの調整

以下のようにHingeJointを調整する

(ポイント解説)
○今回はz軸回転を行いたいのでAxisをzに変更
○ConnectedAnchorが0のままだとボール台に衝突してしまうので少し持ち上げる
○最初にUse SpringとUse Motorをオンにしておくと、まずはMotorが実行される。
その後スクリプトからUse Motor をオフにすればSpringが動きだすという仕掛けだ。

Cubeスクリプトの作成

以下のようにCubeスクリプトを作成し、Cube(1)にアタッチする。
スペースボタンを押すとuseMotorをオフにする簡単な処理だ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cube : MonoBehaviour
{
    void Update()
    {
        if(Input.GetButtonDown("Jump")) {
            HingeJoint hj = GetComponent<HingeJoint>();
            hj.useMotor = false;
        }
    }
}

○実行してみよう。モーターの力で自動的に持ち上がり、スペースボタンを押すとスプリングの力によってボールをふっとばす。

終わりに

今回はヒンジの動きをするHingeJointを学んだ。単純なドアなども作成できるがSpringやMotorも設定できるので今回のようなゴルフスイングのような挙動も実現できる。
アイディア次第で色々できるのでぜひ試してみてもらいたい。

Unity
スポンサーリンク
シェアする
mjpurinをフォローする

コメント

タイトルとURLをコピーしました