Friday, 6 July 2007

OpenSceneGraph






3Dのオブジェクトの配置を木構造で記録するフォーマットと、それを操作するC++のライブラリだそうです。



http://www.openscenegraph.com/index.php



初代PlayStation の時には、LightWave 3Dを使ってました。その書き出しファイルをPlayStationの描画コマンドに変換して使うという感じ。



PS2の時には、Open/GLが実はついていた。Silcon Graphics のGLから派生した規格なけなんだけど... Open/GLはゴミだと思う。まぁ、Raw level interface だってのはそうなんだけど、



  glClearColor( 0.0, 0.0, 0.0, 1.0 );

  glBegin( GL_QUADS );

  glColor3fv(color[0]);



ってわけで、gl->clearColor() とかいう形式でさえない。Begin/End ってことは、後ろに隠れたスタックとかキューとかがあるってことだろ? ハンガリー記法もなんだかなぁ。実は、3Dグラフィックスはfloat/doubleに敏感なので便利だったりはするんだが。



ってなわけなので、XMLを使った独自の3D記述を実装して使ってました。



PS3 では、Open/GL実装なOSMesa を使わざるを得ない。もっとも、Open/GLを使うことにすれば、それの上位ライブラリはいろいろある。OpenSceneGraph もそんなものです。



C++ ってのがいまいちなんだが、それほど、ひどい使い方はしてない。C++ってのは、朴訥に使うものなんだよ。つまり、Template とかoperator override とか、auto_ptrホゲで、「お前たちにはわからないだろ」的な使い方はしてないってこと。



  geom->setNormalArray(normals);

  geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

  

  geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,coordInd

ices->size()));



ってな感じ。名前空間が汚れまくる(module 化されているとは言え...)のは、C++の原理的な欠点だな。このあたりは、メタプログラミングが必須という気はする。



SceneGraph 自体は、VRML的な構文になっている。VRMLも見た時には「えぇ〜?」という印象があって、一応、PS用のVRML viewerは作ってもらったんだけど、結局、捨てちゃったんだよな。



Geode {

 UniqueID Geode_0

 DataVariance DYNAMIC

 name "glider.osg"

 cullingActive TRUE

 num_drawables 6

 Geometry {

  DataVariance DYNAMIC

  StateSet {

   UniqueID StateSet_1

   DataVariance STATIC

   rendering_hint OPAQUE_BIN

   renderBinMode INHERIT





Java3DのSceneGraph も悪くない。こっちは、XMLらしい。Readerを作るのは簡単そうだ。



4年次に作ってもらっているものもあるので、このあたりは、いろいろできそう。



もっとも、現在のネックは、OSMesaのスピードなので、それをなんとかしないとダメなんだが...

No comments: