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中默认的坐标系是这个样子的:
这样,如果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轴负半轴看去,看到的应该是飞机的正面,效果如下图:
正常。在这种情况下场景中是没有漫游器的,也不存在默认的漫游器这个说法,如果需要实现场景漫游,自己加个漫游器就可以了。
注意:如果直接使用:
- 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();
- }
很容易看出问题所在了。
OSG中相机参数的更改的更多相关文章
- 【学习笔记】OSG中相机参数的更改
#pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma commen ...
- osg设置相机参数,包括初始位置
严重注意!!!以下设置必须在viewer.realize();之后,否则不起作用!!!! 设置相机的位置,可以通过CameraManipulator(一般是osgGA::TrackballManipu ...
- Three.js 中 相机的常用参数含义
Three.js 中相机常用的参数有up.position和lookAt. position是指相机所在的位置,将人头比作相机的话,那么position就是人头的中心的位置: up类似于人的脖子可以调 ...
- OSG使用更新回调来更改模型
OSG使用更新回调来更改模型 转自:http://blog.sina.com.cn/s/blog_668aae7801017gl7.html 使用回调类实现对场景图形节点的更新.本节将讲解如何使用回调 ...
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- osg中的视点控制
osg中的视点控制 osg的视点控制基类是CameraManipulator, 它是一个虚基类, 有用的方法都跟home有关. 在这个类里面有三个重要的成员变量: osg::Vec3d _homeEy ...
- ArcEngine中License权限等级更改的问题
曾经认为自己对于ArcGIS 开发许可问题比较理解了,并小结在<ArcEngine10.x开发的许可问题>中. 01.权限问题 今天在调用GP时失败(插值式开发,使用的是他人框架),因为需 ...
- Android AVD创建及设置中各参数详解
设置AVD时有些参数比较模糊,特地找了篇文章,大家参考下! 本文根据如下的模拟器安装做一些解释: Name:自定义虚拟的名称,不能有空格或者其他非法字符,否则不能创建,即Creat AVD不能高亮点击 ...
随机推荐
- bzoj1560
首先这种题目肯定是要先排序,以x为第一关键字,y为第二关键字不难想到O(n2)的dp,下面显然要优化不难发现,由于两点的耗费是坐标差的平方的和,不带根号,因此,不难发现一个很有用的性质,如果从A点能到 ...
- ubuntu下使用ngrok外网映射
好久之前想搞明白这个事情,可是就是不知道这个词叫外网映射,所以也一直不知怎么做,在慕课网看用java开发微信公众号的时候教程里提到了外网映射,查了一些资料终于把本地给映射到外网了,直接变成了80端口, ...
- ACM2096
#include<iostream> int main() { using namespace std; int a,b,count; cin>>count; while(co ...
- 基础排序算法之并归排序(Merge Sort)
并归排序是学习分治法 (Merge Sort) 的好例子.而且它相对于选择,插入,冒泡排序来说,算法性能有一定提升.我首先会描述要解决的问题,并给出一个并归排序的例子.之后是算法的思路以及给出伪代码. ...
- STL之deque、queue、stack、list
首先deque和vector是很像的 但是de代表double双向的队列那么deque可以从首部添加(删除)元素也可以从尾部添加(删除)元素. .push_back(elem) .push_front ...
- Best Premium Private Proxy Service | Lime Proxies
Best Premium Private Proxy Service | Lime Proxies undefined
- Google幻灯片
本博文的主要内容有 .Google幻灯片的介绍 https://www.google.com/intl/zh-CN/slides/about/ 自行去注册Google账号,这里,不多赘述.
- 炮兵阵地 - POJ 1185(状态压缩)
分析:先枚举出来所有的合法状态(当N=10的时候合法状态最多也就60种),用当前状态匹配上一行和上上一行的状态去匹配,看是否可以.....复杂度100*60*60*60,也可以接受. 代码如下: == ...
- Hibernate的游离态与持久态转换
在Hibernate中,一个PO可能经过长时间的操作,session已过时关闭,此时PO已经是一个游离态的对象,这时要转换为持久战态,有下面几种方法: 1.session.saveOrUpdate(o ...
- [Redux] Adding React Router to the Project
We will learn how to add React Router to a Redux project and make it render our root component. Inst ...