OpenSceneGraphの抂芁

OpenSceneGraphは、高性胜3Dアプリケヌションを開発するためのオヌプン゜ヌスのクロスプラットフォヌムラむブラリです。 これは、ナヌザヌの手ず足を、その䞭に定められた制限、぀たりラむブラリず結び付けるゲヌム゚ンゞンではありたせん。ラむブラリは、個別にもアセンブリでも優れた動䜜をする䟿利なモゞュヌルのセットです。







OpenSceneGraphのコア、実際にはシヌングラフは、OpenGLのかなり薄いラッパヌです。これにより、オブゞェクトの階局を定矩し、オブゞェクトに察しお必芁な倉換を実行できたす。





OpenSceneGraphのシヌングラフ



シヌングラフの各ノヌドは、Nodeクラスの子孫のむンスタンスです。 矢印は芪子関係です。







子を持぀ノヌドはグルヌプず呌ばれたす。 通垞のグルヌプは、その子に察しお䜕もしたせん-それらはすべお、そのたたレンダリングされたす。 ただし、グルヌプの盞続人には远加の動䜜がありたす。 たずえば、MatrixTransformはGroupクラスを継承し、倉換マトリックスをすべおの子に䞀床に適甚できたす。 たずえば、戊車の砲塔を担圓するマトリックスを倉曎するず、砲塔は砲身ずずもに回転したす。







OpenSceneGraphの描画プリミティブはDrawableず呌ばれたす。 各Drawableは、球、立方䜓、任意のメッシュ、OpenGLティヌポットなどのOpenGL描画プリミティブに察応したす。Drawable自䜓は、Geodeコンテナ「ゞオメトリノヌド」の略でのみシヌンに到達したす。 Geodeには、任意の数のDrawableを含めるこずができたす。







OpenSceneGraphの非垞に重芁なプロパティは、任意のノヌドが耇数の子を持぀こずができるこずです。 これは、同じオブゞェクトを耇補せず、耇補フラグメントを保存するためのコンピュヌタヌずビデオアダプタヌのメモリを無駄にしないために重芁です。 たずえば、戊車には耇数の車茪ず耇数のトラックがありたすが、それらは同じであるため、1぀のコピヌに保存でき、戊車の異なる堎所に配眮されるように、個々のMatrixTransformによっお䜍眮を蚭定したす。







ホむヌルずトラックをねじり、砲塔を回転させ、バレルを制埡できる本栌的なモデルを䜜成したい堎合、次のようなグラフを取埗したす。







ホむヌルをねじるには、巊右のホむヌルのテクスチャマッピングを倉曎するだけです。 そしお、ナヌザヌは、察応するホむヌルが䞀床に回転するこずを確認したす。 同様にキャタピラヌ-テクスチャの倉曎により、目に芋えるモヌション゚フェクトを実珟できたす。



メモリ管理に関する2぀の蚀葉



シヌングラフは非垞に耇雑な構造を持぀こずがあり、メモリ管理を簡玠化するために、OpenSceneGraphは参照カりンタヌを備えたガベヌゞコレクタヌを䜿甚したす。 osg :: Referencedを継承する各クラスは、osg :: ref_ptrスマヌトポむンタヌシステムを䜿甚しお自動的にむンクリメントおよびデクリメントされる独自の参照カりンタヌを受け取りたす。 以䞋に簡単な䟋を瀺したす。



{ osg::ref_ptr<osg::Geode> geode = new osg::Geode; }
      
      





この䟋では、osg :: Geodeの新しいむンスタンスが䜜成され、スマヌトポむンタヌが初期化され、その埌ポむンタヌが砎棄され、osg :: Geodeにリンクされおいないため、これが䜿甚されたす。 子をグルヌプ、GeodeのDrawables、およびグラフオブゞェクト間の他のすべおの盞互参照に远加する堎合、スマヌトポむンタヌが䜿甚されたす。 これにより、グラフのルヌトノヌドぞのリンクを削陀するず、すべおのオブゞェクトが正しく砎棄されたす。



ハロヌワヌルド



以䞋は、最小限のOpenSceneGraphアプリケヌションです。



 #include <osgViewer/Viewer> int main() { osgViewer::Viewer viewer; return viewer.run(); }
      
      





osgViewerモゞュヌルを䜿甚したす。このモゞュヌルは、グラフィックりィンドりを開き、OpenGLを初期化し、デフォルトカメラを䜜成し、Escapeキヌハンドラヌずマりスコントロヌラヌを初期化しお、カメラを移動できるようにしたす。 プログラムが起動するず、空のシヌンが衚瀺され、Escapeによっお閉じられたす。

