Расчет угловой скорости после столкновения

У меня линейная составляющая разрешения столкновений относительно неплохая, но я не могу понять, как сделать то же самое для угловой. Из того, что я прочитал, это что-то вроде ...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 относится к «нормальному столкновению».

Ответы на вопрос(1)

Ваш ответ на вопрос