直接X 11中的相机旋转

时间:2015-08-08 05:03:15

标签: camera rotation directx-11

我似乎无法根据自己的本地轴让我的相机旋转。它只会在X和Y旋转上围绕原点旋转。

POINT cursorPos;
GetCursorPos(&cursorPos);
LONG deltaX = oldCursorPos.x - cursorPos.x;
LONG deltaY = oldCursorPos.y - cursorPos.y;

if (GetAsyncKeyState(VK_RBUTTON))
{
    XMMATRIX xRotation = XMMatrixRotationY((-deltaX * (float)timer.Delta()));
    XMMATRIX yRotation = XMMatrixRotationX((-deltaY * (float)timer.Delta()));

    XMFLOAT4 viewVector = XMFLOAT4(sceneMatrix.viewMatrix.m[3][0], sceneMatrix.viewMatrix.m[3][1], sceneMatrix.viewMatrix.m[3][2], sceneMatrix.viewMatrix.m[3][3]);
    XMVECTOR pos = XMLoadFloat4(&viewVector);
    for (size_t i = 0; i < 4; i++) { sceneMatrix.viewMatrix.m[3][i] = 0.0f; }
    XMMATRIX view = XMLoadFloat4x4(&sceneMatrix.viewMatrix);

    view = xRotation * view;
    view = view * yRotation;

    XMStoreFloat4x4(&sceneMatrix.viewMatrix, view);

    sceneMatrix.viewMatrix.m[3][0] = XMVectorGetX(pos);
    sceneMatrix.viewMatrix.m[3][1] = XMVectorGetY(pos);
    sceneMatrix.viewMatrix.m[3][2] = XMVectorGetZ(pos);
    sceneMatrix.viewMatrix.m[3][3] = XMVectorGetW(pos);
}

oldCursorPos = cursorPos;

起初我以为我是以错误的顺序将它们相乘,但是当我反转它们时,仍然围绕原点旋转。我无法挑选出我做错的事情。

2 个答案:

答案 0 :(得分:1)

这就是旋转矩阵的工作原理。它们旋转原点周围空间中的每个点。

RotationMatrix http://www.sharetechnote.com/image/EngMath_Matrix_Affin_Rotate.PNG

要围绕y轴旋转相机,例如你要设置x = 0&amp; z = 0.然后应用旋转矩阵(现在它正在寻找不同的位置),然后将相机移回原位。

另一个选择是创建一个视图矩阵来为您模拟整个摄像机并每帧左右更改它。

答案 1 :(得分:1)

您需要的局部旋转轴内置于视图矩阵中......有点。视图矩阵是矩阵的倒置形式,表示摄像机的世界空间位置和旋转。首先你必须反转视图矩阵,然后摄像机的局部x轴是第一行,y轴是第2行,z轴是第3行。(或者你可以通过使用适当的列来提取本地向量)。然后,使用轴/角度版本,而不是使用XMMatrixRotationX,您可以插入那些本地轴:XMMatrixRotationAxisXMMatrixRotationNormal进行旋转。