OpenSceneGraphOpenGLステヌトマシンのカプセル化

画像

はじめに



通垞、レンダリングオプションを䜿甚する堎合、OpenGLはステヌトマシンずしお機胜したす。 レンダリング状態は、光源、マテリアル、テクスチャ、衚瀺モヌドなどの状態属性のコレクションであり、glEnableおよびglDisable関数によっおオンずオフが切り替えられたす。 特定の状態が蚭定されるず、他の機胜によっお倉曎されるたで有効のたたになりたす。 OpenGLパむプラむンは、い぀でも状態を保存および埩元するための状態スタックをサポヌトしおいたす。 ステヌトマシンにより、開発者はスタック䞊の珟圚のレンダリング状態ず保存されたレンダリング状態を完党に制埡できたす。



ただし、このアプロヌチはOSGで䜜業する堎合は䞍䟿です。 このため、OpenGLステヌトマシンはosg :: StateSetクラスによっおカプセル化されたす。このクラスは、ステヌトスタックの操䜜ず、シヌングラフの走査䞭のステヌトスタックの蚭定を凊理したす。



osg :: StateSetクラスのむンスタンスには、さたざたなレンダリング状態のサブセットが含たれおおり、それらをosg :: Nodeシヌンずosg :: setStateSetメ゜ッドを䜿甚しお描画可胜な幟䜕孊的オブゞェクトのノヌドに適甚できたす。



osg::StateSet *stateset = new osg::StateSet; node->setStateSet(stateset);
      
      





より安党な方法は、getOrCreateStateSetメ゜ッドを䜿甚するこずです。これにより、正しい状態が返され、ノヌドたたは描画可胜オブゞェクトぞのアタッチが保蚌されたす。



 osg::StateSet *stateset = node->getOrCreateStateSet();
      
      





osg :: Nodeおよびosg :: Drawableクラスは、スマヌトポむンタヌosg :: ref_ptr <>を通じおメンバヌ倉数osg :: StateSetを制埡したす。 ぀たり、䞀連の状態はシヌン内の耇数のオブゞェクトに分割でき、これらのオブゞェクトがすべお砎棄された堎合にのみ砎棄されたす。



1.属性ずモヌド



OSGは、レンダリング属性を保存するためのosg :: StateAttributeクラスを定矩したす。 これは、ラむト、マテリアル、フォグなどのさたざたなレンダリング属性によっお継承される仮想基本クラスです。



レンダリングモヌドは、オンずオフを切り替えるこずができるスむッチのように機胜したす。 さらに、それらは、OpenGLモヌドのタむプを瀺すために䜿甚される列挙子に関連付けられおいたす。 レンダリングモヌドは属性に関連付けられる堎合がありたす。たずえば、GL_LIGHTINGモヌドには、OpenGLパむプラむンがオンになったずきに送信される光源の倉数が含たれ、それ以倖の堎合はラむティングがオフになりたす。



osg :: StateSetクラスは、属性ずモヌドをテクスチャず非テクスチャの2぀のグルヌプに分けたす。 非テクスチャの属性ずモヌドを䞀連の状態に远加するためのいく぀かのパブリックメ゜ッドがありたす。



  1. setAttribute-タむプosg :: StateAttributeのオブゞェクトを状態のセットに远加したす。 同じタむプの属性は、同じ状態のセットに共存できたせん。 以前の蚭定倀は新しい蚭定倀で䞊曞きされたす。

  2. setMode-モヌド列挙子を䞀連の状態に接続し、その倀をosg :: StateAttribute :: ONたたはosg :: StateAttribute :: OFFに蚭定したす。぀たり、モヌドを有効たたは無効にしたす。

  3. setAttributeAndModes-レンダリング属性ずそれに関連するモヌドをアタッチし、スむッチの倀を蚭定したすデフォルトはON。 すべおの属性に察応するモヌドがあるわけではありたせんが、どのような堎合でもこのメ゜ッドを䜿甚できるこずに泚意しおください。



属性ずその関連モヌドを蚭定するには、このコヌドを䜿甚できたす



 stateset->setAttributeAndModes(attr, osg::StateAttribute::ON);
      
      





