【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験

【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験

Rigidbodyの中で、物体の回転に対する抵抗を設定できるのがAngularDrag

今回はそのAngularDragの値を変化させて運動への影響を確認します。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

4月末にUnity2018が出てたので早速使ってみました。

Rigidbodyについて

Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。

ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。

今回はその中でもAngularDrag(回転の抵抗)がテーマ。

Rigidbodyのパラメータ
Rigidbodyのパラメータ

 

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とし、加えた力の大きさは画面左上に表示しています。

転がるボールのAngularDrag
転がるボールのAngularDrag

 

物理特性マテリアルによる摩擦力が働いてくれないSphereオブジェクトでも、angularDragによって回転を減衰させ、運動を停止させることができました。

値が小さければ止まりにくくなり、大きければ止まりやすくなります。angularDragが0だと止まらずにそのまま転がっていきます。

 

斜方投射の時のangularDrag

斜方投射のケースも見てみましょ。

AddForceで力を加えるときには、回転は付与されません。なので、斜方投射ではボールが地面に接触するまで減衰がないことに。

地面に接触するまではangularDragの値によらず横並び、接触後はangularDragの値に応じて減衰するはず。

斜方投射のAngularDrag
斜方投射のAngularDrag

 

うんうん、いい感じいい感じ。

転がってからの減衰は、上記の転がる時の動きと同じになってます。

トルクの減衰

angularDragの本領といえば回転の減衰。

今度は、立方体に回転を与え、その回転がangularDragによってどの程度減衰するのか見てみましょ。

回転を与える方法としてRigidbodyのAddTorqueを使います。AddForceと似ていて、こちらはトルクを加えるメソッド。

トルクは回転軸の周りにおける力のモーメントです。Unity的には、物体を回転させる力の大きさと向き、と考えておけばいいかな。

トルクが大きければよく回転しますし、トルクが小さければ回転も小さくなります。

今回は細かい話は抜きにして、とにかく立方体を回転させ、angularDragによって減衰する様子を眺めてみましょ。

回転の減衰
回転の減衰

 

……GIFがちょっと汚くなってますね。回転によって光の当たり方が変わり、それに伴って色も変化するため色数が足りなくなってます。

さて本題ですが、この例では質量を揃えてあるので、angularDragのみ影響するようになっています。回転の抵抗がなければangularDrag : 0のように回転するはず。

そんな中、値が大きいオブジェクトほどすぐに回転が止まっています。angularDrag : 10とか即停止レベル。

angularDragの影響は結構大きいですね。

上記のように、空中にあるオブジェクトを回転させ、angularDragによって減衰させる例を考えてみると、アクションゲームの中間ポイントの演出などに使えそう。

キャラクターがオブジェクトに触れたらAddTorqueで回転させて、angularDragによって自動的に停止させる感じで。

メインのオブジェクトに使うよりは、背景のオブジェクトに使うのがいいかな。

背景なら風力発電してる感じを出してもいいかも。一定時間おきにランダムでトルクを加えていけば、背景で風が吹いたような演出も可能です。

まとめ

RigidbodyのangularDragを変化させる実験でした。

回転に対する抵抗なので、オブジェクトが回転していない時には関係のない値です。dragは位置の移動に関する抵抗、angularDragは回転に対する抵抗と、使い分けが大事ですね。

アプリ公開までの攻略チャートを作りました!

CTA-IMAGE

「スマホ向けのアプリを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験から手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


アプリをリリースする観点から書いているので各アプリストア向けの作業が入っていますが、企画、設計、開発、テスト部分については他のプラットフォームでも使える知識が満載です。


無料で入手できるのでぜひお早めにゲットして、開発をブーストさせてください!