How to move to quaternion implementation ?
Hello here,
now I have made my basic prototype (it works fine, globally : http://www.youtube.com/watch?v=ZCexHD297O0), I need to move to quaternion.
Indeed, and as dtr named it has coordinates singularity, I have some azimuth calculations problem.
I read some people implemented that exactly as I did.
Indeed, it isn't really annoying to have sounds flipping a bit when the sound source is exactly up above or under the camera (considering the lookat direction of the cam)
but I don't like that.
I implemented my azimuth (and elevation) calculations like that:
- I have a huge matrix with x, y, z coordinates of all objects.
- I process the whole matrix through a jit.gen
The jit.gen takes as inputs:
- x,y,z for all objects
- cam position (x,y,z)
- cam lookat point (x,y,z)
I need that 4th dimension to avoid that Gimbal lock :-/
What do I need more to improve my calculation ...?
Any helps or leads would be appreciate :)
as far as I understood, http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm can help.
In that link, there is a non-normalised version of the cod which calculates heading from quaternions.
/** q1 can be non-normalised quaternion */
public void set(Quat4d q1) {
double sqw = q1.w*q1.w;
double sqx = q1.x*q1.x;
double sqy = q1.y*q1.y;
double sqz = q1.z*q1.z;
double unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor
double test = q1.x*q1.y + q1.z*q1.w;
if (test > 0.499*unit) { // singularity at north pole
heading = 2 * atan2(q1.x,q1.w);
attitude = Math.PI/2;
bank = 0;
return;
}
if (test < -0.499*unit) { // singularity at south pole
heading = -2 * atan2(q1.x,q1.w);
attitude = -Math.PI/2;
bank = 0;
return;
}
heading = atan2(2*q1.y*q1.w-2*q1.x*q1.z , sqx - sqy - sqz + sqw);
attitude = asin(2*test/unit);
bank = atan2(2*q1.x*q1.w-2*q1.y*q1.z , -sqx + sqy - sqz + sqw)
}
I can see the singularity test for south & north poles.
It means I could also do that in my code, but I guess, considering quaternion operations, quaternions stuff would be more efficient.
Am I right here ?
About heading, and because I want the angle between my cam view direction and the vector between the object & the cam, I'm a bit confused.
what I would make:
- calculate the heading of my cam, providing its quaternion grabbed from jit.anim.node
- calculate the heading of the vector define by the segment from the cam to object (I'd need a quat here :-/)
- substract one to the other
Is it the way to go ?
The last substraction drives me intuitively to think I'd meet again a gimbal lock, making this operation outside of the quat world...