Как вручную превратить скользящий мяч в катящийся в Unity 3D?
Я немного новичок в этом, поэтому любая помощь будет оценена.
Контекст: я создаю симуляцию бильярдной игры в виртуальной реальности и пытаюсь сделать физику как можно более реалистичной. У меня есть биток, по которому бьют кием по поверхности с точными значениями трения, рассчитанными на основе реальных испытаний.
Проблема: биток скользит дольше, чем в реальном мире. Реально, когда скорость достигает 5/7 (~ 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 = //??
}
```