【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験
- 2018.05.14
- Rigidbody
- AngularDrag, Rigidbody, Unity
Rigidbodyの中で、物体の回転に対する抵抗を設定できるのがAngularDrag。
今回はそのAngularDragの値を変化させて運動への影響を確認します。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
4月末にUnity2018が出てたので早速使ってみました。
Rigidbodyについて
Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。
ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。
今回はその中でもAngularDrag(回転の抵抗)がテーマ。
AngularDrag(回転の抵抗)について
Angularは「角度に関する」といった意味、Dragは「抵抗」とか、「引きずる」といった意味の言葉。Unity的には、回転に対する抵抗として使われます。
Angularの付いていないDragの方は、位置の変動に関する運動に対しての抵抗でした。AngularDragは、位置の変動にはノータッチだけども回転に関して抵抗を定義します。
くるくる回っているオブジェクトの回転が、だんだんと緩やかになるイメージです。
値を大きくすればするほど、減衰が大きくなります。設定値は無限大まで入力できますが、無限大にしたからといってすぐ止まるわけではありません。
すんごい細かい話ですが、Unityのマニュアルのプロパティ説明で項目名が『LinearDrag』になっています。実際の設定はAngularDragが正しいので、初見ではビビるかも。
ボールが転がる時の抵抗
物理特性マテリアルを使うと摩擦力を設定できますが、地面の上をボールが転がるときには摩擦力が働いてくれません。接してる面が小さすぎるからでしょうか。
なので、ボールの回転を減衰させることで、擬似的に摩擦力っぽい表現ができます。
用意したボールは以下の6種類。
- angularDrag : 0
- angularDrag : 0.5
- angularDrag : 1
- angularDrag : 2
- angularDrag : 5
- angularDrag : 10
angularDrag以外の値はRigidbodyをアタッチした時のデフォルトのものになっています。massはみんな1で、dragは0です。
質量や抵抗の時と同じように、ボタンを押すと全てのボールに同じ力が加わり、運動を開始するシーンを作って比較してみました。
ForceModeはImpulseとし、加えた力の大きさは画面左上に表示しています。
物理特性マテリアルによる摩擦力が働いてくれないSphereオブジェクトでも、angularDragによって回転を減衰させ、運動を停止させることができました。
値が小さければ止まりにくくなり、大きければ止まりやすくなります。angularDragが0だと止まらずにそのまま転がっていきます。
斜方投射の時のangularDrag
斜方投射のケースも見てみましょ。
AddForceで力を加えるときには、回転は付与されません。なので、斜方投射ではボールが地面に接触するまで減衰がないことに。
地面に接触するまではangularDragの値によらず横並び、接触後はangularDragの値に応じて減衰するはず。
うんうん、いい感じいい感じ。
転がってからの減衰は、上記の転がる時の動きと同じになってます。
トルクの減衰
angularDragの本領といえば回転の減衰。
今度は、立方体に回転を与え、その回転がangularDragによってどの程度減衰するのか見てみましょ。
回転を与える方法としてRigidbodyのAddTorqueを使います。AddForceと似ていて、こちらはトルクを加えるメソッド。
トルクは回転軸の周りにおける力のモーメントです。Unity的には、物体を回転させる力の大きさと向き、と考えておけばいいかな。
トルクが大きければよく回転しますし、トルクが小さければ回転も小さくなります。
今回は細かい話は抜きにして、とにかく立方体を回転させ、angularDragによって減衰する様子を眺めてみましょ。
……GIFがちょっと汚くなってますね。回転によって光の当たり方が変わり、それに伴って色も変化するため色数が足りなくなってます。
さて本題ですが、この例では質量を揃えてあるので、angularDragのみ影響するようになっています。回転の抵抗がなければangularDrag : 0のように回転するはず。
そんな中、値が大きいオブジェクトほどすぐに回転が止まっています。angularDrag : 10とか即停止レベル。
angularDragの影響は結構大きいですね。
上記のように、空中にあるオブジェクトを回転させ、angularDragによって減衰させる例を考えてみると、アクションゲームの中間ポイントの演出などに使えそう。
キャラクターがオブジェクトに触れたらAddTorqueで回転させて、angularDragによって自動的に停止させる感じで。
メインのオブジェクトに使うよりは、背景のオブジェクトに使うのがいいかな。
背景なら風力発電してる感じを出してもいいかも。一定時間おきにランダムでトルクを加えていけば、背景で風が吹いたような演出も可能です。
まとめ
RigidbodyのangularDragを変化させる実験でした。
回転に対する抵抗なので、オブジェクトが回転していない時には関係のない値です。dragは位置の移動に関する抵抗、angularDragは回転に対する抵抗と、使い分けが大事ですね。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RigidbodyのDrag(抵抗)を変えて水中を表現 2018.05.14
-
次の記事
【Unity】RigidbodyのUseGravity(重力の使用)を変えて実験 2018.05.15
コメントを書く