The title says it all. How would I realistically simulate rotational physics? For example, I have an arrow. When I shoot it, it should go up and then rotate towards the ground as it's falling. However, when I shoot it now, it'll go up, and then fall back to the ground, all the while maintaining the same rotation. This doesn't look good at all. I thought perhaps drag was the key, but it doesn't fit my lock, so to speak. How would I do this? Thanks.
The arrow rotates in real life due to wind resistance that pushes on the arrow in a way that is specific to the shape of the arrow. That is overly complicated to simulate "realistically" in a game, so it's much easier to just rotate the arrow such that the tip points in the direction of movement:
Vector3.Slerp(myArrow.transform.forward, myArrow.rigidbody.velocity.normalized, Time.deltaTime);
This is how I do it.
if(rigidbody.velocity != Vector3.zero)
rigidbody.rotation = Quaternion.LookRotation(rigidbody.velocity);
One way of solving would be to make the arrow out of two rigidbodies, a tip and a tail, connected with a FixedJoint. If you then make the tip heavier than the tail, and/or have a larger drag on the tail, I believe you should get the desired rotating with tip towards ground effect.
Another way that should work is to adjust the arrows rigidbody.centerOfMass so that it is closer to the tip.
Actually, it's easy to do with one line of code. In this case, + .y is the direction of travel for the object (as if your arrow was modeled with the tip up). don't give the rigidbody any drag You just add a relative impulse to get it going... then
// add a force like to drag, opposite the direction of travel, and apply it aft of the center of mass, typically (0,0,0)
rigidbody.AddForceAtPosition(rigidbody.velocity * -.1,transform.TransformPoint(0,-.25,0));
If this creates too much drag, one can add a constant relative Force to the arrow to offset it