C# Matrix4x4 等价于 DirectX::XMMatrixPerspectiveLH

C# Matrix4x4 equivalent of DirectX::XMMatrixPerspectiveLH

我试图将一些 C++ 代码移植到 C#,除透视外一切正常。

在 c++ 中,代码看起来像这样,没有失真。

DirectX::XMMatrixTranspose(
                DirectX::XMMatrixRotationZ(100) *
                DirectX::XMMatrixRotationX(200) *
                DirectX::XMMatrixTranslation(0,0,4) *
                DirectX::XMMatrixPerspectiveLH(DirectX::XMConvertToRadians(180),pAdapter->aspectRatio,0.5f,10)

和这样的 C# 代码

Matrix4x4.Transpose(
            Matrix4x4.CreateRotationZ(100) *
            Matrix4x4.CreateRotationX(200) *
            Matrix4x4.CreateTranslation(0, 0, 4) *
            Matrix4x4.CreatePerspective(1.39626f, 1.7777777777777777777777777777778f, 0.5f,10)
            );

我假设这两者的作用完全相同,但 C# 代码根本没有出现,当我删除它呈现的透视图但一切都按预期进行拉伸时。

我试图重新制作 dxmath 的源代码,导致了这个结果,它现在呈现得更远了,但它仍然被拉伸了。

Matrix4x4 perspective = new Matrix4x4();
float ViewWidth = 1.39626f;
float ViewHeight = 1.7777777777777777777777777777778f;
float NearZ = 0.5f;
float FarZ = 10.0f;
float TwoNearZ = NearZ + NearZ;
float fRange = FarZ / (NearZ - FarZ);

perspective.M11 = TwoNearZ / ViewWidth;
perspective.M22 = TwoNearZ / ViewHeight;
perspective.M33 = fRange;
perspective.M43 = -fRange * NearZ;

data.matrix = perspective * data.matrix;

我不太确定问题出在哪里,我在另一个 post 中读到 matrix4x4 是右手的,所以我尝试了同样的方法,但它根本没有渲染。感谢任何帮助。

您使用的透视矩阵出现异常。我建议您使用 OpenGL 文档中更经典的实现。另外,请注意,您没有将透视矩阵的 M44 值显式设置为 0.0f,而默认单位矩阵的此值设置为 1.0f。这会导致错误的透视矩阵。

float frustumDepth = farDist - nearDist;  
float oneOverDepth = 1 / frustumDepth;

perspective.M22 = (float)(1.0f / Math.Tan(0.5f * fovRadians));
perspective.M11 = 1.0f * perspective.M22 / aspectRatio; 
perspective.M33 = farDist * oneOverDepth; 
perspective.M34 = 1.0f; 
perspective.M43 = (farDist * nearDist) * oneOverDepth; 
perspective.M44 = 0.0f;              //< replace 1.0f to 0.0f