人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

今日のUnity (4) 物体を動かす

今回は物理シミュレーションで物体に力を加えて動かす方法を試してみた。まあこれがないと面白そうなことが何もできないので・・・

物体を動かすには、オブジェクトの速度rigidbody.velocityを直接いじる方法があるが、リファレンスマニュアルによると物理的なリアリティに欠けるためおすすめされていない。でもジャンプ動作なんかはいいみたいね。

In most cases you should not modify the velocity directly, as this can result in unrealistic behaviour. Don't set the velocity of an object every physics step, this will lead to unrealistic physics simulation. A typical example where you would change the velocity is when jumping in a first person shooter, because you want an immediate change in velocity. リファレンス・マニュアル

かわりの方法としてRigidbody.AddForce()が使える。これは物体に力を加えることで加速度が発生し、その結果として物体が移動する。ニュートンの運動方程式

F = ma

だね。Fは物体に加える力、mは物体の質量、aは物体の加速度。このメソッドの第二引数にはForceModeというオプションがあって違いがわかりにくかったのでRigidBodyにAddForce()を行った場合のForceModeによる動作の違いをもとに検証してみた。

AddForceTest

大きいキューブが質量3、小さいキューブが質量1にしてある。左上のボタンで二つの物体に同時に力を加えられる。ボタンは下のForceModeのオプションの違いに対応している。Resetボタンを押すと初期状態に戻る。

Variables
Force 質量が反映する、連続的な力を加える
Acceleration 質量を考慮しない、連続的な加速を加える
Impulse 質量が反映する、瞬間的な力を加える
VelocityChange 質量を考慮しない、連続的な速度の変化を加える

http://docs-jp.unity3d.com/Documentation/ScriptReference/ForceMode.html

実際に押してみると移動の仕方が違うのがわかる。AccelerationとVelocityChangeは質量を無視するので大きな物体(質量3)も小さな物体(質量1)も同じ感じでぶっとぶのに対し、ForceとImpulseは質量を考慮するので大きな物体のほうが動きにくいことがわかる。連続的な力は「よいしょ、よいしょ」という感じで瞬間的な力は「はっ!」っていう感じがするね(笑)物理シミュレーションでは、ForceかImpulseを使った方がよさそう。

一応、ソースコード。