Как применить силу квадратичного сопротивления к телу в cannon.js? - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу применить силу перетаскивания к телу cannon.js , я пытался каким-то образом, но это нарушает физику, хотел знать, есть ли более правильный путь или кто-тоуже сделал нечто подобное.

Существует свойство тела, называемое linearDamping, это сила сопротивления, линейно пропорциональная скорости, однако я пытаюсь реализовать формулу силы сопротивления жидкости, чтобы добиться большего реализма..

Упрощенная формула такая, как вы можете видеть, она квадратично пропорциональна скорости:

Fd = - Constant * getMagnitude(velocity)**2 * normalize(velocity)

Я реализовал в cannon.js таким образом, используя методы Vec3 .Обратите внимание, что я называю applyDrag каждое обновление:

applyDrag(coefficient) {
  const speed = body.velocity.length()

  const dragMagnitude = coefficient * Math.pow(speed, 2)

  const drag = body.velocity.clone()
  drag.scale(-1, drag)

  drag.normalize()

  drag.scale(dragMagnitude, drag)

  body.applyLocalForce(drag, new CANNON.Vec3())
}

Однако этот сорт разбивается, и объекты сходят с ума.Есть ли лучший способ применить какой-нибудь quadraticDamping?

Это та часть, где применяется linearDamping , у меня возникают трудности с полным пониманием этого кода и попыткой реализоватьквадратичное демпфирование в правильном направлении.

1 Ответ

0 голосов
/ 27 сентября 2018

Решено!? Я не понял, что направление вектора силы также локально, вот решение:

applyDrag(coefficient) {
  const speed = body.velocity.length()

  const dragMagnitude = coefficient * Math.pow(speed, 2)

  const drag = body.velocity.clone()
  drag.scale(-1, drag)

  drag.normalize()

  drag.scale(dragMagnitude, drag)

  const centerInWorldCoords = body.pointToWorldFrame(new CANNON.Vec3())
  body.applyForce(force, centerInWorldCoords)
}
...