Come si cambia manualmente una palla scorrevole in una palla rotolante in Unity 3D?
Sono un po 'nuovo in questo, quindi qualsiasi aiuto sarà apprezzato.
Contesto: sto creando un gioco di biliardo in VR simulato e sto cercando di rendere la fisica il più realistica possibile. Ho una bilia battente che viene colpita con una stecca su una superficie con valori di attrito accurati calcolati da prove del mondo reale.
Problema: la bilia battente scorre più a lungo di quanto farebbe nel mondo reale. Realisticamente, quando la velocità raggiunge i 5/7 (~ 71%) della sua velocità iniziale, la palla passa dallo scivolamento al rotolamento. Tuttavia, in Unity, la transizione avviene molto più tardi, intorno al 20-10% della velocità iniziale. (questo è dovuto al modo in cui Unity calcola la fisica dell'interazione come punto di contatto piuttosto che come area di contatto)
Domanda: Voglio codificarlo in modo che quando la bilia battente perde 5/7 della sua velocità iniziale (al 71% * velocità iniziale), la velocità di scorrimento è impostata su 0 e la bilia battente continua a rotolare dalla sua velocità angolare. Teoricamente, è possibile? o cambiare la velocità / velocità a zero impedirà istantaneamente alla palla di muoversi al suo posto? E come faccio a farlo? Grazie in anticipo.
Risposte
Sembra che dovrebbe essere possibile, anche se non l'ho mai provato. Il codice seguente dovrebbe portarti alla maggior parte del percorso. È quindi possibile determinare attraverso la sperimentazione come regolare la velocità e la velocità angolare per ottenere l'effetto desiderato.
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 = //??
}
```