Comment changer manuellement une bille glissante en une bille roulante dans Unity 3D?

Aug 16 2020

Je suis un peu nouveau dans ce domaine, donc toute aide sera appréciée.


Contexte: je crée un jeu de billard en VR simulé et j'essaie de rendre la physique aussi réaliste que possible. J'ai une bille blanche frappée avec une queue sur une surface avec des valeurs de friction précises calculées à partir d'essais dans le monde réel.


Problème: la bille blanche glisse plus longtemps que ce qu'elle ferait dans le monde réel De manière réaliste, lorsque la vitesse atteint 5 / 7ème (~ 71%) de sa vitesse initiale, la balle passe du glissement au roulement. Cependant, dans Unity, la transition se produit beaucoup plus tard à environ 20-10% de la vitesse initiale. (cela est dû à la façon dont Unity calcule la physique de l'interaction comme un point de contact plutôt qu'une zone de contact)


Question: Je veux le coder en dur de sorte que lorsque la bille blanche perd 5 / 7ème de sa vitesse initiale (à 71% * vitesse initiale), la vitesse de glissement soit réglée sur 0 et la bille blanche continue à rouler à partir de sa vitesse angulaire. Théoriquement, est-ce possible? ou le fait de changer la vitesse / vitesse à zéro arrêtera-t-il instantanément la balle de bouger à sa place? Et comment dois-je procéder? Merci d'avance.

Réponses

1 Kevin Aug 18 2020 at 00:34

Cela semble être possible, même si je ne l'ai jamais essayé. Le code suivant devrait vous aider à y parvenir. Vous pouvez ensuite déterminer par expérimentation comment ajuster la vitesse et la vitesse angulaire pour obtenir l'effet souhaité.

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