Moderators: Sascha Willems, walaber
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);
for (dgInt32 i = 0; i < 3; i ++) {
inertia[i][i] = (inertia[i][i] + 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]);
SetCentreOfMass(origin);
SetMassMatrix(mass, inertia);
}
void NewtonConvexCollisionCalculateInertialMatrix(const NewtonCollision* convexCollision, dFloat* const inertia, dFloat* const origin)
{
TRACE_FUNCTION(__FUNCTION__);
dgCollisionInstance* const collision = (dgCollisionInstance*)convexCollision;
// dgVector tmpInertia;
// dgVector tmpOringin;
// collision->CalculateInertia(tmpInertia, tmpOringin);
dgMatrix tmpInertia (collision->CalculateInertia());
inertia[0] = tmpInertia[0][0];
inertia[1] = tmpInertia[1][1];
inertia[2] = tmpInertia[2][2];
origin[0] = tmpInertia[3][0];
origin[1] = tmpInertia[3][1];
origin[2] = tmpInertia[3][2];
}
// although the engine fully supports asymmetric inertia, I will ignore cross inertia for now
MeltingPlastic wrote:Is there a physics rule that a rigid body can not have mass distributed in 2 separate Islands?
Users browsing this forum: No registered users and 36 guests