Skip to main content
GameDev.net gamedev.net
🔒 Locked

Rotation in a sub node.

Started by cathode26 May 3, 2013 at 9:40 PM 1 replies 1.4k views
Original Post
cathode26
cathode26

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.

cathode26
cathode26

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;
cathode26
cathode26

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;

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.