OSG中相机参数的更改

      修改相机参数时不知怎么回事修改参数又无效了,蛮奇怪了,最后问题解决了,记录一下.

      直接上代码:

#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中相机参数的更改_第1张图片

      上面的代码显示初始的相机参数是:


      这个参数默认是看不到东西的,因为OSG中默认的坐标系是这个样子的:

OSG中相机参数的更改_第2张图片

      这样,如果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);

      即从x轴负半轴看去,看到的应该是飞机的正面,效果如下图:

OSG中相机参数的更改_第3张图片

      正常。在这种情况下场景中是没有漫游器的,也不存在默认的漫游器这个说法,如果需要实现场景漫游,自己加个漫游器就可以了。


      注意:如果直接使用:

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();
}
      很容易看出问题所在了。


      源代码:下载地址




你可能感兴趣的:(Camera,OSG,参数设置无效)