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

大半年没写博客了,今天再次开写!

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



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页