In my 3d rigid-body simulation, when the ball hits an object it doesn't get rotated. I'm using AABB for collision detection
this is how i update the objects
void RigidBody::Update(float h)
{
x += h*v;
v += h*(F_Total/Mass);
q += 0.5f*h*Omegaq;
L += h*Tau_Total;
q = XMQuaternionNormalize(q);
R = XMMatrixRotationQuaternion(q);
IInverse = XMMatrixMultiply(XMMatrixTranspose(R), IBodyInverse);
IInverse = XMMatrixMultiply(IInverse, R);
Omega = XMVector4Transform(L, IInverse);
F_Total = XMVectorSet(0, 0, 0, 0);
Tau_Total = XMVectorSet(0, 0, 0, 0);
UpdateAABB();
}
This is how add impulsive torque and torque to the system
void RigidBody::AddTorque(XMVECTOR Torque)
{
Tau_Total += Torque;
}
void RigidBody::AddImpulsiveTorque(XMVECTOR ImpulsiveTorque)
{
Omega += XMVector4Transform(ImpulsiveTorque, IInverse);
}
This is how I apply impulses.
void Arbiter::ApplyImpulse()
{
XMVECTOR tangent[2];
for (int i = 0; i < numContacts; ++i)
{
Contact* c = contacts + i;
XMVECTOR p = c->position;
XMVECTOR padot = body1->GetVelocityAtPoint(p);
XMVECTOR pbdot = body2->GetVelocityAtPoint(p);
XMVECTOR ra = (p - body1->GetPosition());
XMVECTOR rb = (p - body2->GetPosition());
XMVECTOR n = c->normal;
XMVECTOR dv = -padot + pbdot;
float Cdot = XMVector3Dot(dv, n).m128_f32[0];
float dPn = c->massNormal * (-Cdot + c->bias);
float Pn0 = c->Pn;
c->Pn = max(Pn0 + dPn, 0.0f);
dPn = c->Pn - Pn0;
XMVECTOR P = dPn * n;
body1->AddImpulse(-P);
body1->AddTorque(-XMVector3Cross(ra, P));
body2->AddImpulse(P);
body2->AddTorque(XMVector3Cross(rb, P));
p = c->position;
padot = body1->GetVelocityAtPoint(p);
pbdot = body2->GetVelocityAtPoint(p);
n = c->normal;
ra = (p - body1->GetPosition());
rb = (p - body2->GetPosition());
dv = -padot +pbdot;
tangent[0] = XMVector3Orthogonal(n);
tangent[1] = XMVector3Cross(tangent[0], n);
for (int z=0;z<2;z++)
{
float vt = XMVector3Dot(dv, tangent[z]).m128_f32[0];
float dPt = c->massTangent[z] * (-vt);
// Compute friction impulse
float maxPt = friction * c->Pn;
// Clamp friction
float oldTangentImpulse = c->Pt[z];
c->Pt[z] = Clamp(oldTangentImpulse + dPt, -maxPt, maxPt);
dPt = c->Pt[z] - oldTangentImpulse;
// Apply contact impulse
XMVECTOR Pt = dPt * tangent[z];
body1->AddImpulse(-Pt);
body1->AddTorque(-XMVector3Cross(ra, Pt));
body2->AddImpulse(Pt);
body2->AddTorque(XMVector3Cross(rb, Pt));
}
}
}