Unity 3Dでスライディングボールをローリングボールに手動で変更するにはどうすればよいですか?

Aug 16 2020

私はこれに少し慣れていないので、どんな助けでもありがたいです。


コンテキスト:シミュレートされたVRビリヤードゲームを作成し、物理学を可能な限り現実的にしようとしています。実世界のトライアルから計算された正確な摩擦値で、表面を横切るキューでキューボールが打たれています。


問題:キューボールは、現実の世界でスライドするよりも長くスライドします。現実的には、速度が初速度の5/7(〜71%)に達すると、ボールはスライドからローリングに移行します。ただし、Unityでは、遷移はかなり遅く、初速度の約20〜10%で発生します。(これは、Unityが相互作用の物理学を接触領域ではなく接触点として計算する方法によるものです)


質問:キューボールが初速度の5/7(71%*初速度)を失ったときに、スライド速度が0に設定され、キューボールが角速度から転がり続けるようにハードコーディングしたいと思います。理論的には、これは可能ですか?または、速度/速度をゼロに変更すると、ボールがその場所で移動するのを即座に停止しますか?そして、どうすればこれを行うことができますか?前もって感謝します。

回答

1 Kevin Aug 18 2020 at 00:34

私はそれを試したことがありませんが、これは可能であるはずのように聞こえます。次のコードは、ほとんどの方法でそこに到達するはずです。次に、実験を通じて、速度と角速度を調整して目的の効果を実現する方法を決定できます。

private Rigidbody body;

void Start() {
    body = GetComponent<Rigidbody>();
}

void OnCollisionEnter(Collision collision) {
    StartCoroutine(SlideThenRoll());
}

IEnumerator SlideThenRoll() {
    yield return null; //wait a frame to make sure our velocity updates
    float initialSpeed = body.velocity.magnitude;
    float targetSpeed = .71 * initialSpeed;
    yield return new WaitUntil(() => body.velocity.magnitude <= targetSpeed);

    //you'll need to fill in this part
    body.velocity = //??
    body.angularVelocity = //??
}
```