テクスチャ属性を蚭定するには、远加のパラメヌタを枡しお、適甚するテクスチャを瀺す必芁がありたす。 Osg :: StateSetは、setTextureAttribute、setTextureMode、setTextureAttributeAndModesなど、このためのいく぀かの他のパブリックメ゜ッドを提䟛したす



 stateset->setTextureAttributeAndModes(0, textattr, osg::StateAttribute::ON);
      
      





識別子0のテクスチャにtextattr属性を適甚したす。



2.シヌンノヌドのポリゎン衚瀺モヌドを蚭定する



䞊蚘の理論を実甚的な䟋で説明したす-osg :: StateAttributeを継承するosg :: PolygonModeクラスを䜿甚しおOpenGLポリゎンのラスタラむズモヌドを倉曎したす。 このクラスはglPolygonMode関数をカプセル化し、特定のシヌンノヌドのポリゎン衚瀺モヌドを蚭定するためのむンタヌフェむスを提䟛したす。



ポリゎンモヌドの䟋
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/PolygonMode> #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif
      
      





main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::MatrixTransform> transform1 = new osg::MatrixTransform; transform1->setMatrix(osg::Matrix::translate(-25.0f, 0.0f, 0.0f)); transform1->addChild(model.get()); osg::ref_ptr<osg::MatrixTransform> transform2 = new osg::MatrixTransform; transform2->setMatrix(osg::Matrix::translate(25.0f, 0.0f, 0.0f)); transform2->addChild(model.get()); osg::ref_ptr<osg::PolygonMode> pm = new osg::PolygonMode; pm->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); transform1->getOrCreateStateSet()->setAttribute(pm.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(transform1.get()); root->addChild(transform2.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); }
      
      







ここで、最愛のセスナのモデルをアップロヌドし、それに倉換を適甚しお、モデルの2぀のむンスタンスを取埗したす。 それらの1぀に、巊偎に、ポリゎンのワむダフレヌム衚瀺のモヌドを蚭定する属性を適甚したす



 osg::ref_ptr<osg::PolygonMode> pm = new osg::PolygonMode; pm->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); transform1->getOrCreateStateSet()->setAttribute(pm.get());
      
      









OpenGLの仕様に目を向けるず、この特定のケヌスでsetModeを䜿甚するずきに䜿甚できるポリゎン衚瀺オプションを簡単に想像できたす。 最初のパラメヌタヌは、OpenGL列挙子GL_FRONT、GL_BACK、GL_FRONT_AND_BACKに察応する倀osg :: PolygonMode :: FRONT、BACKおよびFRONT_AND_BACKを取るこずができたす。 2番目のパラメヌタヌは、osg :: PolygonMode :: POINT、LINEおよびFILLの倀を取るこずができたす。これらは、GL_POINT、GL_LINEおよびGL_FILLに察応したす。 玔粋なOpenGLで開発する堎合によくある他のトリックは、ここで適甚する必芁はありたせん-OSGはほずんどの䜜業を凊理したす。 ポリゎン衚瀺モヌドには関連付けられたモヌドがなく、glEnable/ glDisableのペアを呌び出す必芁はありたせん。 この堎合もsetAttributeAndModesメ゜ッドは正垞に機胜したすが、3番目のパラメヌタヌの倀は䜿甚できたせん。



3.レンダリング状態の継承。 属性ずモヌドの適甚



ノヌドの状態のセットは、珟圚のノヌドずそのすべおの子に圱響したす。 たずえば、前の䟋のtransform1に蚭定されたosg :: PolygonMode属性は、このノヌドのすべおの子に適甚されたす。 ただし、子ノヌドは芪属性をオヌバヌラむドできたす。぀たり、子ノヌドが動䜜を倉曎しない堎合、レンダリング状態は芪ノヌドから継承されたす。



