2012-01-09 19 views
5

yo probamos este código:Cómo rotar un objeto en ejes XYZ en DirectX?

D3DXMatrixRotationX(&matRotate, rx); 
D3DXMatrixRotationY(&matRotate, ry); 
D3DXMatrixRotationZ(&matRotate, rz); 
d3ddev->SetTransform(D3DTS_WORLD, &matRotate); 

pero parece que siempre solamente gire la última rotación (eje Z).

¿Cómo giro un objeto con todos los ejes XYZ al mismo tiempo? Im tratando de encontrar DirectX equivalente para la rotación de OpenGL:

glRotatef(rx, 1, 0, 0); 
glRotatef(ry, 0, 1, 0); 
glRotatef(rz, 0, 0, 1); 


EDIT: Parece que lo he descubierto por mí mismo:

D3DXMATRIX matRotateX; 
D3DXMATRIX matRotateY; 
D3DXMATRIX matRotateZ; 
D3DXMatrixRotationX(&matRotateX, rx); 
D3DXMatrixRotationY(&matRotateY, ry); 
D3DXMatrixRotationZ(&matRotateZ, rz); 
D3DXMATRIX matRotate = matRotateX*matRotateY*matRotateZ; 
d3ddev->SetTransform(D3DTS_WORLD, &matRotate); 

si no, por favor, comentar . ¡No puedo publicarlo como respuesta hasta que hayan pasado 8 horas! (necesita +7 reputación para hacerlo).

+0

No sé acerca de DirectX, pero es posible que tenga la multiplicación en el orden incorrecto. Si sabe que su pedido es correcto, ignore este comentario, de lo contrario, verifíquelo. –

Respuesta

4

D3DXMatrixRotationX no rota una matriz sino que crea una matriz que se puede utilizar para rotar algo.

Por lo tanto, se puede utilizar la matriz de la derecha después de cada paso y gire otra cosa o se puede usar D3DXMatrixRotationYawPitchRoll por lo que sólo hay que crear una vez ...

D3DXMatrixRotationYawPitchRoll(&matRotate, ry, rx, rz); 

EDIT: Tu edición trabaja demasiado ...

+0

buen hallazgo, por favor edite sus parámetros en el orden correcto: ry, rx, rz – Rookie

+0

@Rookie gracias, y esto es lo que sucede cuando se olvida de verificar dos veces ... Reparado ahora ... –

Cuestiones relacionadas