DirectX相机抖动

时间:2015-08-14 02:47:05

标签: matrix camera directx

Source Code

我正在制作一个小型的DirectX演示场景,但我的相机似乎正在拍摄"拍摄"当我试图旋转它时到奇数位置。它只在旋转时发生,我似乎无法找出导致它的原因。

// Get the cursor pos and calculate change in movement
POINT cursorPos;
GetCursorPos(&cursorPos);
LONG deltaX = oldCursorPos.x - cursorPos.x;
LONG deltaY = oldCursorPos.y - cursorPos.y;

// Hold right click to rotate
if (GetAsyncKeyState(VK_RBUTTON))
{
    XMMATRIX xRotation = XMMatrixRotationY(((float)-deltaX  * (float)timer.Delta()));
    XMMATRIX yRotation = XMMatrixRotationX(((float)-deltaY * (float)timer.Delta()));

    XMMATRIX view = XMLoadFloat4x4(&cameraMatrix);

    XMFLOAT4 viewVector = XMFLOAT4(cameraMatrix.m[3][0], cameraMatrix.m[3][1], cameraMatrix.m[3][2], 1.0f);
    for (size_t i = 0; i < 3; i++) { cameraMatrix.m[3][i] = 0.0f; }

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

    XMStoreFloat4x4(&cameraMatrix, view);

    cameraMatrix.m[3][0] = viewVector.x;
    cameraMatrix.m[3][1] = viewVector.y;
    cameraMatrix.m[3][2] = viewVector.z;
}

oldCursorPos = cursorPos;

上面是执行旋转到摄像机矩阵的代码,下面是我用来设置视图矩阵等于摄像机矩阵的倒数的代码。这两个操作都在每一帧完成。

XMMATRIX camera = XMLoadFloat4x4(&cameraMatrix);
XMMATRIX view = XMMatrixInverse(NULL, camera);
XMStoreFloat4x4(&sceneMatrix.viewMatrix, view);

这两个片段似乎都不是问题,因为我已经三次检查了我的笔记,这正是我的导师期望它完成的方式。这个错误发生在调试和发布模式中。

如果像你这样有吸引力的人敢于查看其余的代码,我会将源代码放在上面的链接中。注意:这是一个小型的演示应用程序,所以尽量不要畏缩硬编码的对象等。

1 个答案:

答案 0 :(得分:0)

我不确定它是否会导致您的问题,因为简单的演示可能具有一致的帧速率,但您不应该按时间增量缩放鼠标移动。

这些行:

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

应该是

float fRotationSpeed = 0.01f;  // Tweak this.
XMMATRIX xRotation = XMMatrixRotationY(((float)-deltaX  * fRotationSpeed));
XMMATRIX yRotation = XMMatrixRotationX(((float)-deltaY * fRotationSpeed));