加载一个飞机模型
直接上代码:
1
2
3
4
5
6
7
8#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main() {
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
return viewer->run();
}看看结果
代码很好理解,首先引入了类库,在main函数中,初始化了一个viewer,在这里使用的是osg中的超级指针(还不是很懂),随后给这个viewer设置了sceneData,设置的数据是打开了一个飞机的osg文件,最后就是渲染整个场景了。
与之前接触的Cesium的一些定义是类似的,比如Viewer和Scene。
添加一些帮助事件
cmd中使用
osgviewer glider.osg
跑的程序,自带了一些基础功能,例如缩放、帮助、全屏、显示帧速等等。我们写的程序则是没有键盘事件的,但是保留了缩放、旋转的功能。
先添加一些键盘的监听事件
1
2
3
4
5
6
7
8
//添加帮助事件
viewer->addEventHandler(new osgViewer::HelpHandler);
viewer->addEventHandler(new osgViewer::StatsHandler);
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);现在运行,就会发现
s
、f
、h
都已经有了相应的功能。如果没有反应,检查键盘是不是选择的英语(美国),正确显示如下图。win10似乎是需要自己添加的。
自定义一个帮助事件
这里参考源码中定义帮助页中的行规则
模拟一个事件类,注意定义的命名空间应尽可能的不与osg官方定义冲突。
1
2
3
4
5
6
7class PrintName : public osgGA::GUIEventHandler {
public:
virtual void getUsage(osg::ApplicationUsage& usage) const {
//eno为快捷键名称,emm...为对应的快捷键说明
usage.addKeyboardMouseBinding("eno", "emm.......");
}
};给
viewer
添加帮助事件1
viewer->addEventHandler(new PrintName);
OK,来看看结果,自定义的
eno
已经添加进去了。似乎还挺有趣
添加一个定时器,计算一下读取模型的时间
我们加载模型的方式需要改变一下
1
2
3
4
5
6// old
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
// new
osg::ref_ptr<osg::Node> node = new osg::Node;
node = osgDB::readNodeFile("glider.osg");
viewer->setSceneData(node.get());申请一个定时器类,两个时间类。这里的
Timer_t
相当于long long
1
2
3osg::Timer* timer = new osg::Timer;
osg::Timer_t start_time = 0;
osg::Timer_t end_time = 0;计算时间
1
2
3
4
5
6
7
8
using namespace std;
start_time = timer->tick();
node = osgDB::readNodeFile("glider.osg");
end_time = timer->tick();
cout << "01.模型读取时间为:" << timer->delta_s(start_time, end_time) << endl;结果
看看另一种方法,定义两个单精度时间变量
1
2float start_time_f = 0;
float end_time_f = 0;计算时间
1
2
3
4
5start_time_f = viewer->elapsedTime();
node = osgDB::readNodeFile("glider.osg");
end_time_f = viewer->elapsedTime();
cout << "02.模型读取时间为:" << end_time_f - start_time_f << endl;看看结果
完整代码
1 |
|
原文链接: http://enofeng.github.io/2021/08/19/OSG的HelloWorld/
版权声明: 转载请注明出处.