Calcular la velocidad angular después de una colisión

Tengo el componente lineal de resolución de colisión relativamente bien, pero no puedo entender cómo hacer lo mismo para el angular. Por lo que he leído, es algo así como ...torque = point of collision x linear velocity. (producto cruzado) Traté de incorporar unejemplo que encontré en mi código, pero en realidad no veo ninguna rotación cuando los objetos chocan. El otro violín funciona perfectamente con una implementación rudimentaria del teorema del eje de separación y los cálculos de velocidad angular. Esto es lo que se me ocurrió ...

Definiciones de propiedades (orientación, velocidad angular y aceleración angular):

rotation: 0,
angularVelocity: 0,
angularAcceleration: 0

Cálculo de la velocidad angular en la respuesta de colisión:

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

Actualización de la orientación en el ciclo de actualización:

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;

Publicaría el código que tengo para calcular los momentos de inercia, pero hay uno separado para cada objeto, por lo que sería un poco ... largo. Sin embargo, aquí está el de un círculo como ejemplo:

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

Solo para mostrar el resultado, aquí está miviolín. Como se muestra, los objetos no giran en colisión. (no exactamente visible con los círculos, pero debería funcionar para el cero y siete)

¿Qué estoy haciendo mal?

EDITAR: La razón por la que no estaban rotando en absoluto fue debido a un error con los grupos en la función de respuesta: ahora gira, pero no correctamente. Sin embargo, he comentado eso por ahora, ya que arruina las cosas.

Además, he probado otro método para la rotación. Aquí está el código en la respuesta:

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

Tenga en cuenta quedirection se refiere a la "colisión normal".

Respuestas a la pregunta(1)

Su respuesta a la pregunta