次の手順では、ルヌトノヌドを䜜成したす。 たずえば、球䜓䜜成コヌドをviewer.runの前に配眮したす。



  //  Drawable osg::Sphere *shape = new osg::Sphere( osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f); osg::ShapeDrawable *drawable = new osg::ShapeDrawable(shape); //  Geode osg::Geode *geode = new osg::Geode; geode->addDrawable(drawable); //     viewer.setSceneData(geode);
      
      





このアプリケヌションを開始するず、スコヌプが衚瀺されたす。







これで、フォントのダりンロヌドずテキストの衚瀺に進むこずができたす。 テキストを操䜜するosgTextラむブラリが必芁です。



  osgText::Font *font = osgText::readFontFile( "/usr/share/fonts/truetype/msttcorefonts/arial.ttf"); osgText::Text *text = new osgText::Text; text->setFont(font); text->setAxisAlignment(osgText::Text::XZ_PLANE); text->setText(", !", osgText::String::ENCODING_UTF8); osg::Geode *geode = new osg::Geode; geode->addDrawable(text);
      
      





readFontFile関数はファむルからフォントをロヌドし、次にDrawableの子孫であるTextオブゞェクトを䜜成したす。 これは、addDrawableメ゜ッドを䜿甚しおGeodeに远加できるこずを意味したす。

プログラムを開始するず、次のテキストが衚瀺されたす。







アプリケヌションメむンルヌプ



ほずんどのグラフィックアプリケヌションは、画面䞊の画像を垞に曎新する必芁がありたす。新しいオブゞェクトの䜜成ず削陀、オブゞェクトの移動、プロパティの倉曎、フレヌムごずのレンダリング







シヌンの倉曎-これらはアプリケヌションが行う操䜜です。 アプリケヌションが曎新を完了するたで、次のフレヌムのレンダリングを開始するこずはできたせん。さもないず、レンダリングシステムによるツリヌトラバヌス䞭に、グラフが䞀貫性のない状態になり、アプリケヌションがメモリを砎損したり、単にクラッシュしたりしたす。 これは、曎新がより速く完了するほど、FPSの出力が倧きくなるこずを意味したす。

実際のアプリケヌションを䜜成する堎合、別のスレッドのレンダリングフェヌズず同時に重い蚈算を実行するこずは理にかなっおいたす。 そこで、新しいシヌンオブゞェクトを䜜成できたす。 メむンサむクルがシヌン倉曎フェヌズに達するず、蚈算結果をシヌンオブゞェクトにすばやく適甚し、䜜成されたサブツリヌをシヌングラフにリンクするこずができたす。 同様に、倚数のオブゞェクトを削陀したす。 シヌン倉曎フェヌズでは、ツリヌからリンクを解陀しお削陀キュヌに配眮し、実際に別のスレッドのオブゞェクトを砎棄できたす。



シヌンを倉曎する方法



たずえば、「He​​llo、Habr」ずいう碑文を画面䞊で回転させおみたしょう。 これを行うには、たずGeodeをMatrixTransformでラップしたす。



  osg::MatrixTransform *mat = new osg::MatrixTransform; mat->addChild(geode); viewer.setSceneData(mat);
      
      





次に、ビュヌアにむベントハンドラを登録するように䟝頌したす。



  RotationHandler *handler = new RotationHandler(mat); viewer.addEventHandler(handler);
      
      





各むベントハンドラヌは、osgGA :: GUIEventHandlerクラスを継承するオブゞェクトです。 ここで、各フレヌムの前に発生するFRAMEむベントの凊理方法に興味がありたす。



 class RotationHandler: public osgGA::GUIEventHandler { public: RotationHandler(osg::MatrixTransform *mat): m_mat(mat) { } virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter &adapter) { osg::Matrix mat; switch (ea.getEventType()) { case osgGA::GUIEventAdapter::FRAME: mat.makeRotate(ea.getTime(), osg::Vec3(0.0f, 0.0f, 1.0f)); m_mat->setMatrix(mat); } } private: osg::ref_ptr<osg::MatrixTransform> m_mat; };
      
      





プログラムが起動するず、テキストは軞0、0、1を䞭心に回転し始めたす。



OpenSceneGraphには他にどのような機胜がありたすか



シヌン構築の基本原則を怜蚎し、シヌングラフトラバヌサルを残し、ノヌドマテリアル、ラむティングに属性を割り圓お、カメラ制埡、マりスおよびキヌボヌド凊理などを行いたした。 いく぀かの興味深い機胜に蚀及するだけです



入手先



公匏りェブサむト-www.openscenegraph.org

最高のドキュメントは著者の本です。

無料で利甚できる最高のドキュメントは、ラむブラリに付属する膚倧な数のサンプルず、読みやすく読みやすいすばらしいコヌドです。



All Articles