查看: 1849|回复: 2

[求助]run与frame

[复制链接]

该用户从未签到

发表于 2009-3-10 09:40:03 | 显示全部楼层 |阅读模式
写了一段很简单的代码,但是有一个疑问,查了Help也没搞清楚
代码如下:
  1. #include <Windows.h>
  2. #include <osg/Group>
  3. #include <osg/Geometry>
  4. #include <osg/Shape>
  5. #include <osg/ShapeDrawable>
  6. #include <osgViewer/Viewer>
  7. #include <osgUtil/Optimizer>

  8. //场景图形根节点
  9. osg::Group *root = NULL;

  10. void CreateOSG()
  11. {
  12.   root = new osg::Group();

  13.   osg::Box *box = new osg::Box(osg::Vec3(2.0f, 0.0f, 0.0f), 2.0f);
  14.   osg::Geode *geode = new osg::Geode();
  15.   geode->addDrawable(new osg::ShapeDrawable(box));

  16.   root->addChild(geode);

  17.   osgUtil::Optimizer optimizer;
  18.   optimizer.optimize(root);
  19. }

  20. int main ()
  21. {
  22.   osgViewer::Viewer *viewer = new osgViewer::Viewer();

  23.   CreateOSG();
  24.   viewer->setSceneData(root);

  25.   while (!viewer->done())
  26.   {
  27.           viewer->frame();
  28.   }
  29.   
  30.   return 0;
  31. }
复制代码
上述代码无法正常显示正方体
但是将
  1.   while (!viewer->done())
  2.   {
  3.           viewer->frame();
  4.   }
复制代码
换成
  1.   viewer->realize();
  2.   viewer->run();
复制代码
就没有问题了

这个是什么原因呢?

该用户从未签到

发表于 2009-3-10 10:00:27 | 显示全部楼层
Viewer::run()除了执行仿真循环之外,还封装了一些用户常用的漫游设置,其中最重要的就是:
  1. setCameraManipulator( new osgGA::TrackballManipulator );
复制代码
如果您自己使用仿真循环以及frame()函数来工作的话,那么需要在while之前添加这一行语句(或者其他漫游器),否则场景摄像机只会停留在世界原点,因而很可能看不到您加载的模型。
看一看源代码会让您豁然开朗

该用户从未签到

 楼主| 发表于 2009-3-10 10:05:46 | 显示全部楼层
明白了,呵呵
您写的“最长的一帧”,我才刚看了几页,惭愧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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