目录
1. 前言
2. 键盘切换操控器接口说明
3. 总结
1. 前言
osg官方提供了很多操控器,在源码目录下的src\osgGA目录下,cpp文件名含有Manipulator的都是操控器,每个这样的cpp表示一种类型的操控器。其中KeySwitchMatrixManipulator.cpp文件实现了键盘切换操控器。
所谓操控器是指:操控相机运动,从而实现场景视图矩阵变化,反映到观察场景用户的感官上就是:人眼感觉场景变化了,但现实中的物体是没变化的,只是相机方位或距离远近在改变,从而给人视觉上的感觉而已。
所谓键盘切换操控器是指可以通过按下键盘不同键,实现在多个操控器之间切换。这在游戏中很常见,比如:按w键,游戏中的人驾车跑;按q键,则游戏中的人做飞船绕星球飞行等。osg的osgGA::KeySwitchMatrixManipulator类正是为这种需求而开发的。
关于其它操控器的学习,请参考:
- 《osg操控器之动画路径操控器osgGA::AnimationPathManipulator分析》。
2. 键盘切换操控器接口说明
void addMatrixManipulator(int key, std::string name, CameraManipulator *cm);
该接口向键盘切换操控器增加一个操控器对象。其参数说明如下:
- key:表示键盘键虚拟码的值。关于什么是键盘虚拟码,不懂的可以自行百度。
- name:操控器名称。可以随意取。
- cm:操控器对象指针,需自己实现或用osg自带的操控器。
如下代码:
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;
keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );
keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );
创建了一个键盘切换操控器对象,并通过调用addMatrixManipulator向键盘切换操控器依次加入osg自带的跟踪球操控器、飞行操控器、驾驶操控器、地形操控器。如果调用addMatrixManipulator函数后,没有调用selectMatrixManipulator接口(参见后文描述),则当前操控器默认为最后一个加入的操控器,以本例来说就是地形操控器。当场景运行起来后,按下键盘数字1键,则立马切换到跟踪球操控器,此时用鼠标移动模型,则模型按类似球的弧线运动;如果按下2键,则立马切换到飞行操控器,感觉场景就像自己飞一样;依次类推。
void addNumberedMatrixManipulator(CameraManipulator *cm);
addNumberedMatrixManipulator同addMatrixManipulator功能类似,不同点是:该函数在内部会自动以字符串"1"的ASCII码的值即49与当前键盘切换操控器中的操控器数量的和为key,如当前有8个操控器,则调用该函数后,会增加一个49 + 8 = 57为key,以字符串"CameraManipulator"为name的操控器。
void selectMatrixManipulator(unsigned int num);
将索引为num的操控器设置为当前操控器。注意:因为KeySwitchMatrixManipulator类内部是通过map来实现在内存中保存传入的操控器类对象的,该map的key是addMatrixManipulator的第1个参数或addNumberedMatrixManipulator自动生成的一个数值,因为采用的map是默认是按照从小到大排序规则,而selectMatrixManipulator实现是:遍历map,每遍历一个计数就增加1,直到该计数和传入的参数num相等时,就以该操控器为当前操控器,显然这个不一定就是addMatrixManipulator的第1个参数标识的操控器。
CameraManipulator* getMatrixManipulatorWithIndex(unsigned int key);
const CameraManipulator* getMatrixManipulatorWithIndex(unsigned int key) const;
返回指定索引的操控器,类似上面 selectMatrixManipulator接口阐述的含义。
CameraManipulator* getMatrixManipulatorWithKey(unsigned int key);
const CameraManipulator* getMatrixManipulatorWithKey(unsigned int key) const;
通过指定的key(即addMatrixManipulator函数的第1个参数)返回该key标识的操控器对象。 文章来源:https://www.toymoban.com/news/detail-429308.html
3. 总结
键盘切换操控器不是真实的操控器,可以认为是其它真实操控器的容器。可以根据按键变化在不同真实操控器之间切换。文章来源地址https://www.toymoban.com/news/detail-429308.html
到了这里,关于osg操控器之键盘切换操控器osgGA::KeySwitchMatrixManipulator的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!