我正在制作一个小型的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);
这两个片段似乎都不是问题,因为我已经三次检查了我的笔记,这正是我的导师期望它完成的方式。这个错误发生在调试和发布模式中。
如果像你这样有吸引力的人敢于查看其余的代码,我会将源代码放在上面的链接中。注意:这是一个小型的演示应用程序,所以尽量不要畏缩硬编码的对象等。
答案 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));