OpenSceneGraphã¯ãé«æ§èœ3Dã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ãªãŒãã³ãœãŒã¹ã®ã¯ãã¹ãã©ãããã©ãŒã ã©ã€ãã©ãªã§ãã ããã¯ããŠãŒã¶ãŒã®æãšè¶³ãããã®äžã«å®ããããå¶éãã€ãŸãã©ã€ãã©ãªãšçµã³ä»ããã²ãŒã ãšã³ãžã³ã§ã¯ãããŸãããã©ã€ãã©ãªã¯ãåå¥ã«ãã¢ã»ã³ããªã§ãåªããåäœããã䟿å©ãªã¢ãžã¥ãŒã«ã®ã»ããã§ãã

OpenSceneGraphã®ã³ã¢ãå®éã«ã¯ã·ãŒã³ã°ã©ãã¯ãOpenGLã®ããªãèãã©ãããŒã§ããããã«ããããªããžã§ã¯ãã®éå±€ãå®çŸ©ãããªããžã§ã¯ãã«å¯ŸããŠå¿
èŠãªå€æãå®è¡ã§ããŸãã
- ããŒãã®ç¹æ§ãå€æŽããŸãïŒãªããžã§ã¯ãã空éå
ã§ç§»åãããããªã¢ã«ãã©ã€ãã£ã³ã°ããããã£ãã·ã§ãŒããŒãããã³ãã®ä»ã®OpenGLã¢ãŒããšå±æ§ããããã«å²ãåœãŠãŸãïŒã
- ä»»æã®æ¹æ³ã§ããªãŒãåæ§ç¯ããŸãïŒãªããžã§ã¯ããäœæããã³åé€ããã°ã©ãã®ä»ã®ããŒãã«ãªã³ã¯ããŸãïŒã
- ã°ã©ããã©ããŒãµã«ãå®è¡ããåããŒãã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ãã¡ããã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ã«ã¯ä»ã«ã©ã®ãããªæ©èœããããŸãã
ã·ãŒã³æ§ç¯ã®åºæ¬ååãæ€èšããã·ãŒã³ã°ã©ããã©ããŒãµã«ãæ®ããããŒãïŒãããªã¢ã«ãã©ã€ãã£ã³ã°ïŒã«å±æ§ãå²ãåœãŠãã«ã¡ã©å¶åŸ¡ãããŠã¹ããã³ããŒããŒãåŠçãªã©ãè¡ããŸããã ããã€ãã®èå³æ·±ãæ©èœã«èšåããã ãã§ãïŒ
- Visitorãã¿ãŒã³ã®å®è£
ã«ãããç¬èªã®ã¯ã©ã¹ãèšè¿°ããOpenSceneGraphã«ã°ã©ãããã€ãã¹ããŠé©åãªã·ãŒã³ãªããžã§ã¯ãããšã«ã³ãŒããåŒã³åºãããã«äŸé Œã§ããŸãã
- SwitchããŒãïŒã°ã«ãŒãã®çžç¶äººïŒã䜿çšãããšãã°ã©ããè¿åããããšããé€å€ããŠãåã®ãªã³ãšãªããåãæ¿ããããšãã§ããŸãã
- LODããŒãïŒã°ã«ãŒãã®ç¶æ¿è
ïŒã䜿çšãããšãã«ã¡ã©ããã®è·é¢ãæå®ããŠãã©ã®åãã¬ã³ããªã³ã°ããããæå®ã§ããŸãã ã«ã¡ã©ããé ãé¢ããããã·ã³ãã«ãªã¢ãã«ã䜿çšã§ããŸãã
- ã·ã§ãŒããŒã®ãµããŒãïŒãã©ã°ã¡ã³ããšãžãªã¡ããªïŒ;
- é«ãããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãå®çŸããããã«ãè€æ°ã®ã«ã¡ã©ããã®ç»åã®ãã«ãã¹ã¬ããã¬ã³ããªã³ã°ããµããŒããããŠããŸãã ãã«ãGPUãå«ãã
- ãã¯ã¹ãã£ãžã®ã¬ã³ããªã³ã°ãå¯èœã§ãã
- å€å±€ãã¯ã¹ãã£ãç°æ¹æ§ç
§æããã³ããããã³ã°ãé¡é¢ãã€ã©ã€ãã
- ãŠãŒã¶ãŒãããŠã¹ã§ãã€ã³ãããã·ãŒã³ãªããžã§ã¯ããéžæããŸãïŒããæ£ç¢ºã«ã¯ãç»é¢åº§æšãç»é¢ã«è²Œãä»ããé·ãéãå€é¢äœã«å€æãããã®å€é¢äœãšã·ãŒã³ãªããžã§ã¯ãã®äº€ç¹ãæ€çŽ¢ããã«ã¡ã©ããã®è·é¢ã§èŠã€ãã£ããªããžã§ã¯ãã䞊ã¹æ¿ããŸãïŒ;
- ãããªãã¯ã¹ãåå
æ°ãå€é¢äœïŒäº€å·®ãçµåãªã©ã®èšç®ïŒã3Dã¢ãŒãã£ã³ã°ãæäœããããã®å€ãã®æ°åŠããªããã£ãã
- ã·ãŒã³ãªããžã§ã¯ãã¯ã·ãªã¢ã«åããã³éã·ãªã¢ã«åã§ããŸãã æ°ãããšã¯ã¹ããŒãããã³ã€ã³ããŒã圢åŒã¯ããã©ã°ã€ã³ã·ã¹ãã ã䜿çšããŠç°¡åã«æ¥ç¶ã§ããŸãã ãã€ãã£ã圢åŒïŒosgïŒã¯ããªããžã§ã¯ãã®ãã¹ãŠã®å±æ§ã人éãèªããããã¹ã圢åŒã§ä¿åããéã·ãªã¢ã«ååŸã«ã°ã©ããæ£ç¢ºã«åŸ©å
ã§ããããã«ããŸãã
- HUDã°ã©ãã®ç¹å¥ãªããŒãïŒãããã¢ãããã£ã¹ãã¬ã€ïŒã䜿çšãããšãåãåžžã«ã¢ãã¿ãŒã«é¢ããããã«å±éã§ããŸãã
ããŒãã£ã¯ã«ã·ã¹ãã ã䜿çšãããšãç«ãç
ãç«è±ãåããŒãã£ã¯ã«ã®åšæ³¢æ°ããã®é£è¡çµè·¯ã寿åœããã¯ã¹ãã£ãªã©ã®ããã°ã©ãã³ã°ãªã©ãããŸããŸãªç¹æ®å¹æãäœæã§ããŸãã - åéæã®ãªããžã§ã¯ããšåœ±ã®ãµããŒãã
- OpenThreadsãã«ãã¹ã¬ããã©ã€ãã©ãªã䜿çšãããšããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããæœè±¡åãããã¹ãŠã®ãã©ãããã©ãŒã ã«å¯ŸããŠåäžã®ã³ãŒããèšè¿°ããããšãã§ããŸãã
- osgDBã¢ãžã¥ãŒã«ã¯ãåã«ãªããžã§ã¯ãããã£ã¹ã¯ã«ããŒãããã³ã¢ã³ããŒãããã ãã§ãªãããââãã¯ã°ã©ãŠã³ãã¹ããªãŒã ïŒããŒãžã³ã°ã¢ãŒãïŒã§ãªããžã§ã¯ããããŒãã§ãããªããžã§ã¯ãããŒã¿ããŒã¹ã¢ãžã¥ãŒã«ãåããŠããŸãã
- Qtãšã®çµ±åã«ãããGUIããã¯ã¹ãã£ã«ã¬ã³ããªã³ã°ãããããã·ãŒã³å
ã®ãªããžã§ã¯ãã«åŒã䌞ã°ãããšãã§ããŸãã ç¹ã«ãWebãã©ãŠã¶ãŒã®Qtã³ã³ããŒãã³ããååŸããŠããã¯ã¹ãã£ã«é
眮ããã·ãŒã³ã«è¡šç€ºãããã©ãŠã¶ãŒã§YouTubeãéããŠããããªãèŠãããšãã§ããŸãã ãããŠããã¯æ©èœããŸãã
- å°çã®è¡šé¢ïŒå°åœ¢ïŒãšç©ºïŒã¹ã«ã€ããã¯ã¹ïŒãèŠèŠåããããã®ãµããŒãããããŸãã
- ã¢ãã€ã«ãã©ãããã©ãŒã Androidããã³iOSã§åäœããæ©èœã
- åªããã©ã€ã»ã³ã¹ïŒç·©åãããLGPLïŒãããã«ãããã©ã€ãã©ãªãéãããããããžã§ã¯ãã«éçã«ãªã³ã¯ããããšãã§ããŸãã
å
¥æå
å
¬åŒãŠã§ããµã€ã
-www.openscenegraph.orgæé«ã®ããã¥ã¡ã³ãã¯
èè
ã®æ¬ã§ãã
ç¡æã§å©çšã§ããæé«ã®ããã¥ã¡ã³ãã¯ãã©ã€ãã©ãªã«ä»å±ããèšå€§ãªæ°ã®ãµã³ãã«ãšãèªã¿ãããèªã¿ããããã°ãããã³ãŒãã§ãã