RigidBodyの自由落下を再現してみる

Unityの物理エンジンを使わずに、自前で簡単な物理演算を実装しようと思い、 まずはRigidBodyの自由落下を再現してみました。

using UnityEngine;

public class MyRigidBody : MonoBehaviour
{
    // 重力加速度[m/s/s]
    [SerializeField] private float _graviry = 9.80665f;

    // 速度[m/s]
    private Vector3 _velocity;

    private void FixedUpdate()
    {
        // [m/s] = [m/s/s] * [s]
        _velocity.y += -_graviry * Time.fixedDeltaTime;

        var p = transform.position;

        // [m] = [m/s] * [s]
        p += _velocity * Time.fixedDeltaTime;
        transform.position = p;
    }
}

物理演算を行う時は、Update関数よりも、更新間隔が安定しているFixedUpdate関数で行うのが望ましいです。 加速度と速度の両方にfixedDeltaTimeを掛けるのが重要なポイントです。単位を考えながら計算するとわかりやすいです。

f:id:fumobox:20201107155925p:plain
MyRigidBody

時間が経つと徐々にRightBodyと差が出てきますが、概ね同じ挙動になりました。 この誤差の原因を調べると深みにはまりそうなので、またそのうち…