www.jpct.net
jPCT  a 3d engine for Java => Support => Topic started by: tjm on March 29, 2010, 11:10:18 pm

This has been driving me crazy all weekend and all day!!
If an object is rotated 90 degrees around it's X axis (so the object's Y axis is now aligned with the world's Z axis ), when it's translated along the Z axis it actually moves along the world's Y axis ..... is this correct?
And as a follow on, after rotating an object how can it be realigned with the world's axis so that the rotation is not undone?
TIA,
Tim.

If an object is rotated 90 degrees around it's X axis (so the object's Y axis is now aligned with the world's Z axis ), when it's translated along the Z axis it actually moves along the world's Y axis ..... is this correct?
For the behavior you are looking for here, you need to convert your translation from worldspace into objectspace. This is done by taking the rotations of the rotated Object3D and applying them to the translation Vector3D:
// Grab a handle to the Object3D's rotation matrix:
Matrix m = new Matrix( myObject3D.getRotationMatrix() );
// Apply this rotation matrix to the translation vector:
myVector3D.matMul( mI );
Important note: If your rotated Object3D is the child of another Object3D, you will most likely want to take ALL of the inherited rotations into account. This takes a few more lines of code, but it's not too difficult:
// Grab a handle to the Object3D's world transformation matrix:
Matrix m = new Matrix( myObject3D.getWorldTransformation() );
// Turn that into a rotation matrix:
float[] dm = m.getDump();
for( int i = 12; i < 15; i++ )
{
dm[i] = 0;
}
dm[15] = 1;
m.setDump( dm );
// Apply this rotation matrix to the translation vector:
myVector3D.matMul( mI );
And as a follow on, after rotating an object how can it be realigned with the world's axis so that the rotation is not undone?
This can be done by rotating the mesh of the Object3D and then replacing its rotation matrix with a new one:
myObject3D.rotateY( (float)Math.PI / 2.0f ); // do some rotations
myObject3D.rotateMesh();
myObject3D.setRotationMatrix( new Matrix() );
Note: I pulled these off the top of my head, so you may need to check for typos ;D

If you want to translate along the (virtual) object axes only, you can use the get?Axis()methods in Object3D as well to get the correct axes in world space.

This has been driving me crazy all weekend and all day!!
BTW: That's totally normal when starting with 3D... ;D

Thanks for the help. I was rotating the object, not the mesh. Clearly that has been causing the unexpected object behaviors.
Sorry about the delay in replying .... it's Spring break here and my 2 kids (ages 6 and 3) are home all week.
Not getting much done at all right now.
Tim.

Just keep in mind that rotating the mesh is expensive. You shouldn't do this every frame. Rotating the object is actually the right way, you just have to take care of your translations.