Unity 3D'de kayan bir topu elle yuvarlanan bir topa nasıl değiştirebilirim?

Aug 16 2020

Bu konuda biraz yeniyim, bu yüzden herhangi bir yardım takdir edilecektir.


Bağlam: Simüle edilmiş bir VR bilardo oyunu yaratıyorum ve fiziği olabildiğince gerçekçi hale getirmeye çalışıyorum. Gerçek dünya denemelerinden hesaplanan doğru sürtünme değerleri ile bir yüzey boyunca bir isteka ile vurulan bir isteka topum var.


Sorun: Bilardo topu gerçek dünyada kayabileceğinden daha uzun süre kayıyor. Gerçekçi olarak, hız başlangıç ​​hızının 5 / 7'sine (~% 71) ulaştığında, top kaymadan yuvarlanmaya geçiş yapar. Bununla birlikte, Unity'de geçiş çok daha sonra, başlangıç ​​hızının yaklaşık% 20-10'u civarında gerçekleşir. (bu, Unity'nin etkileşim fiziğini bir temas alanı yerine bir temas noktası olarak nasıl hesapladığından kaynaklanmaktadır)


Soru: Bilardo topu başlangıç ​​hızının 5 / 7'sini kaybettiğinde (% 71 * başlangıç ​​hızında) kayma hızı 0'a ayarlanacak ve isteka topu açısal hızından yuvarlanmaya devam edecek şekilde kodlamak istiyorum. Teorik olarak, bu mümkün mü? yoksa hızı / hızı sıfıra çevirmek, topun yerinde hareket etmesini anında durdurur mu? Ve bunu nasıl yapacağım? Şimdiden teşekkürler.

Yanıtlar

1 Kevin Aug 18 2020 at 00:34

Hiç denememiş olsam da bu mümkün olmalı gibi görünüyor. Aşağıdaki kod sizi oraya en iyi şekilde götürmelidir. Ardından, deney yaparak, istenen etkiyi elde etmek için hızı ve açısal hızı nasıl ayarlayacağınızı belirleyebilirsiniz.

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