Quaternions, rotate a model and align with a direction

Started by
3 comments, last by max343 11 years, 5 months ago
Suppose you have quaternion that describes the rotation of a 3D Model.
What I want to do is, given an Object (with rotationQuaternion, side vector...), I want to align it to a target point.
For a spaceship, I want the cockpit to point to a target.
Here is some code I have ... It's not doing what I want and I don't know why...


if (_target._ray.Position != _obj._ray.Position)
{
Vector3 vec = Vector3.Normalize(_target._ray.Position - _obj._ray.Position);
float angle = (float)Math.Acos(Vector3.Dot(vec, _obj._ray.Direction));
Vector3 cross = Vector3.Cross(vec, _obj._ray.Direction);
if (cross == Vector3.Zero)
cross = _obj._side;
_obj._rotationQuaternion *= Quaternion.CreateFromAxisAngle(cross,angle);
}
// Updates direction, up, side vectors and model Matrix
_obj.UpdateMatrix();



after some time the rotationQuaternion is filled with almost Zero at X,Y,Z and W
Any help? Thanks ;-)
Advertisement
Do you normalize your final quaternions before transforming them into a matrix (or just at the end of the frame)? If not then you should.
Mmmm, probably it's that...
ok now it's rotating like crazy...


if (_target._ray.Position != _obj._ray.Position)
{
Vector3 vec = Vector3.Normalize(_target._ray.Position - _obj._ray.Position);
float angle = (float)Math.Acos(Vector3.Dot(vec, _obj._ray.Direction));
Vector3 cross = Vector3.Cross(vec, _obj._ray.Direction);

cross = (cross == Vector3.Zero) ? _obj._side : Vector3.Normalize(cross);

_obj._rotationQuaternion *= Quaternion.CreateFromAxisAngle(cross,angle);
_obj._rotationQuaternion.Normalize();
}
_obj.UpdateMatrix();


I have normalized the cross and quaternion...
"Like crazy" in a good or bad way?

This topic is closed to new replies.

Advertisement