Làm cách nào để thay đổi thủ công một quả bóng trượt thành một quả bóng lăn trong Unity 3D?

Aug 16 2020

Tôi là một chút mới với điều này vì vậy mọi sự giúp đỡ sẽ được đánh giá cao.


Bối cảnh: Tôi đang tạo một trò chơi bi-a VR mô phỏng và cố gắng làm cho vật lý càng chân thực càng tốt. Tôi có một bi cái bị đánh bằng một cái bi trên bề mặt với các giá trị ma sát chính xác được tính toán từ các thử nghiệm trong thế giới thực.


Vấn đề: Bi cái trượt lâu hơn những gì nó sẽ trượt trong thế giới thực. Thực tế, khi vận tốc đạt tới 5/7 (~ 71%) vận tốc ban đầu của nó, quả bóng chuyển từ trượt sang lăn. Tuy nhiên, trong Unity, quá trình chuyển đổi xảy ra muộn hơn nhiều ở khoảng 20-10% vận tốc ban đầu. (điều này là do Unity tính toán vật lý của sự tương tác như một điểm tiếp xúc chứ không phải là một khu vực tiếp xúc)


Câu hỏi: Tôi muốn đặt mã cứng để khi bi cái mất đi 5/7 vận tốc ban đầu (ở 71% * vận tốc ban đầu), vận tốc trượt được đặt bằng 0 và bi cái tiếp tục lăn từ vận tốc góc của nó. Về mặt lý thuyết, điều này có khả thi không? hay việc thay đổi vận tốc / tốc độ bằng 0 sẽ ngay lập tức ngăn quả bóng chuyển động đúng vị trí của nó? Và làm thế nào để tôi làm điều này? Cảm ơn trước.

Trả lời

1 Kevin Aug 18 2020 at 00:34

Điều này nghe có vẻ như là có thể, mặc dù tôi chưa bao giờ thử nó. Đoạn mã sau sẽ giúp bạn thực hiện hầu hết các bước ở đó Sau đó, bạn có thể xác định thông qua thử nghiệm cách điều chỉnh vận tốc và vận tốc góc để đạt được hiệu quả mong muốn.

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