¿Cómo cambio manualmente una bola deslizante en una bola rodante en Unity 3D?
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
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 = //??
}
```