【osg】viewer.run()与viewer.frame()在使用上的区别

先写结论:加上场景漫游器

	viewer.setCameraManipulator(new osgGA::TrackballManipulator());

 

1 背景

实验需要测帧率并输出

while (!viewer.done())
	{
		if (counts == 0) {
			start_frame_time = timer->tick();
		}
		counts++;
		viewer.frame();

		if (counts == 3)
		{
			counts = 0;
			end_frame_time = timer->tick();
			fout << "当前帧速为: " << 3 / timer->delta_s(start_frame_time, end_frame_time) << std::endl;
		}
	}

上述代码在测试时候,场景中除了HUDtext其他地形视频啥的都没有加进去,改成viewer.run(),可以正常运行场景,但是输出不了帧率(必然输出不了,因为run一次渲染完成,while只循环了一次,counts没有机会等于3),那么问题就出在viewer.frame()上。

2 解决思路

找到run和frame函数的源码,结合OSG:从源码看Viewer::run()

场景的run中首先会判断该场景中有没有漫游器(getCameraManipulator返回一个osgGA::CameraManipulator),如果该场景中不存在漫游器,则调用函数setCameraManipulator创建一个跟踪球 TrackballManipulator的场景漫游器。

frame只负责渲染工作,所以场景需要加上漫游器。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值