Moderators: Sascha Willems, walaber
Julio Jerez wrote:I could not resist to try yet another gyro test called phitop
https://www.youtube.com/watch?v=1Tx7FgZuV3U
It is amassing hwo is can be reproduce bu the book, notice how teh start fast and as the rise they a little of angular velocity, by then thank to her explanation this is not a bug is actually conservation of energy, and the top rises it gain potential energy because there center of mass goes up, so teh onel way to get thet energy from is from the angular keneti energy, why will make the object slow down.
The secund reason that slo down is that as it rises it chnge its from an axis with lowes inerta to teh axis with large inretia, so angula velocity soul goes down to make constant.
Thes physics stuff make thing that people will see as a bug very perculiar and interesting.
but once you see it an undertand it, this the intutive way no longer makes sence.
I could not recreate the tiptop one, I made with a ball and a small cylinder, but that does not do it,
The trick of the type top is that is hollow, so the inertia is concentrate on the surface, and the small pin make a large influence, a solid sphere the pin has almost not effect and it aligns sideways, later
I will see if I can model the hollow inertia, which can no be done easy with the compound but can be done from the elements. Tha was we will recreate all edge cases.
I always wnat to simulate these stuff.
Sweenie wrote:Sorry for going off topic but have you tried simulating this one?
https://www.youtube.com/watch?v=LmEf7aIhpF8
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.DotProduct3(origin);
for (dgInt32 i = 0; i < 3; i ++) {
//inertia[i][i] = (inertia[i][i] - (mag - origin[i] * origin[i])) * mass;
inertia[i][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);
}
#ifdef DG_USEFULL_INERTIA_MATRIX
virtual void SetMassMatrix (dgFloat32 mass, const dgMatrix& inertia);
virtual dgMatrix CalculateLocalInertiaMatrix() const;
virtual dgMatrix CalculateInertiaMatrix() const;
virtual dgMatrix CalculateInvInertiaMatrix() const;
dgMatrix m_principalAxis;
#endif
Users browsing this forum: No registered users and 5 guests