1. #pragma comment(lib, "osg.lib")
  2. #pragma comment(lib, "osgDB.lib")
  3. #pragma comment(lib, "osgViewer.lib")
  4. #include  "osgViewer/Viewer"
  5. #include  "osgDB/ReadFile"
  6. #include  "osg/Node"
  7. #include "osg/Shape"
  8. #include "osg/Geode"
  9. #include "osg/ShapeDrawable"
  10. int main(){
  11. //初始化视景器
  12. osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;
  13. //初始化场景根节点
  14. osg::ref_ptr<osg::Group> root=new osg::Group;
  15. //场景数据
  16. osg::ref_ptr<osg::Node>  node=osgDB::readNodeFile("glider.osg");
  17. root->addChild(node);
  18. //将场景数据加入视景器中
  19. viewer->setSceneData(root);
  20. //得到相机默认的参数设置
  21. osg::Vec3d eye,center,up;
  22. viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
  23. //将相机参数打印出来
  24. printf("init eye: %f,%f,%f\n",eye._v[0],eye._v[1],eye._v[2]);
  25. printf("init center: %f,%f,%f\n",center._v[0],center._v[1],center._v[2]);
  26. printf("init up: %f,%f,%f\n",up._v[0],up._v[1],up._v[2]);
  27. //修改相机参数
  28. eye=osg::Vec3d(0.0,-10.0,0.0);
  29. center=osg::Vec3d(0.0,0.0,0.0);
  30. up=osg::Vec3d(0.0,0.0,1.0);
  31. //将参数设置给相机,并立即获取相机参数
  32. viewer->getCamera()->setViewMatrixAsLookAt(eye,center,up);
  33. viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
  34. //将参数打印出来
  35. printf("eye: %f,%f,%f new\n",eye._v[0],eye._v[1],eye._v[2]);
  36. printf("center: %f,%f,%f new\n",center._v[0],center._v[1],center._v[2]);
  37. printf("up: %f,%f,%f new\n",up._v[0],up._v[1],up._v[2]);
  38. //仿真循环,注意不要使用viewer->run(),如果使用这个参数,上面关于相机的所有更改都会无效
  39. while(!viewer->done())
  40. {
  41. viewer->frame();
  42. }
  43. return 1;
  44. }

结果如图:

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

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

这样,如果eye在原点,center在z轴负半轴的情况下是看不到东西,所以如果不自己手动设置参数是看不到的东西的。如下面的代码将设置相机位置的代码注释掉:

  1. #pragma comment(lib, "osg.lib")
  2. #pragma comment(lib, "osgDB.lib")
  3. #pragma comment(lib, "osgViewer.lib")
  4. #include  "osgViewer/Viewer"
  5. #include  "osgDB/ReadFile"
  6. #include  "osg/Node"
  7. #include "osg/Shape"
  8. #include "osg/Geode"
  9. #include "osg/ShapeDrawable"
  10. int main(){
  11. //初始化视景器
  12. osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;
  13. //初始化场景根节点
  14. osg::ref_ptr<osg::Group> root=new osg::Group;
  15. //场景数据
  16. osg::ref_ptr<osg::Node>  node=osgDB::readNodeFile("glider.osg");
  17. root->addChild(node);
  18. //将场景数据加入视景器中
  19. viewer->setSceneData(root);
  20. //得到相机默认的参数设置
  21. osg::Vec3d eye,center,up;
  22. viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
  23. //将相机参数打印出来
  24. printf("init eye: %f,%f,%f\n",eye._v[0],eye._v[1],eye._v[2]);
  25. printf("init center: %f,%f,%f\n",center._v[0],center._v[1],center._v[2]);
  26. printf("init up: %f,%f,%f\n",up._v[0],up._v[1],up._v[2]);
  27. ////修改相机参数
  28. //eye=osg::Vec3d(0.0,-10.0,0.0);
  29. //center=osg::Vec3d(0.0,0.0,0.0);
  30. //up=osg::Vec3d(0.0,0.0,1.0);
  31. ////将参数设置给相机,并立即获取相机参数
  32. //viewer->getCamera()->setViewMatrixAsLookAt(eye,center,up);
  33. //viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
  34. ////将参数打印出来
  35. //printf("eye: %f,%f,%f new\n",eye._v[0],eye._v[1],eye._v[2]);
  36. //printf("center: %f,%f,%f new\n",center._v[0],center._v[1],center._v[2]);
  37. //printf("up: %f,%f,%f new\n",up._v[0],up._v[1],up._v[2]);
  38. //仿真循环,注意不要使用viewer->run(),如果使用这个参数,上面关于相机的所有更改都会无效
  39. while(!viewer->done())
  40. {
  41. viewer->frame();
  42. }
  43. return 1;
  44. }

在这种情况下的效果如下图,什么都看不到:

使用下面这一组测试数据后:

  1. //修改相机参数
  2. eye=osg::Vec3d(-10.0,0.0,0.0);
  3. center=osg::Vec3d(0.0,0.0,0.0);
  4. up=osg::Vec3d(0.0,0.0,1.0);

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

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

