OSG提供了几种manipulator(操作器),已经能胜任很多场合了。但玩过射击类游戏的都比较熟悉使用按键的方式控制人物角色的移动,自己也想来实现一个,于是参考了OSG程序设计 一书,进行实现。
##功能:
- W或者↑箭头:前进
- S或者↓箭头:后退
- A或者←箭头:向左
- D或者→箭头:向右
- Q:左旋转
- E:右旋转
- 鼠标左键拖动:左右视角
- 鼠标右键拖动:上下视角
- 鼠标中键:放大或者缩小
- +:加速移动
- -:减速移动
##关键点
1、视口矩阵的运算方式:
osg::Matrixd CustomManipulator::getMatrix() const
{
// 返回视口的矩阵
osg::Matrixd mat;
mat.makeRotate(m_vecRotation._v[0], osg::Vec3d(1.0, 0.0, 0.0),
m_vecRotation._v[1], osg::Vec3d(0.0, 1.0, 0.0),
m_vecRotation._v[2], osg::Vec3d(0.0, 0.0, 1.0));
return mat * osg::Matrixd::translate(m_vecPosition);
}
2、视口矩阵的逆矩阵:这个就比较好求了,直接对视口矩阵求逆
osg::Matrixd CustomManipulator::getInverseM