RigidBodyのAddTorque、AddForceには、第二引数にForceModeを指定することができる。
ForceMode2Dでは、ForceとImpulseの2種類を指定可能。
ForceModeの方では、これにAcceleration、VelocityChangeの2種が加わり4種類になる。
これらの大体の挙動については、ちょっとネットを走ればすぐ分かる。
分からなかったのは、具体的にどう値に影響するのか、ということだ。
そこで今回知りたかったRigidbody2DのAddTorque、ForceMode2Dについて調べてみることにした。
肝心のリファレンスにはインスタントフォースインパルスだのインスタント速度変化だのよく分からない言葉が鎮座している。なんだインスタントフォースインパルスって。ググるとかなりフォースインパルスガンダムが出てくる。
さっとググって答えが出なかったので、検証。
まずForceMode2D.Impulse。
トルク1
慣性モーメント0.79
角加速度α[rad/(s^2)]=トルク / 慣性モーメントにより
導かれるα=12.546[rad/(s^2)]
一方FixedUpdateによる一回のAddTorque(1f, ForceMode2D.Impulse)で角速度の増分Δωは718.87 [度/s]
度からrad変換で12.546[rad/s]となり一致。
つまりForceMode2D.ImpulseでAddTorqueの場合では、1回の実行につき角速度に角加速度1秒分の速度が加算される。
Δω[rad/s] = α[rad/(s^2)] * 1[s]
続いてForceMode2D.Forceも調べる。
トルク、慣性モーメントは先程と同じにつき、
角加速度α=12.546[rad/(s^2)]
FixedUpdateによる一回のAddTorque(1f, ForceMode2D.Force)で角速度の増分Δω[rad/s]は14.377[度]
働いた時間を知るため度に変換したαで割ると0.019999....[s] いろいろ誤差考えると0.02[s]なんだろな。
これは検証時に設定していたFixed TimeStepの値0.02[s]に一致する。
つまりForceMode2D.ForceでAddForceの場合では、一回の実行につき角速度に角加速度のFixed TimeStep分の速度が加算される。
Δω[rad/s] = α[rad/(s^2)] * Fixed TimeStep[s]
リファレンスの、"インスタント"とかいうのが表すのは、一秒分の、ってことだろうか。
とにかく、このガサツな検証によると、確かにFixedUpdateで毎回継続的にトルクを加えるとすると、トルク通りの挙動をしてくれるのはForceMode2D.Forceということになる。
3Dの場合、AddForceの場合でも、多分こんな感じなのではなかろうか。
VelocityChange、Accelerationについては、質量を無視するという前提が付いたうえで、それぞれImpulse、Forceのような挙動をとるのではなかろうか。
使う予定ないので憶測だけにする。
で、一秒分の増分は。衝突の時とかそういう瞬間的なとかあったけど一秒分でやる理由がよくわかんないです。物理を詳しく勉強する必要があるかもわからんね。
最後に予防線。 この検証はUnity 5.1.2f1で確認したものです。
サンプル一件で何となく行った検証なので、結果については無保証です!