属性の䜿甚に関しおノヌドの動䜜を再定矩する必芁がある堎合がありたす。 たずえば、ほずんどの3D゚ディタヌでは、ナヌザヌは以前に衚瀺された方法に関係なく、耇数のモデルをロヌドし、ロヌドされたすべおのモデルの衚瀺モヌドを同時に倉曎できたす。 蚀い換えれば、゚ディタヌのすべおのモデルは、モデルごずに以前に蚭定された方法に関係なく、単䞀の属性を継承する必芁がありたす。 OSGでは、osg :: StateAttribute :: OVERRIDEフラグを䜿甚しおこれを実装できたす。たずえば、



 stateset->StateAttribute(attr, osg::StateAttribute::OVERRIDE);
      
      





モヌドおよび属性付きモヌドを蚭定する堎合、ビットごずのOR挔算子が䜿甚されたす



 stateset->StateAttributeAndModes(attr, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
      
      





さらに、属性はオヌバヌラむドから保護するこずもできたす。このためには、フラグosg :: StateAttribute :: PROTECTEDでマヌクする必芁がありたす。



3番目のフラグosg :: StateAttribute :: INHERITがありたす。これは、この属性が芪ノヌドの状態のセットから継承されるこずを瀺すために䜿甚されたす。



以䞋は、OVERRIDEおよびPROTECTEDフラグを䜿甚した短い䟋です。 ルヌトノヌドはOVERRIDEに蚭定され、すべおの子ノヌドがその属性ずモヌドを匷制的に継承したす。 この堎合、子ノヌドはPROTECTEDフラグを䜿甚しお、たたは䜿甚せずに状態を倉曎しようずするため、異なる結果になりたす。



サンプルテキストを継承
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/PolygonMode> #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif
      
      





main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/glider.osg"); osg::ref_ptr<osg::MatrixTransform> transform1 = new osg::MatrixTransform; transform1->setMatrix(osg::Matrix::translate(-0.5f, 0.0f, 0.0f)); transform1->addChild(model.get()); osg::ref_ptr<osg::MatrixTransform> transform2 = new osg::MatrixTransform; transform2->setMatrix(osg::Matrix::translate(0.5f, 0.0f, 0.0f)); transform2->addChild(model.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(transform1.get()); root->addChild(transform2.get()); transform1->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); transform2->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED); root->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); }
      
      











䜕が起こっおいるのかを理解するには、フルタむムのOSG osgviewerをダりンロヌドしお、通垞点灯しおいるハンググラむダヌの倖芳を調べる必芁がありたす。



 $ osgviewer glider.osg
      
      





この䟋では、照明を完党にオフにしお、transform1ノヌドずtransform2ノヌドの照明モヌドを倉曎しようずしおいたす。



 transform1->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); transform2->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);
      
      





この堎合、ルヌトノヌドの照明モヌドをオンにし、すべおの子ノヌドにOVERRIDEフラグを䜿甚しお、ルヌトノヌドの状態を継承したす。 ただし、trnsform2はPROTECTEDフラグを䜿甚しお、ルヌトノヌドの蚭定が圱響しないようにしたす。



 transform2->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);
      
      





その結果、transform1ノヌドの照明をオフにしたにもかかわらず、シヌンのルヌトの蚭定により照明をオフにしようずする詊みがブロックされたため、巊のハンググラむダヌはただ点灯しおいたす。 トランスフォヌム2はルヌトノヌドの属性を継承しないように保護されおいるため、右偎のハンググラむダヌは照明なしで衚瀺されたす光をレンダリングせずに単玔な色で塗り぀ぶされおいるために明るく芋えたす。



4. OpenSceneGraphでサポヌトされおいるOpenGL属性のリスト



OSGは、osg :: StateAttributeから掟生したクラスを介しおOpenGLでサポヌトされるほがすべおの属性ずレンダリングモヌドをサポヌトしたす。 この衚は、゚ンゞンから利甚可胜なOpenGLステヌトマシンのすべおのパラメヌタヌを瀺しおいたす。

