您的位置:首页 > 其它

osg加载模型后使模型居中且以最佳大小显示

2015-01-10 16:04 253 查看
大半年没写博客了,今天再次开写!

问题:单独加载某个模型,像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 );


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