1) 'Gravity is not pulling x down' is a rather confusing way to think about it (as it's always there), but you are right. What's happening is the cross-product, which requires two vectors as an argument. The result is a vector that is perpendicular to both initial vectors. Of course being perpendicular to both still leaves two directions (check it yourself!), but the cross-product has been defined in such a way that it specifies only one direction. When the professor changes the direction of the spin, he changes $\vec L$ to point to the other direction; as a result the result of the cross-product switches direction and the wheel turns the other way.
It's important to note that gravity isn't doing any work or is being worked on - after all, the wheel doesn't go up or down.
2) If spin velocity was higher, it would turn quicker; the axis of the wheel would stay horizontal.
3) After a while, friction kicks in and slows down the wheel to the point where the torque can no longer support the wheel, just like how a top starts waggling and falls down when it slows down too much.
If you find this hard to follow let me know; I'll try to simplify.
$\vec\omega = I^{-1} \vec L$, and $\vec L$ is constant in the absence of external forces. The bit that I think you're missing is that $I$ rotates with the rigid body, so it is not constant in general and neither is $\vec\omega$.
I played with your online example, and the angular velocity does seem to always remain constant when I'm not poking the block, which is consistent with an inertia tensor that's a scalar multiple of the identity. I've never used Unity, but it seems to support arbitrary tensors of inertia via Rigidbody.inertiaTensor and Rigidbody.inertiaTensorRotation, so maybe you just need to set those properly.
If you end up having to roll your own physics, here's some naive, untested, and potentially wrong pseudocode:
const double time_step = ...;
const Quaternion L = {0, Lx, Ly, Lz}; // angular momentum
const double K1 = 1/I1, K2 = 1/I2, K3 = 1/I3; // reciprocals of principal-axis moments of inertia; no idea if there's a standard letter for this
Quaternion orientation = {1, 0, 0, 0};
while (1) {
Quaternion transformed_L = conjugate(orientation) * L * orientation;
Quaternion transformed_omega = {0, K1 * transformed_L.i, K2 * transformed_L.j, K3 * transformed_L.k};
Quaternion omega = orientation * transformed_omega * conjugate(orientation);
orientation = quaternion_exp(time_step * omega) * orientation;
// ... or orientation = normalize((1 + time_step * omega) * orientation);
// ... or orientation = normalize((1 + time_step * omega + 0.5 * (time_step * omega)**2) * orientation);
output(orientation);
}
Best Answer
It's a classical mechanics effect for sure although a really interesting one. Following links on "Dzhanibekov effect" one gets at Marsden and Ratiu's "Introduction to Mechanics and Symmetry" Chapter 15 Section 15.9 "Rigid Body Stability" treating this with use of the Casimir functions.
From remark 1: A rigid body tossed about its middle axis will undergo an interesting half twist when the opposite saddle point is reached.
Here is another and more profound example under weightless conditions.
http://www.youtube.com/watch?v=L2o9eBl_Gzw
This seems to be a home experiment where a guy throws the spinning object upwards.
http://www.youtube.com/watch?v=3VwS5ykAUHI
And this seems to be a computer simulation.
http://www.youtube.com/watch?v=LR5hkgfRPno
There is a related unstable orbit effect which you can try out easily yourself with a tennis racket. A treatment due to Ashbauch Chicone and Cushman is here:
Mark S. Ashbaugh, Carmen C. Chicone and Richard H. Cushman, The Twisting Tennis Racket, Journal of Dynamics and Differential Equations, Volume 3, Number 1, 67-85 (1991). (One time found at
http://math.ucalgary.ca/files/publications/cushman/tennis.pdfwhich is no longer a working link.)http://www.youtube.com/watch?v=4dqCQqI-Gis