Расчет угловой скорости после столкновения
У меня линейная составляющая разрешения столкновений относительно неплохая, но я не могу понять, как сделать то же самое для угловой. Из того, что я прочитал, это что-то вроде ...torque
= point of collision
x linear velocity
, (перекрестный продукт) Я пытался включитьпример, который я нашел в мой код, но я на самом деле не вижу никакого вращения, когда объекты сталкиваются. Другая скрипка прекрасно работает с зачаточной реализацией теоремы о разделительной оси и вычислениями угловой скорости. Вот что я придумала ...
Определения свойств (ориентация, угловая скорость и угловое ускорение):
rotation: 0,
angularVelocity: 0,
angularAcceleration: 0
Расчет угловой скорости в реакции на столкновение:
var pivotA = this.vector(bodyA.x, bodyA.y);
bodyA.angularVelocity = 1 * 0.2 * (bodyA.angularVelocity / Math.abs(bodyA.angularVelocity)) * pivotA.subtract(isCircle ? pivotA.add(bodyA.radius) : {
x: pivotA.x + boundsA.width,
y: pivotA.y + boundsA.height
}).vCross(bodyA.velocity);
var pivotB = this.vector(bodyB.x, bodyB.y);
bodyB.angularVelocity = 1 * 0.2 * (bodyB.angularVelocity / Math.abs(bodyB.angularVelocity)) * pivotB.subtract(isCircle ? pivotB.add(bodyB.radius) : {
x: pivotB.x + boundsB.width,
y: pivotB.y + boundsB.height
}).vCross(bodyB.velocity);
Обновление ориентации в цикле обновления:
var torque = 0;
torque += core.objects[o].angularVelocity * -1;
core.objects[o].angularAcceleration = torque / core.objects[o].momentOfInertia();
core.objects[o].angularVelocity += core.objects[o].angularAcceleration;
core.objects[o].rotation += core.objects[o].angularVelocity;
Я бы опубликовал код, который у меня есть для вычисления моментов инерции, но есть отдельный код для каждого объекта, так что он будет немного ... длинным. Тем не менее, вот пример круга:
return this.mass * this.radius * this.radius / 2;
Просто чтобы показать результат, вот мойиграть на скрипке, Как показано, объекты не вращаются при столкновении. (не совсем видно с кругами, но оно должно работать для нуля и семи)
Что я делаю неправильно?
РЕДАКТИРОВАТЬ: Причина, по которой они вообще не вращались, была из-за ошибки с группами в функции ответа - она вращается сейчас, просто не правильно. Тем не менее, я прокомментировал это сейчас, поскольку это все портит.
Кроме того, я попробовал другой метод для вращения. Вот код в ответе:
_bodyA.angularVelocity = direction.vCross(_bodyA.velocity) / (isCircle ? _bodyA.radius : boundsA.width);
_bodyB.angularVelocity = direction.vCross(_bodyB.velocity) / (isCircle ? _bodyB.radius : boundsB.width);
Обратите внимание, чтоdirection
относится к «нормальному столкновению».