Перспективная проекция кажется неправильной, более близкие части модели кажутся меньше и наоборот
Я пробую 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