Sign in to follow this  
Samurai Jack

Right Hand to Left Hand Conversion

Recommended Posts

Samurai Jack    455
Greetings! I allways thought a right handed matrix like this: R R R 0 (x) 1 0 0 0 R R R 0 (x) 0 0 1 0 R R R 0 (x) 0 1 0 0 X Y Z 0 (x) 0 0 0 1 A x B matrix multiply Would be come a Left handed matrix. But it is not allways the case and I do not know why? The second matrix basicaly does this: X A B X becomes X B A X X A B X becomes X B A X X A B X becomes X B A X X A B X becomes X B A X That isn't allways a solution. What could i implement from the begging since i know the positions (x,y,z) and the rotations (yaw, pitch, roll) that are general in right handed format to make a left handed matrix? I did it like that: D3DXMatrixRotationYawPitchRoll(&matrix, yaw, pitch, roll); matrix._41 = x; matrix._42 = y; matrix._43 = z; and then multiplied it with the upper matrix. Any suggestions how a right handed matrix like that above could get left handed from the begining?

Share this post


Link to post
Share on other sites
leoptimus    106
For convet to Left Hand Conversion, try to multiply right hand matrix with
this one:


LT = | -1 0 0 0|
| 0 1 0 0|
| 0 0 -1 0|
| 0 0 0 1|




LT has inverted the X and the Z axis.

Share this post


Link to post
Share on other sites
jyk    2094
Quote:
For convet to Left Hand Conversion, try to multiply right hand matrix with this one:*source snippet*
I think that's just a 180-degree y-axis rotation. To change handedness you need an odd number of negations (and/or swaps).

Share this post


Link to post
Share on other sites
leoptimus    106
Ok Jyk. That's right too.

However, that's for convert OpenGL matrices to DirectX?
DirectX has translation component at fourth row, while OpenGL has it at fourth column.

Also, transformations on DirectX are quite different from Opengl.


With OpenGL:


Tv = M*v' =

Tv = | x1 y1 z1 tx|*|vx|
| x2 y2 z2 ty|*|vy|
| x3 y3 z3 tz|*|vz|
| 0 0 0 1 |*| 1|





With DirectX:


Tv = M*v' =

Tv = |vx vy vz 1| * | x1 x2 x3 0 |
| y1 y2 y3 0 |
| z1 z2 z3 0 |
| tx ty tz 1 |




Confusing. Isn't it?

When I was dealing with these transformations, I become sick! I'm going to have a headache right now. Changes coordinates system and manages relative positions and orientations gives me a feeling that I am entering to a strange dimension. Have you ever feel the same thing? =)

Really, I haven't been forced to do this before, but possibly in the future.
I suggest you to take a look to the WildMagic Library, or OGRE 3D. These engines had managed this isues very well.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
Are you doing this for real time renderig or for and off line tool like a plug in?

Share this post


Link to post
Share on other sites
Samurai Jack    455
It is acctualy the same isn't it? Basicaly I am writing a Half-Life(2) .smd converter to DirectX. I have a lot of my own model renderers like unreal, ms3d, half-life1 (opengl) but at least unreal works with that upper matrix i have written above.

If you have just one matrix multiply more it does not make a speed difference if it is baken in file or multiplied afterwards.

I was thinking to swap the rotations from the begining like that:
D3DXMatrixRotationYawPitchRoll(&matrix, yaw, pitch, -roll);
matrix._41 = x;
matrix._42 = y;
matrix._43 = -z;

But it does not quite work for a hierarchy. I have to perform some additional checks. I get a lot of help from the JT DirectX Exporter, that is capable of exporting from Milkshape to .X (it has some bugs but for some models it works). Maybe i will find the match.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this