Как повернуть объект по осям XYZ в DirectX? - PullRequest
5 голосов
/ 09 января 2012

Я попробовал этот код:

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


EDIT: Похоже, я понял это сам:

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

Если нет, пожалуйста, прокомментируйте. Я не могу опубликовать это как ответ, пока не прошло 8 часов! (для этого нужна +7 репутация).

1 Ответ

4 голосов
/ 09 января 2012

D3DXMatrixRotationX не вращает матрицу, но создает матрицу, которая может использоваться для вращения чего-либо.

Таким образом, вы можете использовать матрицу сразу после каждого шага и вращать что-то еще, или вы можете использовать D3DXMatrixRotationYawPitchRoll, чтобы вам нужно было создать ее только один раз ...

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

EDIT: Ваша правка тоже работает ...

...