使用 OpenSceneGraph 逐步 addDrawable 和可视化当前场景图

问题描述

我想用 OpenSceneGraph 运行这个伪代码

while (!done) {
  addNodetoSceneGraph();
  displayCurrentSceneGraph();
  waitForKeypressed();
}

我该如何实现它,最好使用标准的 OSG API?

编辑

这是一个具体的例子:

int main() {
  osgViewer::Viewer viewer;
  osg::Geode*       geode = new osg::Geode();

  viewer.setSceneData(geode);
  geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0,0),1)));

  viewer.frame();
  this_thread::sleep_for(seconds(2));

  geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(2,1)));
  
  return viewer.run();
}

我想调用上面的 viewer.frame()显示一个球体,2 秒后显示第二个球体。它会显示一个 2 秒的空白屏幕。我需要改变什么?

解决方法

调用 setCameraManipulator() 可以解决问题(请参阅 https://groups.google.com/g/osg-users/c/ToHowfxKbvE)。此代码段产生了预期的结果:

int main() {
  osgViewer::Viewer viewer;
  osg::Geode*       geode = new osg::Geode();

  viewer.setCameraManipulator(new osgGA::TrackballManipulator());   
  viewer.setSceneData(geode);
  geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0,0),1)));

  viewer.frame();
  this_thread::sleep_for(seconds(2));

  geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(2,1)));
  
  return viewer.run();
}