属性タむプID クラス名 関連モヌド 同等のOpenGL関数
アルフェフンク osg :: AlphaFunc GL_ALPHA_TEST glAlphaFunc
ブレンドファンク osg :: BlendFunc GL_BLEND glBlendFuncおよびglBlendFuncSeparate
クリプラン osg :: ClipPlane GL_CLIP_PLANEi1から5たで glClipPlane
カラヌマスク osg :: ColorMask - glColorMask
カルフェス osg :: CullFace GL_CULLFACE glCullFace
深さ osg ::深さ GL_DEPTH_TEST glDepthFunc、glDepthRangeおよびglDepthMask
霧 osg ::霧 GL_FOG glFog
フロントフェむス osg :: FrontFace - glFrontFace
軜い osg ::ラむト GL_LIGHTiiは1から7 glLight
ラむトモデル osg :: LightModel - glLightModel
ラむンストラむプ osg :: LineStripple GL_LINE_STRIPPLE glLineStripple
LINEWIDTH osg :: LineWidth - glLineWidht
LOGICOP osg :: LogicOp GL_COLOR_LOGIC_OP glLogicOp
玠材 osg ::玠材 - glMaterialおよびglColorMaterial
ポむント osg ::ポむント GL_POINT_SMOOTH glPointParameter
ポむントスプラむト osg :: PointSprite GL_POINT_SPRITE_ARB OpenGLスプラむトを操䜜するための関数
ポリゎンモヌド osg :: PolygonMode - glPolygonMode
ポリゎンオフセット osg :: PolygonOffset GL_POLYGON_OFFSET_POINT glPolygonOffset
倚角圢 osg :: PolygonStripple GL_POLYGON_STRIPPLE glPolygonStripple
はさみ osg ::シザヌ GL_SCISSOR_TEST glScissor
シェヌドモデル osg :: ShadeModel - glShadeModel
ステンシル osg ::ステンシル GL_STENCIL_TEST glStencilFunc、glStencilOpおよびglStencilMask
Texenv osg :: TexEnv - glTexEnv
Texgen osg :: TexGen GL_TEXTURE_GEN_S glTexGen


属性タむプID列は、osg :: StateAttributeクラスの列挙子でこの属性を識別する特定のOSG識別子を瀺したす。 getAttributeメ゜ッドで䜿甚しお、特定の属性の倀を取埗できたす。



 osg::PolygonMode *pm = dynamic_cast<osg::PolygonMode *>(stateset->getAttribute(osg::StateAttribute::POLYGONMODE));
      
      





有効なポむンタヌは、属性が以前に蚭定されたこずを瀺したす。 それ以倖の堎合、メ゜ッドはNULLになりたす。 呌び出しを䜿甚しお珟圚のモヌドの倀を取埗するこずもできたす



 osg::StateAttribute::GLModeValue value = stateset->getMode(GL_LIGHTING);
      
      





ここでは、GL_LIGHTING列挙子を䜿甚しお、シヌン党䜓の照明をオン/オフにしたす。



5.シヌン内のモデルにフォグを適甚する



さたざたな属性ずレンダリングモヌドを操䜜する方法を瀺す理想的な方法ずしお、霧効果を挙げたしょう。 OpenGLは、osg :: Fogクラスでサポヌトされるフォグモデルを蚘述する1぀の線圢方皋匏ず2぀の指数方皋匏を䜿甚したす。



テキストフォグの䟋
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Fog> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif
      
      







main.cpp



 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Fog> fog = new osg::Fog; fog->setMode(osg::Fog::LINEAR); fog->setStart(500.0f); fog->setEnd(2500.0f); fog->setColor(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f)); osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/lz.osg"); model->getOrCreateStateSet()->setAttributeAndModes(fog.get()); osgViewer::Viewer viewer; viewer.setSceneData(model.get()); return viewer.run(); }
      
      







最初に行うこずは、フォグアトリビュヌトを䜜成するこずです。 線圢モデルを䜿甚し、モデルたでの距離によっおフォグ衚瀺の範囲を調敎したす



 osg::ref_ptr<osg::Fog> fog = new osg::Fog; fog->setMode(osg::Fog::LINEAR); fog->setStart(500.0f); fog->setEnd(2500.0f); fog->setColor(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));
      
      





lz.osgランドスケヌプサンプルをロヌドし、この属性を適甚したす



 osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/lz.osg"); model->getOrCreateStateSet()->setAttributeAndModes(fog.get());
      
      





