Como faço para transformar manualmente uma bola deslizante em uma bola rolante no Unity 3D?
Eu sou um pouco novo nisso, então qualquer ajuda será apreciada.
Contexto: Estou criando um jogo de bilhar de RV simulado e tentando tornar a física o mais realista possível. Eu tenho uma bola sendo atingida com um taco em uma superfície com valores de atrito precisos calculados a partir de testes do mundo real.
Problema: a bola branca desliza por mais tempo do que no mundo real. Realisticamente, quando a velocidade atinge 5/7 (~ 71%) de sua velocidade inicial, a bola passa de deslizar para rolar. No entanto, no Unity, a transição acontece muito mais tarde, em torno de 20-10% da velocidade inicial. (isso se deve a como o Unity calcula a física da interação como um ponto de contato em vez de uma área de contato)
Pergunta: Eu quero codificá-lo para que quando a bola branca perde 5/7 de sua velocidade inicial (a 71% * velocidade inicial), a velocidade de deslizamento é definida como 0 e a bola branca continua a rolar a partir de sua velocidade angular. Teoricamente, isso é possível? ou mudar a velocidade / velocidade para zero impedirá instantaneamente a bola de se mover em seu lugar? E como faço para fazer isso? Desde já, obrigado.
Respostas
Parece que deveria ser possível, embora eu nunca tenha tentado. O código a seguir deve ajudá-lo a chegar lá. Você pode então determinar por meio de experimentação como ajustar a velocidade e a velocidade angular para alcançar o efeito desejado.
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 = //??
}
```