2015-08-14 2 views
0

Source Code.DirectX Camera Jitter

Я делаю небольшую демонстрационную сцену 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

Я не уверен, что это вызывает вашу проблему, поскольку простая демонстрация может иметь согласованную частоту кадров, но вы не должны масштабировать движение мыши по временной дельта.

Эти строки:

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

Спасибо! Это исправило это. В моей голове использование time.delta() имело смысл, потому что я хотел отслеживать изменение движения мыши вместе с тем, как быстро это изменение произошло. Но количество изменений за кадр уже достигает этого. Я ценю помощь :) – Dakattack