修改相机参数时不知怎么回事修改参数又无效了,蛮奇怪了,最后问题解决了,记录一下.
直接上代码:
#pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma comment(lib, "osgViewer.lib") #include "osgViewer/Viewer" #include "osgDB/ReadFile" #include "osg/Node" #include "osg/Shape" #include "osg/Geode" #include "osg/ShapeDrawable" int main(){ //初始化视景器 osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer; //初始化场景根节点 osg::ref_ptr<osg::Group> root=new osg::Group; //场景数据 osg::ref_ptr<osg::Node> node=osgDB::readNodeFile("glider.osg"); root->addChild(node); //将场景数据加入视景器中 viewer->setSceneData(root); //得到相机默认的参数设置 osg::Vec3d eye,center,up; viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up); //将相机参数打印出来 printf("init eye: %f,%f,%f\n",eye._v[0],eye._v[1],eye._v[2]); printf("init center: %f,%f,%f\n",center._v[0],center._v[1],center._v[2]); printf("init up: %f,%f,%f\n",up._v[0],up._v[1],up._v[2]); //修改相机参数 eye=osg::Vec3d(0.0,-10.0,0.0); center=osg::Vec3d(0.0,0.0,0.0); up=osg::Vec3d(0.0,0.0,1.0); //将参数设置给相机,并立即获取相机参数 viewer->getCamera()->setViewMatrixAsLookAt(eye,center,up); viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up); //将参数打印出来 printf("eye: %f,%f,%f new\n",eye._v[0],eye._v[1],eye._v[2]); printf("center: %f,%f,%f new\n",center._v[0],center._v[1],center._v[2]); printf("up: %f,%f,%f new\n",up._v[0],up._v[1],up._v[2]); //仿真循环,注意不要使用viewer->run(),如果使用这个参数,上面关于相机的所有更改都会无效 while(!viewer->done()) { viewer->frame(); } return 1; }
上面的代码显示初始的相机参数是:
这个参数默认是看不到东西的,因为OSG中默认的坐标系是这个样子的:
这样,如果eye在原点,center在z轴负半轴的情况下是看不到东西,所以如果不自己手动设置参数是看不到的东西的。如下面的代码将设置相机位置的代码注释掉:
#pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma comment(lib, "osgViewer.lib") #include "osgViewer/Viewer" #include "osgDB/ReadFile" #include "osg/Node" #include "osg/Shape" #include "osg/Geode" #include "osg/ShapeDrawable" int main(){ //初始化视景器 osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer; //初始化场景根节点 osg::ref_ptr<osg::Group> root=new osg::Group; //场景数据 osg::ref_ptr<osg::Node> node=osgDB::readNodeFile("glider.osg"); root->addChild(node); //将场景数据加入视景器中 viewer->setSceneData(root); //得到相机默认的参数设置 osg::Vec3d eye,center,up; viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up); //将相机参数打印出来 printf("init eye: %f,%f,%f\n",eye._v[0],eye._v[1],eye._v[2]); printf("init center: %f,%f,%f\n",center._v[0],center._v[1],center._v[2]); printf("init up: %f,%f,%f\n",up._v[0],up._v[1],up._v[2]); ////修改相机参数 //eye=osg::Vec3d(0.0,-10.0,0.0); //center=osg::Vec3d(0.0,0.0,0.0); //up=osg::Vec3d(0.0,0.0,1.0); ////将参数设置给相机,并立即获取相机参数 //viewer->getCamera()->setViewMatrixAsLookAt(eye,center,up); //viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up); ////将参数打印出来 //printf("eye: %f,%f,%f new\n",eye._v[0],eye._v[1],eye._v[2]); //printf("center: %f,%f,%f new\n",center._v[0],center._v[1],center._v[2]); //printf("up: %f,%f,%f new\n",up._v[0],up._v[1],up._v[2]); //仿真循环,注意不要使用viewer->run(),如果使用这个参数,上面关于相机的所有更改都会无效 while(!viewer->done()) { viewer->frame(); } return 1; }
在这种情况下的效果如下图,什么都看不到:
使用下面这一组测试数据后:
//修改相机参数 eye=osg::Vec3d(-10.0,0.0,0.0); center=osg::Vec3d(0.0,0.0,0.0); up=osg::Vec3d(0.0,0.0,1.0);
正常。在这种情况下场景中是没有漫游器的,也不存在默认的漫游器这个说法,如果需要实现场景漫游,自己加个漫游器就可以了。
注意:如果直接使用:
viewer->run();怎么修改相机参数都是无效的,
viewer->setCameraManipulator(NULL);也是一样,因为在
viewer->run();这个函数里会对场景中是否存在漫游器进行判断,如果没有漫游器,它会自己添加一个TrackballManipulator漫游器。
run函数的实现如下:
int Viewer::run() { if (!getCameraManipulator() && getCamera()->getAllowEventFocus()) { setCameraManipulator(new osgGA::TrackballManipulator()); } setReleaseContextAtEndOfFrameHint(false); return ViewerBase::run(); }很容易看出问题所在了。
源代码:下载地址