Como faço para transformar manualmente uma bola deslizante em uma bola rolante no Unity 3D?

Aug 16 2020

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

1 Kevin Aug 18 2020 at 00:34

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