Cálculo da velocidade angular após uma colisão

Eu tenho o componente linear da resolução de colisão baixo relativamente bem, mas não consigo descobrir como fazer o mesmo com o angular. Pelo que li, é algo como ...torque = point of collision x linear velocity. (produto cruzado) tentei incorporar umexemplo que encontrei no meu código, mas na verdade não vejo nenhuma rotação quando os objetos colidem. O outro violino funciona perfeitamente com uma implementação rudimentar do teorema do eixo separado e dos cálculos de velocidade angular. Aqui está o que eu inventei ...

Definições de propriedade (orientação, velocidade angular e aceleração angular):

rotation: 0,
angularVelocity: 0,
angularAcceleration: 0

Cálculo da velocidade angular na resposta à colisão:

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);

Atualizando a orientação no loop de atualização:

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;

Eu publicaria o código que tenho para calcular os momentos de inércia, mas há um separado para cada objeto, de modo que seria um pouco ... longo. No entanto, aqui está o exemplo de um círculo:

return this.mass * this.radius * this.radius / 2;

Apenas para mostrar o resultado, aqui está o meuviolino. Como mostrado, os objetos não giram em colisão. (não exatamente visível com os círculos, mas deve funcionar para o zero e o sete)

O que estou fazendo errado?

EDIT: O motivo pelo qual eles não estavam girando foi devido a um erro nos grupos na função de resposta - ele gira agora, mas não está correto. No entanto, eu comentei isso por enquanto, pois isso atrapalha as coisas.

Além disso, tentei outro método para rotação. Aqui está o código na resposta:

_bodyA.angularVelocity = direction.vCross(_bodyA.velocity) / (isCircle ? _bodyA.radius : boundsA.width);
_bodyB.angularVelocity = direction.vCross(_bodyB.velocity) / (isCircle ? _bodyB.radius : boundsB.width);

Observe quedirection refere-se à "colisão normal".

questionAnswers(1)

yourAnswerToTheQuestion