大半年没写博客了,今天再次开写!
问题:单独加载某个模型,像cow.osg加载进去后都是恰好大小的显示在我们前面,但有些我们自己做的模型貌似就不一定了,有时太大,有时太小,甚至有时视野里根本就找不到,你以为没加载进来,但你查看场景节点的确又有这个节点。这该怎么解决呢?
第一手动法:
解决:看到比较多的回答是说用相机回调,更新相机的位置,使他离模型的位置刚好合适。但我想,调整相机位置只是加载模型的时候用一次,需要单独写个相机回调吗?后面在论坛上看到一个办法,不需要用回调,就直接调整。整理了一下,实现如下:
//调整相机,使模型居中显示
double radius = mModel->getBound().radius();
double viewDistance = radius/5;//
//方向向上
osg::Vec3d up( 0.0,0.0,1.0 );//osg右x,前y,上z,opengl由osg绕x轴向外旋转90°,
//
osg::Vec3d viewDirection( 0.0,-1.0,0.5 );//
//相机盯着的那个点(目标点,相当于靶心),不一定就是包围球的中点,也可以是场景的原点,这个看情况
osg::Vec3d center = mModel->getBound().center();
//眼睛的位置=目标点+离目标点的距离
osg::Vec3d eye = center + viewDirection * viewDistance;
//相机设置矩阵
m_vViewer->getCameraManipulator()->setHomePosition(eye,center,up);
m_vViewer->home();
其中数据可能要自己再调整一下,这边是让相机45°朝下对准模型。需要注意的就是osg的坐标系,上面也有注释。
第二:自动计算,在一个大神的教程中看到的,简单但不能满足我的要求,所以可以都试试。
m_vViewer->getCameraManipulator()->computeHomePosition();
m_vViewer->getCameraManipulator()->home( 0.0 );