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

时间:2015-01-28 14:29:52

标签: directx directx-11 perspectivecamera projection-matrix assimp

我正在尝试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值在某种程度上是"翻转"。

我多次google搜索无济于事
如果有人能够指出我可能做错了什么,我将非常感激 如果您需要查看我的一些代码来帮助,请告诉我。

1 个答案:

答案 0 :(得分: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