查看: 5259|回复: 2

矩阵问题

[复制链接]

该用户从未签到

发表于 2008-6-12 15:48:49 | 显示全部楼层 |阅读模式
  1.            gluLookAt(m_vPosition.x(), m_vPosition.y(), m_vPosition.z(),       
  2.                              m_vView.x(),         m_vView.y(),     m_vView.z(),       
  3.                              m_vUpVector.x(), m_vUpVector.y(), m_vUpVector.z() );
  4. 直接用opengl中的函数, 是可以的,
  5.           gtl::Matrix4f ViewMat, TransMat;
  6.           ViewMat = ViewMat.MakeView(m_vPosition, m_vView, m_vUpVector);       
  7.         glMultMatrixf( *ViewMat );
  8.        
  9.         TransMat.setTranslate( gtl::Vec3f(-m_vPosition[0], -m_vPosition[1], -m_vPosition[2]) );
  10.         //glTranslatef(-m_vPosition.x(), -m_vPosition.y(), -m_vPosition.z());
  11.         glMultMatrixf( *TransMat );
  12.        
复制代码
用multiMatrix时,将旋转部分和平移部分分开也是可以的,此时的MakeView函数定义如下:
  1. Matrix4<Type> MakeView( const gtl::Vec3<Type>& eyes, const gtl::Vec3<Type>& position, const gtl::Vec3<Type>& up)
  2. {
  3.         gtl::Vec3<Type> f = position - eyes;       
  4. f.normalize();        //forward
  5.         gtl::Vec3<Type> s = f.cross(up);               
  6. s.normalize();        //side
  7.         gtl::Vec3<Type> u = s.cross(f);

  8.         return Matrix4<Type>(
  9.                 s[0],        u[0],        -f[0], 0,
  10.                 s[1],        u[1],        -f[1], 0,
  11.                 s[2],        u[2],        -f[2], 0,
  12.                 0.0, 0.0, 0.0, 1 );
  13. }
复制代码
问题就是当我把旋转部分,平移部分全部放到一个4×4矩阵中,一次执行muliMatrix时结果就不对了,此时MakeView函数如下:
  1. Matrix4<Type> MakeView( const gtl::Vec3<Type>& eyes, const gtl::Vec3<Type>& position, const gtl::Vec3<Type>& up)
  2. {
  3.         gtl::Vec3<Type> f = position - eyes;       
  4. f.normalize();        //forward
  5.         gtl::Vec3<Type> s = f.cross(up);               
  6. s.normalize();        //side
  7.         gtl::Vec3<Type> u = s.cross(f);

  8.         return Matrix4<Type>(
  9.                 s.x(),        s.y(),        s.z(),  0.0,
  10.                 u.x(),        u.y(),        u.z(),  0.0,
  11.                 -f.x(),        -f.y(),        -f.z(), 0.0,
  12.                 -eyes.x(), -eyes.y(), -eyes.z(), 1 );
  13. }
复制代码
调用:
  1.           gtl::Matrix4f ViewMat, TransMat;
  2.           ViewMat = ViewMat.MakeView(m_vPosition, m_vView, m_vUpVector);       
  3.         glMultMatrixf( *ViewMat );
复制代码
请问什么原因?谢谢指教。

[ 本帖最后由 dizuo 于 2008-6-12 15:50 编辑 ]

该用户从未签到

发表于 2008-6-12 18:19:20 | 显示全部楼层
先缩放后平移的话,平移动作参照的坐标系已经改变了
如果把这些动作放在同一个变换矩阵中,那么平移坐标的参照系不变

该用户从未签到

发表于 2011-2-19 09:47:56 | 显示全部楼层
能举一个伪码的例子么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表