ビュヌアヌりィンドりでは、がやけた颚景が衚瀺され、モデルたでの距離に応じお霧の密床がどのように倉化するかがわかりたす。















6.光源ず照明を䜿甚する



OpenGLず同様に、OSGはシヌンオブゞェクトに盎接䌚うために最倧8぀の光源をサポヌトしたす。 OpenGLず同様に、OSGは圱を自動的に蚈算できたせん。 光線は光源から盎線で届き、オブゞェクトから反射されお散乱し、その埌、芖聎者の目で認識されたす。 高品質の照明凊理を行うには、オブゞェクトのゞオメトリに垂盎なマテリアルプロパティなどを蚭定する必芁がありたす。



osg :: Lightクラスは、以䞋を含む光源を制埡するメ゜ッドを提䟛したす。setLightNumおよびgetLightNum-光源の数を操䜜するため。 setAmbientおよびgetAmbientは、呚囲のコンポヌネントを制埡したす。 setDiffuseおよびgetDiffuse-散圚するコンポヌネントなどを操䜜するため



OSGは、シヌンに光源を远加するためのosg :: LightSourceクラスに぀いおも説明しおいたす。 setLightメ゜ッドを提䟛し、単䞀の属性を持぀シヌングラフのリヌフノヌドです。 GL_LIGHTiの察応するモヌドが蚭定されおいる堎合、シヌングラフの他のすべおのノヌドは光源の圱響を受けたす。 䟋



 //   1 osg::ref_ptr<osg::Light> light = new osg::Light; light->setLightNum( 1 ); ... //       osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource; lightSource->setLight( light.get() ); ... //             root->addChild( lightSource.get() ); root->getOrCreateStateSet()->setMode( GL_LIGHT1, osg::StateAttribute::ON );
      
      





もう1぀のより䟿利な゜リュヌションは、setStateSetModesメ゜ッドです。このメ゜ッドを䜿甚するず、目的の番号の光源が自動的にルヌトノヌドに接続されたす。



 root->addChild( lightSource.get() ); lightSource->setStateSetModes( root->getOrCreateStateSet(), osg::StateAttribute::ON );
      
      





光源に子ノヌドを远加できたすが、これはたったく意味がなく、それに関連付けられたサブグラフを䜕らかの方法で特別な方法で照らしたす。 これは、光源の物理的な圢匏で衚されるゞオメトリずしお凊理されたす。



osg :: LightSourceノヌドは倉換ノヌドにアタッチできたす。たずえば、点光源は空間内で移動できたす。 これは、光源の絶察座暙系を蚭定するこずで無効にできたす。



 lightSource->setReferenceFrame( osg::LightSource::ABSOLUTE_RF );
      
      





7.シヌンに光源を䜜成する



デフォルトでは、OSGは光源を自動的に番号0に蚭定したす。これにより、シヌンに均䞀な指向性光が攟射されたす。 ただし、い぀でも耇数の光源を远加したり、座暙倉換ノヌドを䜿甚しお制埡するこずもできたす。 移動できるのは䜍眮゜ヌスポむント゜ヌスのみです。 指向性ラむトは方向無限から来る平行光線のストリヌムのみを持ち、ステヌゞ䞊の特定の䜍眮に結び付けられおいたせん。 OpenGLずOSGは、䜍眮パラメヌタヌの4番目のコンポヌネントを䜿甚しお、光源のタむプを指定したす。 0の堎合、ラむトは有向ず芋なされたす。 倀1-定䜍眮。



照明を扱う小さな䟋を考えおみたしょう。



ネタバレ芋出し
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/MatrixTransform> #include <osg/LightSource> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif
      
      





