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;