¿Cómo cambio manualmente una bola deslizante en una bola rodante en Unity 3D?

Aug 16 2020

Soy un poco nuevo en esto, por lo que cualquier ayuda será apreciada.


Contexto: Estoy creando un juego de billar de realidad virtual simulado e intento que la física sea lo más realista posible. Tengo una bola blanca que se golpea con un taco en una superficie con valores de fricción precisos calculados a partir de pruebas del mundo real.


Problema: La bola blanca se desliza más de lo que se deslizaría en el mundo real. Siendo realistas, cuando la velocidad alcanza el 5/7 (~ 71%) de su velocidad inicial, la bola pasa de deslizarse a rodar. Sin embargo, en Unity, la transición ocurre mucho más tarde a alrededor del 20-10% de la velocidad inicial. (esto se debe a cómo Unity calcula la física de la interacción como un punto de contacto en lugar de un área de contacto)


Pregunta: Quiero codificarlo de modo que cuando la bola blanca pierda 5/7 de su velocidad inicial (al 71% * velocidad inicial), la velocidad de deslizamiento se establezca en 0 y la bola blanca continúe rodando desde su velocidad angular. Teóricamente, ¿es esto posible? ¿O el cambio de velocidad / rapidez a cero impedirá instantáneamente que la bola se mueva en su lugar? ¿Y cómo hago para hacer esto? Gracias por adelantado.

Respuestas

1 Kevin Aug 18 2020 at 00:34

Parece que debería ser posible, aunque nunca lo he probado. El siguiente código debería llevarlo a la mayor parte del camino. Luego, podría determinar a través de la experimentación cómo ajustar la velocidad y la velocidad angular para lograr el efecto deseado.

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 = //??
}
```