मैं स्वयं एक फिसलने वाली गेंद को यूनिटी 3 डी में रोलिंग बॉल में कैसे बदलूं?

Aug 16 2020

मैं इसके लिए थोड़ा नया हूँ इसलिए किसी भी मदद की सराहना की जाएगी।


संदर्भ: मैं एक नकली वीआर बिलियर्ड गेम बना रहा हूं और भौतिकी को यथासंभव यथार्थवादी बनाने की कोशिश कर रहा हूं। मेरे पास एक क्यू बॉल है जिसे वास्तविक विश्व परीक्षणों से गणना की गई सटीक घर्षण मूल्यों के साथ सतह पर एक क्यू के साथ मारा जा रहा है।


समस्या: क्यू बॉल अधिक देर तक स्लाइड करती है कि वह वास्तविक दुनिया में क्या करेगी। वास्तविक रूप से, जब वेग अपने प्रारंभिक वेग के 5/7 वें (~ 71%) तक पहुंच जाता है, तो गेंद के फिसलने से रोलिंग तक संक्रमण होता है। हालांकि, एकता में, संक्रमण प्रारंभिक वेग के लगभग 20-10% पर बहुत बाद में होता है। (यह इस कारण से है कि एकता संपर्क के भौतिकी को संपर्क के एक क्षेत्र के बजाय संपर्क के बिंदु के रूप में कैसे आंकती है)


प्रश्न: मैं इसे हार्ड कोड करना चाहता हूं ताकि जब क्यू बॉल अपने शुरुआती वेग (vel१% * प्रारंभिक वेग) पर ५ / hard वीं हार जाए, तो स्लाइडिंग वेग 0 पर सेट हो जाए और क्यू गेंद अपने कोणीय वेग से लुढ़कती रहे। सैद्धांतिक रूप से, क्या यह संभव है? या वेग / गति को शून्य में बदलने से गेंद को तुरंत उसके स्थान पर जाने से रोका जा सकेगा? और मैं यह करने के बारे में कैसे जाना है? अग्रिम में धन्यवाद।

जवाब

1 Kevin Aug 18 2020 at 00:34

ऐसा लगता है कि यह संभव होना चाहिए, हालांकि मैंने कभी इसकी कोशिश नहीं की है। निम्नलिखित कोड आपको वहां अधिकांश तरीके से प्राप्त करना चाहिए। आप तब प्रयोग के माध्यम से निर्धारित कर सकते हैं कि वांछित प्रभाव को प्राप्त करने के लिए वेग और कोणीय वेग को कैसे समायोजित किया जाए।

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