Bagaimana cara mengubah bola geser menjadi bola bergulir secara manual di Unity 3D?

Aug 16 2020

Saya sedikit baru dalam hal ini sehingga bantuan apa pun akan dihargai.


Konteks: Saya membuat simulasi permainan biliar VR dan mencoba membuat fisika serealistis mungkin. Saya memiliki bola isyarat yang dipukul dengan isyarat di permukaan dengan nilai gesekan akurat yang dihitung dari uji coba dunia nyata.


Masalah: Bola isyarat bergeser lebih lama dari pada saat meluncur di dunia nyata. Secara realistis, ketika kecepatan mencapai 5 / 7th (~ 71%) dari kecepatan awalnya, bola akan bertransisi dari meluncur ke menggelinding. Namun, dalam Unity, transisi terjadi lebih lama sekitar 20-10% dari kecepatan awal. (Ini karena bagaimana Unity menghitung fisika interaksi sebagai titik kontak daripada area kontak)


Pertanyaan: Saya ingin melakukan hard code sehingga ketika bola isyarat kehilangan 5/7 dari kecepatan awalnya (pada kecepatan awal 71% *), kecepatan geser disetel ke 0 dan bola isyarat terus menggelinding dari kecepatan sudutnya. Secara teoritis, apakah ini mungkin? atau akankah mengubah kecepatan / kecepatan menjadi nol secara instan menghentikan pergerakan bola di tempatnya? Dan bagaimana cara saya melakukan ini? Terima kasih sebelumnya.

Jawaban

1 Kevin Aug 18 2020 at 00:34

Kedengarannya ini mungkin, meskipun saya belum pernah mencobanya. Kode berikut akan membantu Anda sebagian besar jalan ke sana. Anda kemudian dapat menentukan melalui eksperimen cara menyesuaikan kecepatan dan kecepatan sudut untuk mencapai efek yang diinginkan.

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