Перспективная проекция кажется неправильной, более близкие части модели кажутся меньше и наоборот

Я пробую D3D11 и изо всех сил пытаюсь правильно отобразить модель.

Вот моя проблема; в то время как мои преобразования мира и вида кажутся правильными,
мое преобразование перспективы кажется неправильным.
Когда я впервые визуализировал модель, что-то было не так, поэтому я попытался повернуть модель, чтобы увидеть, что это было.
Затем Я заметил, что части модели ближе к камере кажутся меньше, а остальные части кажутся больше.

Если это уместно, я использую assimp для загрузки моей модели, и вот как я это делаю.

mScene = aiImportFile(filename.c_str(), aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_GenSmoothNormals | aiProcess_ConvertToLeftHanded | aiProcess_TransformUVCoords);

А вот как я строю матрицу проекций.

mProjection = XMMatrixPerspectiveFovLH(XMConvertToRadians(45.0f), 800.0f / 600.0f, -1.0f, 1.0f);

Я возился с аргументами NearZ и FarZ функции XMMatrixPerspectiveFovLH.
Я пробовал постепенно увеличивать farZ в каждом кадре, а затем понял, что по мере увеличения значения дальняя плоскость отсечения все больше и больше приближается к камере, что прямо противоположно тому, что я думал, что произойдет.

Вот что я делаю в вершинном шейдере с позициями вершин. Это довольно просто.

Out.Position = mul(mul(mul(position, World), CameraView), CameraProjection);

Модель корректно отображается с точки зрения положения, масштабирования, поворота и положения вида.
Итак, я предполагаю, что преобразования мира и вида в порядке, а проблема связана с матрицей проекции.
Подводя итог, я думаю, что значения Z проецируемых вершин каким-то образом "перевернуты".

Я много раз искал в Google, но безрезультатно.

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


person JamesAMD    schedule 28.01.2015    source источник


Ответы (1)


Ваши ближние и дальние расстояния должны быть положительными.

Используйте что-то вроде:

mProjection = XMMatrixPerspectiveFovLH(XMConvertToRadians(45.0f), 800.0f / 600.0f, 0.1f, 10.0f);

Я сделаю заметку, чтобы рассмотреть возможность добавления assert( NearZ > 0.f); assert( NearZ < FarZ ); к этим функциям DirectXMath и убедиться, что это явно указано в документации. расстояние здесь означает положительное число.

PS: Вам следует ознакомиться с набором инструментов DirectX.

person Chuck Walbourn    schedule 28.01.2015
comment
Спасибо. Ваше решение сработало, ближние и дальние расстояния должны быть положительными. - person JamesAMD; 29.01.2015