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".