gpt4 book ai didi

c++ - 如何计算相机对象的 View 矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:19 27 4
gpt4 key购买 nike

我有一个旧项目,我正在像这样计算我的 View 矩阵

float4x4 world = m_Frame.GetWorldMat();

float4x4 orthoN = world;
orthoN.XAxis.x = world.XAxis.x;
orthoN.XAxis.y = world.YAxis.x;
orthoN.XAxis.z = world.ZAxis.x;

orthoN.YAxis.x = world.XAxis.y;
orthoN.YAxis.y = world.YAxis.y;
orthoN.YAxis.z = world.ZAxis.y;

orthoN.ZAxis.x = world.XAxis.z;
orthoN.ZAxis.y = world.YAxis.z;
orthoN.ZAxis.z = world.ZAxis.z;

orthoN.WAxis.x = -float3::dotProduct( world.XAxis, world.WAxis );
orthoN.WAxis.y = -float3::dotProduct( world.YAxis, world.WAxis );
orthoN.WAxis.z = -float3::dotProduct( world.ZAxis, world.WAxis );

m_mView = orthoN;

但现在我正在尝试使用 openGL 实现 GLM 库对象

我觉得这样做会行得通

m_mView = glm::inverse( m_Frame.GetWorldMat() );

这似乎没有用。我做错了什么吗?如果一切看起来都很好,我会假设我做错了其他事情,这不是我的观点。

示例数字结果是双向的:

我得到的 glm::inverse 结果很奇怪

1.0, -0.12, -0.85, 0.0,
0.0, 0.87, -0.85, 0.0,
0.0, -0.12, 0.14, 0.0,
0.0, -0.12, -0.85, 1.0

用第一种方法我得到了整数

1.0, 0.0, 0.0, 0.0,
5.0, 6.0, 4.0, 0.0,
35.0, 36.0, 36.0, 0.0,
-1250, -1255, -1285, 1.0

最佳答案

假设 m_Frame.GetWorldMat() 为您提供 View 到世界的变换,您应该反转矩阵以获得世界到 View 的变换。两个片段都做同样的事情。

在较旧的代码中,您通过转置上面的 3x3 矩阵来执行此操作,这表明原始矩阵仅包含旋转,因为旋转是正交的,其逆是其转置。原文翻译也对了。

在第二个片段中,您使用 GLM 执行相同的操作,只是性能会稍差一些,因为它不知道 M 是正交的(纯旋转);因此,它不会转置,而是使用 Cramer 的规则进行适当的逆运算。如果需要,可以使用 GLM 提供的转置函数来避免这种情况。确保您不转置整个 4x4 矩阵,而只转置上面的 3x3 矩阵。然后像在前面的代码中那样单独处理原始翻译。

但是,至于最终结果,两者都会为您提供相同的输出(大约)。您可以通过打印它们或检查调试器中的值来验证这一点。

关于c++ - 如何计算相机对象的 View 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com