我有一个旧项目,我正在计算我的视图矩阵
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
答案 0 :(得分:1)
假设m_Frame.GetWorldMat()
为您提供了世界变换的视图,您应该反转矩阵以让世界观察变换。两个片段都是一样的。
在较旧的代码中,你通过转置上面的3x3矩阵来做到这一点,这表明原始矩阵只包含旋转,因为旋转是正交的,它的反转是它的转置。原始翻译也正确地反转。
在第二个片段中,你只使用GLM做同样的事情,因为它不知道M是正交的(纯旋转),它的性能稍差。因此,不是转置它,而是使用克莱默的规则进行适当的逆操作。如果需要,可以使用GLM提供的转置功能来避免这种情况。确保不转置整个4x4矩阵,而只转换上3x3矩阵。然后像在前面的代码中一样单独处理原始翻译。
然而,至于最终结果,两者都会给你相同的输出(大约)。您可以通过打印它们或检查调试器中的值来验证这一点。