Jump to content
  • Advertisement
Sign in to follow this  
cathode26

Rotation in a sub node.

This topic is 1875 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am making a tool that rotates a model.  This tool needs to not care which direction the model is facing.  It just needs to rotate on world coordinate.  Like a rotate tool you would use in 3d studio max.  The problem comes up after the parent node has been rotated.  When the parent is not aligned with the world the children rotate on a different axis.

 

Rotating the parent is fine.  Rotating just the child is fine.

But if the parent is not on the identity for the axis then the child is rotated incorrectly.

 

This is the code I use on the parent.

 


if(dz == 0 && dy == 0)
   D3DXMatrixRotationX(&rotationMat, D3DXToRadian(node->rn_eulerOffset->x));
else if(dx == 0 && dz == 0)
    D3DXMatrixRotationY(&rotationMat, D3DXToRadian(node->rn_eulerOffset->y));
else if(dx == 0 && dy == 0)
    D3DXMatrixRotationZ(&rotationMat, D3DXToRadian(node->rn_eulerOffset->z));


if(node->parent == NULL)
{
  D3DXMATRIX localRotation(*node->rn_matrix);
  D3DXMATRIX localTranslation;
  D3DXMatrixIdentity(&localTranslation);
  localTranslation(3,0) = localRotation(3,0);
  localTranslation(3,1) = localRotation(3,1);
  localTranslation(3,2) = localRotation(3,2);

  localRotation(3,0) = 0;
  localRotation(3,1) = 0;
  localRotation(3,2) = 0;
  localTransformation = localRotation*rotationMat*localTranslation; 
}

 

 

I tried to remove the parent rotation from the child before rotating and to use world space but I didnt have much luck.

 

Thanks ahead of time for any help.

 

 

 

Share this post


Link to post
Share on other sites
Advertisement

This is the code I tried to use for the world rotation of the sub nodes but this gives similar results to the parent code,  but worse because there is eventually some distortion and my axes eventually stops being world for the child node when the parent has not even been rotated.  

 

D3DXMATRIX worldRotation(*(node->rn_worldMatrix));
D3DXMATRIX worldTranslation; D3DXMatrixIdentity(&worldTranslation);
worldTranslation(3,0) = worldRotation(3,0);  
worldTranslation(3,1) = worldRotation(3,1);  
worldTranslation(3,2) = worldRotation(3,2);

worldRotation(3,0) = 0;  
worldRotation(3,1) = 0;  
worldRotation(3,2) = 0;

D3DXMATRIX worldTransformation = rotationMat*worldRotation*worldTranslation;

//I need to convert it to local

FLOAT determinant;
D3DXMATRIX parentInverseWorld;
D3DXMatrixInverse(&parentInverseWorld, &determinant, &parentWorldTransform);

localTransformation = worldTransformation*parentInverseWorld;

 

 

I also tried changing the coordinate space of the rotation into the local coordinate space and applying the rotation there.  With similar results, I can rotate the child in world space if the parent is not rotated.

 

D3DXMATRIX localRotation((*(node->rn_matrix)));
D3DXMATRIX localTranslation;  D3DXMatrixIdentity(&localTranslation);

localTranslation(3,0) = localRotation(3,0);  
localTranslation(3,1) = localRotation(3,1);  
localTranslation(3,2) = localRotation(3,2);
localRotation(3,0) = 0;  
localRotation(3,1) = 0;  
localRotation(3,2) = 0;

D3DXMATRIX deltaRotationLocal = rotationMat*parentInverseWorld;
localTransformation = localRotation*deltaRotationLocal*localTranslation;
Edited by cathode26

Share this post


Link to post
Share on other sites

The actual solution...  I solved it..  This is how  you rotate properly in world space.  If you look closely I had switched the order of the multiplication during the calculation of the world transform.

 

D3DXMATRIX worldRotation(*(node->rn_worldMatrix));
D3DXMATRIX worldTranslation; D3DXMatrixIdentity(&worldTranslation);
worldTranslation(3,0) = worldRotation(3,0);  
worldTranslation(3,1) = worldRotation(3,1);  
worldTranslation(3,2) = worldRotation(3,2);

worldRotation(3,0) = 0;
worldRotation(3,1) = 0;
worldRotation(3,2) = 0;

D3DXMATRIX worldTransformation = worldRotation*rotationMat*worldTranslation;
localTransformation = worldTransformation*parentInverseWorld;
Edited by cathode26

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!