如何在DirectX中使一个物体在XYZ轴上旋转?

5
我尝试了这段代码:
D3DXMatrixRotationX(&matRotate, rx);
D3DXMatrixRotationY(&matRotate, ry);
D3DXMatrixRotationZ(&matRotate, rz);
d3ddev->SetTransform(D3DTS_WORLD, &matRotate);

但是它似乎总是只旋转最后一个旋转(Z轴)。

我如何同时旋转一个物体的所有XYZ轴? 我正在尝试寻找DirectX中等效于OpenGL旋转的方法:

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

编辑: 看起来我自己解决了:

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

如果没有,麻烦您留下评论。由于需要+7的声望才能发表答案,我需要等待8个小时之后才能发布它。


我不了解DirectX,但你可能把乘法顺序搞错了。如果你确定顺序正确,请忽略这个评论,否则请检查一下。 - Daniel Fischer
1个回答

4

D3DXMatrixRotationX不会旋转矩阵,而是创建一个可用于旋转某物的矩阵。

因此,您可以在每个步骤之后立即使用该矩阵来旋转其他内容,或者您可以使用D3DXMatrixRotationYawPitchRoll,这样您只需要创建一次就可以了...

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

编辑: 你的编辑也可以……

不错的发现,请按正确顺序编辑您的参数:ry、rx、rz。 - Rookie
@Rookie 谢谢,这就是当你忘记仔细检查时会发生的事情...现在已经修复了... - Cpt. Red

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接