ฉันจะเปลี่ยนลูกเลื่อนเป็นลูกบอลกลิ้งใน Unity 3D ด้วยตนเองได้อย่างไร
ฉันเป็นมือใหม่เล็กน้อยสำหรับสิ่งนี้ดังนั้นจะได้รับความช่วยเหลือใด ๆ
บริบท:ฉันกำลังสร้างเกมบิลเลียด VR จำลองและพยายามทำให้ฟิสิกส์สมจริงที่สุด ฉันมีไม้คิวที่ตีด้วยไม้คิวบนพื้นผิวที่มีค่าความเสียดทานที่แม่นยำซึ่งคำนวณจากการทดลองในโลกแห่งความเป็นจริง
ปัญหา:ลูกคิวสไลด์นานเกินกว่าที่จะเลื่อนในโลกแห่งความเป็นจริง ตามความเป็นจริงเมื่อความเร็วถึง 5 / 7th (~ 71%) ของความเร็วเริ่มต้นลูกบอลจะเปลี่ยนจากการเลื่อนเป็นกลิ้ง อย่างไรก็ตามใน Unity การเปลี่ยนแปลงจะเกิดขึ้นในภายหลังโดยประมาณ 20-10% ของความเร็วเริ่มต้น (นี่คือสาเหตุที่ Unity คำนวณฟิสิกส์ของปฏิสัมพันธ์ในฐานะจุดสัมผัสแทนที่จะเป็นพื้นที่สัมผัส)
คำถาม:ฉันต้องการฮาร์ดโค้ดเพื่อที่ว่าเมื่อลูกคิวสูญเสีย 5 ใน 7 ของความเร็วเริ่มต้น (ที่ 71% * ความเร็วเริ่มต้น) ความเร็วในการเลื่อนจะถูกตั้งค่าเป็น 0 และลูกคิวยังคงหมุนจากความเร็วเชิงมุม ในทางทฤษฎีเป็นไปได้หรือไม่? หรือจะเปลี่ยนความเร็ว / ความเร็วเป็นศูนย์หยุดลูกบอลไม่ให้เคลื่อนที่เข้าที่ทันที? แล้วฉันจะไปทำสิ่งนี้ได้อย่างไร? ขอบคุณล่วงหน้า.
คำตอบ
ดูเหมือนจะเป็นไปได้แม้ว่าฉันจะไม่เคยลอง รหัสต่อไปนี้จะช่วยให้คุณได้รับประโยชน์สูงสุดจากที่นั่น จากนั้นคุณสามารถพิจารณาได้จากการทดลองว่าจะปรับความเร็วและความเร็วเชิงมุมอย่างไรเพื่อให้ได้ผลตามที่ต้องการ
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 = //??
}
```