|
- gluLookAt(m_vPosition.x(), m_vPosition.y(), m_vPosition.z(),
- m_vView.x(), m_vView.y(), m_vView.z(),
- m_vUpVector.x(), m_vUpVector.y(), m_vUpVector.z() );
- 直接用opengl中的函数, 是可以的,
- gtl::Matrix4f ViewMat, TransMat;
- ViewMat = ViewMat.MakeView(m_vPosition, m_vView, m_vUpVector);
- glMultMatrixf( *ViewMat );
-
- TransMat.setTranslate( gtl::Vec3f(-m_vPosition[0], -m_vPosition[1], -m_vPosition[2]) );
- //glTranslatef(-m_vPosition.x(), -m_vPosition.y(), -m_vPosition.z());
- glMultMatrixf( *TransMat );
-
复制代码 用multiMatrix时,将旋转部分和平移部分分开也是可以的,此时的MakeView函数定义如下:- Matrix4<Type> MakeView( const gtl::Vec3<Type>& eyes, const gtl::Vec3<Type>& position, const gtl::Vec3<Type>& up)
- {
- gtl::Vec3<Type> f = position - eyes;
- f.normalize(); //forward
- gtl::Vec3<Type> s = f.cross(up);
- s.normalize(); //side
- gtl::Vec3<Type> u = s.cross(f);
- return Matrix4<Type>(
- s[0], u[0], -f[0], 0,
- s[1], u[1], -f[1], 0,
- s[2], u[2], -f[2], 0,
- 0.0, 0.0, 0.0, 1 );
- }
复制代码 问题就是当我把旋转部分,平移部分全部放到一个4×4矩阵中,一次执行muliMatrix时结果就不对了,此时MakeView函数如下:- Matrix4<Type> MakeView( const gtl::Vec3<Type>& eyes, const gtl::Vec3<Type>& position, const gtl::Vec3<Type>& up)
- {
- gtl::Vec3<Type> f = position - eyes;
- f.normalize(); //forward
- gtl::Vec3<Type> s = f.cross(up);
- s.normalize(); //side
- gtl::Vec3<Type> u = s.cross(f);
- return Matrix4<Type>(
- s.x(), s.y(), s.z(), 0.0,
- u.x(), u.y(), u.z(), 0.0,
- -f.x(), -f.y(), -f.z(), 0.0,
- -eyes.x(), -eyes.y(), -eyes.z(), 1 );
- }
复制代码 调用:- gtl::Matrix4f ViewMat, TransMat;
- ViewMat = ViewMat.MakeView(m_vPosition, m_vView, m_vUpVector);
- glMultMatrixf( *ViewMat );
复制代码 请问什么原因?谢谢指教。
[ 本帖最后由 dizuo 于 2008-6-12 15:50 编辑 ] |
|