透视投影似乎是错误的,模型的较近部分显得较小,反之亦然

Perspective projection seems wrong, closer parts of a model appear smaller and vice versa

我正在试用 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);

我摆弄了 XMMatrixPerspectiveFovLH 的 nearZ 和 farZ 参数。
我试着每帧逐渐增加 farZ,然后发现随着值的增加,远裁剪平面离相机越来越近,这与我想象的完全相反。

在顶点着色器中,这是我对顶点位置所做的。非常基础。

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

模型在位置、缩放、旋转和视图位置方面正确呈现。
所以我假设世界和视图变换都很好,问题出在投影矩阵上。
总而言之,我认为投影顶点的 Z 值在某种程度上是 "flipped".

我google-搜索了很多次都无济于事。

如果有人能指出我可能做错了什么,将不胜感激。
如果您需要查看我的一些代码以提供帮助,请告诉我。

你的近平面和远平面距离应该是正的。

使用类似的东西:

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