void dgDynamicBody::AttachCollision (dgCollisionInstance* const collision) { dgBody::AttachCollision(collision); if (m_collision->IsType(dgCollision::dgCollisionMesh_RTTI) || m_collision->IsType(dgCollision::dgCollisionScene_RTTI)) { SetMassMatrix (m_mass.m_w, m_mass.m_x, m_mass.m_y, m_mass.m_z); } }
void dgBody::SetMassProperties (dgFloat32 mass, const dgCollisionInstance* const collision) { // using general central theorem, to extract the Inertia relative to the center of mass dgMatrix inertia (collision->CalculateInertia()); dgVector origin (inertia.m_posit); dgFloat32 mag = origin % origin; for (dgInt32 i = 0; i < 3; i ++) { inertia[i][i] = (inertia[i][i] - (mag - origin[i] * origin[i])) * mass; for (dgInt32 j = i + 1; j < 3; j ++) { dgFloat32 crossIJ = origin[i] * origin[j]; inertia[i][j] = (inertia[i][j] + crossIJ) * mass; inertia[j][i] = (inertia[j][i] + crossIJ) * mass; } } // although the engine fully supports asymmetric inertia, I will ignore cross inertia for now //SetMassMatrix(mass, inertia[0][0], inertia[1][1], inertia[2][2]); SetMassMatrix(mass, inertia); SetCentreOfMass(origin); }