View Full Version : World Rotation to local rotation

loriswave

06-08-2009, 12:49 AM

hi,

anyone know what formula should I use to find the local rotations to be applied to an item knowing that the rotations have to get global.

is for lscript like rotation constrain with world option.

thanks for all

adamredwoods

06-10-2009, 12:16 PM

getforward, right, up for world and multiply.

I don't have the equations on hand right now, but if you grab the LW sdk and look in the docs, the C code is in there.

loriswave

06-12-2009, 01:18 AM

Hi,

I have try with this:

have a drive item, find parent of ma ( were a script is applied )

calculate matrix for Driveitem and Parent

calculate invers of Matrix of Driveitem and multiply with Parent Matrix

from matrix result calculate H,P,B. but not have a right result, somebody know were i wrong. I try to reading a SDK but I'm not a programmer and not understand more.

Help me please.

//var1 is drive rotation

DriveRot = var1.getWorldRotation(time);

//search parent of item

ma2id = ma.objID;

Pma = ma2id.parent;

Prot = Pma.getWorldRotation(time);

//Mrot = Mfinal * invers( Morig );

//1 Mfinal

Exax = var1.getWorldRight(time); // | A D G |

Eyax = var1.getWorldUp(time); // | B E H |

Ezax = var1.getWorldForward(time); // | C F I |

//2 Morig

Pxax = Pma.getWorldRight(time); //left | L O R |

Pyax = Pma.getWorldUp(time); //middle | M P S |

Pzax = Pma.getWorldForward(time); //right | N Q T |

A = Exax.x; D = Exax.y; G = Exax.z;

B = Eyax.x; E = Eyax.y; H = Eyax.z;

C = Ezax.x; F = Ezax.y; I = Ezax.z;

L = Pxax.x; O = Pxax.y; R = Pxax.z;

M = Pyax.x; P = Pyax.y; S = Pyax.z;

N = Pzax.x; Q = Pzax.y; T = Pzax.z;

// calculate invers of matrix

det = L * (P*T - S*Q) - M * (O*T - R*Q) + N * (O*S - R*P);

m0 = P*T-Q*S / det;

m1 = -(M*T-S*N)/ det;

m2 =M*Q-P*N / det;

m3 =-(O*T-Q*R)/ det;

m4 =L*T-R*N / det;

m5 =-(L*Q-O*N)/ det;

m6 =O*S-R*P / det;

m7 =-(L*S-R*M)/ det;

m8 =L*P-M*O / det;

/* R = M x L

| A B C | | M0 M1 M2 |

= | D E F | x | M3 M4 M5 |

| G H I | | M6 M7 M8 |

*/

//Multiply Matrix

mat0 = A*m0+B*m3+C*m6;

mat1= A*m1+B*m4+C*m7;

mat2= A*m2+B*m5+C*m7;

mat3= 0;

mat4 = D*m0+E*m3+F*m6;

mat5= D*m1+E*m4+F*m7;

mat6= D*m2+E*m5+F*m7;

mat7= 0;

mat8 = G*m0+F*m3+I*m6;

mat9= G*m1+H*m4+I*m7;

mat10=G*m2+H*m5+I*m7;

mat11=0;

mat12=0;

mat13=0;

mat14=0;

mat15=1;

//Calculate Y-axis angle

angle_y = asin( mat2);

C = cos( angle_y );

angle_y = deg(angle_y);

//Gimball lock?

if ( C > 0.005 )

{

//No, so get X-axis angle

trx = mat10 / C;

try = -mat6 / C;

//angle_x = atan2( try, trx ) * RADIANS;

angle_x = deg(acos(try / sqrt( pow(trx,2) + pow(try,2) ) ) );

//angle_x = acos( try / (sqrt( pow(trx,2) + pow(try,2)));

trx = mat0 / C; // Get Z-axis angle

try = -mat1 / C;

angle_z = acos(try / sqrt( pow(trx,2) + pow(try,2) ) );

}

// Gimball lock has occurred

else

{

// Set X-axis angle to zero

angle_x = 0;

// And calculate Z-axis angle

trx = mat5;

try = mat4;

angle_z = deg( acos(try / sqrt( pow(trx,2) + pow(try,2) ) ) );

}

// return only positive angles in [0,360]

if (angle_x < 0) angle_x += 360;

if (angle_y < 0) angle_y += 360;

if (angle_z < 0) angle_z += 360;

Eroth = angle_x ;

Erotp = angle_y ;

Erotb = angle_z ;

adamredwoods

06-18-2009, 07:27 PM

not sure what you're going for, but the world to local coords (taken right out of LW sdk) is just:

for ( i = 0; i < 3; i++ )

p[ i ] = ( q[ 0 ] - wpos[ 0 ] ) * worldrt[ i ]

+ ( q[ 1 ] - wpos[ 1 ] ) * worldup[ i ]

+ ( q[ 2 ] - wpos[ 2 ] ) * worldfd[ i ]

+ piv[ i ];

i goes from 0 to 2 for the vectors (3 total items).

q is the position (q-wpos = removes offset from the origin).

converting from matrix to HPB is more work, since you need to know the correct rotation order (ZYX I believe??).

loriswave

06-19-2009, 01:30 AM

I think that I have wrong question, I dont need a assign a different world Position, i need assign a different rotation based on a world rotation of other item, the problem is a rotation not a position.

adamredwoods

06-19-2009, 12:25 PM

You're right, I gave you the wrong info. That equation above is for converting a point in world space to a point in local space. (what was I thinking?) :(

So, to get a local rotation of a world rotation, couldn't we just:

multiply the worldrotationmatrix * localrotationmatrix and pull out the HPB from that final matrix?

The catch would be the multiply would HAVE to be in that order (wmatrix * lmatrix).

Or am I missing something?

If I am missing something, then the best code example I found was here, but they include translation, which we dont need:

http://stackoverflow.com/questions/695043/how-does-one-convert-world-coordinates-to-camera-coordinates

matrix to HPB:

http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/

3d matrix math:

http://www.gamedev.net/reference/articles/article695.asp

I've dealt with this problem before, but my notes are at home.

loriswave

06-26-2009, 03:51 AM

I am sorry but I still do not understand, let's go for small steps,

I have two elements, one who guides the movement (var1) and one who is guided (ma)

I find the rotation world of "var1"

I find the parent of "ma" I call PMA

I find the rotation world of PMA

After that?

There is a strange thing, the commands

GetRight, getUp and getForward

build the matrix of rotation of the selected by applying to them the function matrix to hpb to find the angles would have resulted in the rotation for the selected item. But this does not happen, I have the wrong formula or wrong I don't understand what the commands are GetRight, getUp and getForward do?

thanks

Powered by vBulletin® Version 4.2.3 Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.