Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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);
}