查看: 2114|回复: 4

如何修改Camera的位置

[复制链接]

该用户从未签到

发表于 2009-4-25 17:05:39 | 显示全部楼层 |阅读模式
如何在在main中修改camera的位置
例如:
  1. #include <osgDB/ReadFile>
  2. #include <osgViewer/Viewer>
  3. #include <osg/Node>

  4. #include <osg/MatrixTransform>
  5. #include <osg/Geometry>
  6. #include <osg/Camera>

  7. osg::ref_ptr<osg::Node> createQuad()
  8. {

  9.     osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

  10.         //首先定义四个点
  11.     osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  12.     geom->setVertexArray( v.get() );
  13.     v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );
  14.     v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );
  15.     v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );
  16.     v->push_back( osg::Vec3( -1.f, 0.f, 1.f ) );

  17.     //定义颜色数组
  18.     osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  19.     geom->setColorArray( c.get() );
  20.     geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
  21.     c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
  22.     c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
  23.     c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
  24.     c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );

  25.     //定义法线
  26.     osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
  27.     geom->setNormalArray( n.get() );
  28.     geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
  29.     n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );

  30.     //设置顶点关联方式
  31.     geom->addPrimitiveSet(
  32.         new osg::rawArrays( osg::rimitiveSet::UADS, 0, 4 ) );

  33.     //几何组结点
  34.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  35.     geode->addDrawable( geom.get() );
  36.     return geode.get();
  37. }

  38. void main()
  39. {
  40.     osgViewer::Viewer viewer;
  41.     osg::ref_ptr<osg::Node> master=createQuad();
  42.         
  43.         osg::ref_ptr<osg::Group> root=new osg::Group;
  44.         osg::ref_ptr<osg::MatrixTransform> trans=new osg::MatrixTransform;
  45.         
  46.         trans->addChild(master.get());
  47.         root->addChild(trans.get());
  48.         viewer.setSceneData(root.get());
  49.         osg::ref_ptr<osg::Camera> camera=viewer.getCamera();
  50.         osg::Vec3 eye(20.f, 0.f, 10.f);
  51.         osg::Vec3 center(0.f, 0.f, -25.f);
  52.         osg::Vec3 up(0.f, 1.f, 0.f);
  53.         camera->setViewMatrixAsLookAt(eye, center, up);
  54.     viewer.realize();
  55.     viewer.run();
  56. }
复制代码
虽然我在main里重设了camera的位置
可是程序运行时和没设置时的一样

file:///E:\\2009-04-25_164525.jpg
总是这么个四边形

我试了好久都没有奏效
请Array或者FreeSouth老兄帮个忙

[ 本帖最后由 philips123 于 2009-4-25 17:09 编辑 ]

该用户从未签到

 楼主| 发表于 2009-4-25 17:11:15 | 显示全部楼层
图片上传不上去,郁闷
就是一个四边形四个角有四个颜色然后渐进向中间混合的那种
在快速入门指导里有

该用户从未签到

发表于 2009-4-25 20:47:25 | 显示全部楼层
是的,仿真循环运行时您的camera设置会被重置,因为场景漫游器(默认为TrackballManipulator)会自动根据用户交互命令更新摄像机的位置。要应用您自己的设置,可以取消使用场景漫游器(不要使用viewer.run(),在仿真循环之前不要使用setCameraManipulator函数设置);也可以自己派生一个新的MatrixManpulator

该用户从未签到

 楼主| 发表于 2009-4-26 14:25:21 | 显示全部楼层
哦,原来是在run之后被更新了,我说怎么无效呢,呵呵

但是如果不使用run方法的话,又如何显示场景呢
我试过
while(!viewer.done())
{
    viewer.frame();
}
这个方法只显示了一个背景其他什么也显示不出来

Array能给个提示么?

该用户从未签到

发表于 2009-4-26 15:05:40 | 显示全部楼层
还是同样的道理,使用while循环的时候,要自行用setCameraManipulator设置一个场景漫游器,例如Trackball;或者自行使用setViewMatrixAsLookAt和setProjectionMatrix设置摄像机的位置,如果还是显示不出来说明您设置的不正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表