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

Я пробую 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, но безрезультатно.

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

1 ответ

Решение

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

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

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

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

PS: вы должны взглянуть на DirectX Tool Kit

Другие вопросы по тегам