注意:如果直接使用:

  1. viewer->run();

怎么修改相机参数都是无效的,
      即使加上

  1. viewer->setCameraManipulator(NULL);

也是一样,因为在

  1. viewer->run();

这个函数里会对场景中是否存在漫游器进行判断,如果没有漫游器,它会自己添加一个TrackballManipulator漫游器。

run函数的实现如下:

  1. int Viewer::run()
  2. {
  3. if (!getCameraManipulator() && getCamera()->getAllowEventFocus())
  4. {
  5. setCameraManipulator(new osgGA::TrackballManipulator());
  6. }
  7. setReleaseContextAtEndOfFrameHint(false);
  8. return ViewerBase::run();
  9. }

很容易看出问题所在了。

OSG中相机参数的更改的更多相关文章

  1. 【学习笔记】OSG中相机参数的更改

    #pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma commen ...

  2. osg设置相机参数,包括初始位置

    严重注意!!!以下设置必须在viewer.realize();之后,否则不起作用!!!! 设置相机的位置,可以通过CameraManipulator(一般是osgGA::TrackballManipu ...

  3. Three.js 中 相机的常用参数含义

    Three.js 中相机常用的参数有up.position和lookAt. position是指相机所在的位置,将人头比作相机的话,那么position就是人头的中心的位置: up类似于人的脖子可以调 ...

  4. OSG使用更新回调来更改模型

    OSG使用更新回调来更改模型 转自:http://blog.sina.com.cn/s/blog_668aae7801017gl7.html 使用回调类实现对场景图形节点的更新.本节将讲解如何使用回调 ...

  5. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  6. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  7. osg中的视点控制

    osg中的视点控制 osg的视点控制基类是CameraManipulator, 它是一个虚基类, 有用的方法都跟home有关. 在这个类里面有三个重要的成员变量: osg::Vec3d _homeEy ...

  8. ArcEngine中License权限等级更改的问题

    曾经认为自己对于ArcGIS 开发许可问题比较理解了,并小结在<ArcEngine10.x开发的许可问题>中. 01.权限问题 今天在调用GP时失败(插值式开发,使用的是他人框架),因为需 ...

  9. Android AVD创建及设置中各参数详解

    设置AVD时有些参数比较模糊,特地找了篇文章,大家参考下! 本文根据如下的模拟器安装做一些解释: Name:自定义虚拟的名称,不能有空格或者其他非法字符,否则不能创建,即Creat AVD不能高亮点击 ...

随机推荐

  1. android日历控件(一)

    自定义日历并且具备设置今天以前的时间不可点选,以前的颜色和当前的颜色不同,以及获取两次点击日期之间间隔的天数所以说细节比较多 个人习惯,先上图 靠,笔记本不知道怎么回事,禁用到触摸板之后 再次唤醒屏幕 ...

  2. Delphi 6 Web Services初步评估

    Delphi 6 Web Services初步评估这是我刚到现在公司的时候(2001年8月份)所作的一份测试报告,现公布出来,希望能对大家有所帮助.因为当时d6刚刚发行,Web Service方面还存 ...

  3. HDOJ 2030 汉字统计

    Problem Description 统计给定文本文件中汉字的个数. Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本. Output 对于每一段文本,输出其中的汉字的个数 ...

  4. TCP Connection Establishment and Termination

    Three-Way Handshake The following scenario occurs when a TCP connection is established: The server m ...

  5. 《Linear Algebra and Its Applications》-chaper6-正交性和最小二乘法- 格拉姆-施密特方法

    构造R^n子空间W一组正交基的算法:格拉姆-施密特方法.

  6. 《University Calculus》-chape8-无穷序列和无穷级数-基本极限恒等式

    基于基本的极限分析方法(诸多的无穷小以及洛必达法则),我们能够得到推导出一些表面上看不是那么显然的式子,这些极限恒等式往往会在其他的推导过程中用到,其中一个例子就是概率论中的极限定理那部分知识.

  7. Error, some other host already uses address

    rhel 5.9,在修改完网卡配置信息重启网卡之后提示如下无法激活网卡: Error, some other host already uses address 确认配置的IP地址是没有在用的,解决办 ...

  8. 2016 GDCPC 省赛总结

    大神们说,要多写博客,多总结,于是很久之前就开了博客,可是一篇文章都没有写,太懒也是,没什么时间也是.现在省赛结束了,也是时候好好总结一下了. 本来一开始,三个人对拿铜牌是很有把握的,在比赛一开始A了 ...

  9. 数据库的发展现状与前景——NewSQL界的佼佼者,如Couchbase、Aerospike、Marklogic和 SequoiaDB,NewSQL的许多厂商,如:MemSQL、VoltDB、ScaleDB和CitusDB

    转自:http://news.sequoiadb.com/cn/Detail-id-42 2015-03-20   Strata+Hadoop World(SHW)大会是全世界最大的大数据大会之一. ...

  10. ORACLE EXP命令

    本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其对应的參数进行了说明,然后通过一些演示样例进行演练,加深理解.文章最后对运用这两个命令可能出现的问题(如权限不够,不同o ...