先写结论:加上场景漫游器
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只负责渲染工作,所以场景需要加上漫游器。