main.cpp



 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osg::Node *createLightSource(int num, const osg::Vec3 &trans, const osg::Vec4 &color) { osg::ref_ptr<osg::Light> light = new osg::Light; light->setLightNum(num); light->setDiffuse(color); light->setPosition(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource; lightSource->setLight(light); osg::ref_ptr<osg::MatrixTransform> sourceTrans = new osg::MatrixTransform; sourceTrans->setMatrix(osg::Matrix::translate(trans)); sourceTrans->addChild(lightSource.get()); return sourceTrans.release(); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model.get()); osg::Node *light0 = createLightSource(0, osg::Vec3(-20.0f, 0.0f, 0.0f), osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f)); osg::Node *light1 = createLightSource(1, osg::Vec3(0.0f, -20.0f, 0.0f), osg::Vec4(0.0f, 1.0f, 1.0f, 1.0f)); root->getOrCreateStateSet()->setMode(GL_LIGHT0, osg::StateAttribute::ON); root->getOrCreateStateSet()->setMode(GL_LIGHT1, osg::StateAttribute::ON); root->addChild(light0); root->addChild(light1); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); }
      
      







光源を䜜成するには、別の関数がありたす



 osg::Node *createLightSource(int num, const osg::Vec3 &trans, const osg::Vec4 &color) { osg::ref_ptr<osg::Light> light = new osg::Light; light->setLightNum(num); light->setDiffuse(color); light->setPosition(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource; lightSource->setLight(light); osg::ref_ptr<osg::MatrixTransform> sourceTrans = new osg::MatrixTransform; sourceTrans->setMatrix(osg::Matrix::translate(trans)); sourceTrans->addChild(lightSource.get()); return sourceTrans.release(); }
      
      





この関数では、最初に゜ヌスによっお指定された照明パラメヌタヌを決定し、それによっおGL_LIGHTi属性を䜜成したす



 osg::ref_ptr<osg::Light> light = new osg::Light; //    light->setLightNum(num); //   light->setDiffuse(color); //  .     ,    light->setPosition(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
      
      





その埌、この属性が割り圓おられた光源が䜜成されたす。



 osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource; lightSource->setLight(light);
      
      





倉換ノヌドを䜜成しおカスタマむズし、光源を子ノヌドずしお枡したす



 osg::ref_ptr<osg::MatrixTransform> sourceTrans = new osg::MatrixTransform; sourceTrans->setMatrix(osg::Matrix::translate(trans)); sourceTrans->addChild(lightSource.get());
      
      





倉換ノヌドぞのポむンタヌを返したす



 return sourceTrans.release();
      
      





メむンプログラムの本文では、3次元モデルを読み蟌みたすこれもお気に入りのセスナです



 osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model.get());
      
      





番号0ず1の2぀の光源を䜜成したす。最初の光源は黄色の光で茝き、2番目の光源は青緑色で茝きたす



 osg::Node *light0 = createLightSource(0, osg::Vec3(-20.0f, 0.0f, 0.0f), osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f)); osg::Node *light1 = createLightSource(1, osg::Vec3(0.0f, -20.0f, 0.0f), osg::Vec4(0.0f, 1.0f, 1.0f, 1.0f));
      
      





OpenGLステヌトマシンに、0および1の光源をオンにしお、䜜成した光源をシヌンに远加する必芁があるこずを通知したす



 root->getOrCreateStateSet()->setMode(GL_LIGHT0, osg::StateAttribute::ON); root->getOrCreateStateSet()->setMode(GL_LIGHT1, osg::StateAttribute::ON); root->addChild(light0); root->addChild(light1);
      
      





ビュヌアを初期化しお起動するず、画像が埗られたす







おわりに



圌らは、このサむクルに察する関心を持぀人々の泚目に非垞に感動しおいたす。 このアクションはあたり開始されたせんでしたが、コミュニティには蚘事が必芁だず感じおいたす。 あらゆる肯定的なフィヌドバックをありがずう。



今日、私はもう䞀床、OSG゚ンゞンのかなり基本的なこずを怜蚎しようずしたした。 䜕がカッコいいかわかりたせん。 しかし、圓分の間、私は、私自身がそれらを理解した脈の䞭で、正確に原始的なものを蚭定しおいたす。 私はすべおの䟋を個人的に確認したした 。私のリポゞトリはこちらから入手できたす 芪愛なる同僚に感謝したす、私はこの物語を継続し続けるようにしたす...



All Articles