Как вручную превратить скользящий мяч в катящийся в Unity 3D?

Aug 16 2020

Я немного новичок в этом, поэтому любая помощь будет оценена.


Контекст: я создаю симуляцию бильярдной игры в виртуальной реальности и пытаюсь сделать физику как можно более реалистичной. У меня есть биток, по которому бьют кием по поверхности с точными значениями трения, рассчитанными на основе реальных испытаний.


Проблема: биток скользит дольше, чем в реальном мире. Реально, когда скорость достигает 5/7 (~ 71%) от начальной скорости, мяч переходит от скольжения к качению. Однако в Unity переход происходит намного позже, примерно на 20–10% от начальной скорости. (это связано с тем, что Unity рассчитывает физику взаимодействия как точку контакта, а не как область контакта)


Вопрос: Я хочу жестко запрограммировать это так, чтобы, когда биток теряет 5/7 своей начальной скорости (при 71% * начальной скорости), скорость скольжения устанавливается на 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 = //??
}
```