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
我试图将一些 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