//first rotation
double angle = calcAngle( x0, y0, z0, 1.0, 0.0, 0.0 );
TArray<double> fcProd = crossProduct( x0, y0, z0, 1.0, 0.0, 0.0 );
glRotated( -angle, fcProd[0], fcProd[1], fcProd[2] );
//second rotation
double angle2 = calcAngle( x1, y1, z1, 0.0, 1.0, 0.0 );
glRotated( -angle2, 1.0, 0.0, 0.0 );
The second rotation or the calculation seems to be right, but it isn't (I tried it in my program). It is very tricky to calculate the angle. Set x2 as the rotation axis is correct - otherwise the first rotation would be wrong.
Can anybody figure out how the second angle should be calculated?
Hope someone can help! It is not easy to describe, so feel free to ask if something is not understandable.
Regards
reani
opengl rotation
Hi,
I'm looking for some help for a very tricky opengl rotation.
Assume two coordinate systems, where the origin is the same. The first coordinate system is the standard opengl coordinate system(no rotation) and the second one is somehow rotated where have the defining coordinates.
Now I want to rotate the first coordinate system to match with the second one.
Theoretically it is clear to me that, first rotate the first x axis x1 to the second x axis x2. The second step is to rotate y1 to y2.
I only need two rotations because the first rotation axis is a normal vector to both x axes.
The implementation looks like:
(x0, y0, z0) is the x-axis and (x1, y1, z1) is the y-axis of the second coordinate system
If you have both coordinate systems expressed as matrices you can calculate the difference using some matrix math. Your second matrix M2 might be expressed as M1 * Mx = M2 where Mx is the matrix difference you look for, so rearange the equation: Mx = M2 * M1-1.
If M1 is the identity matrix, it's simpler: Mx = M2.
Now extract the angles from Mx.
If M1 is the identity matrix, it's simpler: Mx = M2.
Now extract the angles from Mx.
thanks for the swift response, but what if I didn't express the coordinate systems as matrices? Only in coordinates. It would be a damn work to put the coordinates into a matrix.
regards
reani
regards
reani
OK, I'm not an expert in matrix math but I'd try the following:
1. Select two points A and B and normalize the vectors.
2. Calculate the normal N of the plane defined by A and B: A x B (cross product)
3. From vector A and N calculate the perpendicular vector R: A x R (cross product)
4. Construct the rotation matrix from A, N and R (all normalized).
5. - 8. Repeat step 1 to 4 for the corresponding rotated points A' and B'.
Now you should end up in 2 matrices which you can use to get the euler angles from.
1. Select two points A and B and normalize the vectors.
2. Calculate the normal N of the plane defined by A and B: A x B (cross product)
3. From vector A and N calculate the perpendicular vector R: A x R (cross product)
4. Construct the rotation matrix from A, N and R (all normalized).
5. - 8. Repeat step 1 to 4 for the corresponding rotated points A' and B'.
Now you should end up in 2 matrices which you can use to get the euler angles from.
Quote:Original post by Lord_Evil
If you have both coordinate systems expressed as matrices you can calculate the difference using some matrix math. Your second matrix M2 might be expressed as M1 * Mx = M2 where Mx is the matrix difference you look for, so rearange the equation: Mx = M2 * M1-1.
If M1 is the identity matrix, it's simpler: Mx = M2.
Now extract the angles from Mx.
I believe the correct rearranged version with Mx as the subject would be Mx = M1-1 * M2
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement