
ã¯ããã«
éåžžãã¬ã³ããªã³ã°ãªãã·ã§ã³ã䜿çšããå Žåã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ã€ã®ã°ã«ãŒãã«åããŸãã éãã¯ã¹ãã£ã®å±æ§ãšã¢ãŒããäžé£ã®ç¶æ ã«è¿œå ããããã®ããã€ãã®ãããªãã¯ã¡ãœããããããŸãã
- setAttributeïŒïŒ-ã¿ã€ãosg :: StateAttributeã®ãªããžã§ã¯ããç¶æ
ã®ã»ããã«è¿œå ããŸãã åãã¿ã€ãã®å±æ§ã¯ãåãç¶æ
ã®ã»ããã«å
±åã§ããŸããã 以åã®èšå®å€ã¯æ°ããèšå®å€ã§äžæžããããŸãã
- setModeïŒïŒ-ã¢ãŒãåæåãäžé£ã®ç¶æ
ã«æ¥ç¶ãããã®å€ãosg :: StateAttribute :: ONãŸãã¯osg :: StateAttribute :: OFFã«èšå®ããŸããã€ãŸããã¢ãŒããæå¹ãŸãã¯ç¡å¹ã«ããŸãã
- 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
main.cpp
#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
main.cpp
#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
main.cpp
#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
main.cpp
#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ãšã³ãžã³ã®ããªãåºæ¬çãªããšãæ€èšããããšããŸããã äœãã«ãã³ãããããããŸããã ããããåœåã®éãç§ã¯ãç§èªèº«ãããããç解ããèã®äžã§ãæ£ç¢ºã«åå§çãªãã®ãèšå®ããŠããŸãã ç§ã¯ãã¹ãŠã®äŸãå人çã«ç¢ºèªããŸãã ãç§ã®ãªããžããªã¯ãã¡ãããå ¥æã§ããŸã 芪æãªãååã«æè¬ããŸããç§ã¯ãã®ç©èªãç¶ç¶ãç¶ããããã«ããŸã...