Direct X 11 中的相机旋转

Camera Rotation in Direct X 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;

起初我以为我以错误的顺序相乘,但是当我反转它们时我仍然绕着原点旋转。我无法找出我做错了什么。

这就是旋转矩阵的工作原理。他们围绕原点旋转 space 中的每个点。


(来源:sharetechnote.com

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

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

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