Ogre3d 基礎

15,778 views

Published on

実際のコードに基づいたOgre3D資料です。これから始めようという方に。

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,778
On SlideShare
0
From Embeds
0
Number of Embeds
113
Actions
Shares
0
Downloads
13
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

Ogre3d 基礎

  1. 1. Ogre3D 基礎 2013年 1月
  2. 2. Ogre3Dとは Entity SceneNode SceneManager Viewportシーンの完全なクリア、解放 ジオメトリ 2Dイメージの表示 日本語フォント表示
  3. 3. Ogre3Dとは
  4. 4. Ogre3Dレンダリングに特化し、シーングラフに基づくシーン指向なエンジンDirect3D/OpenGLを抽象化したクラスライブラリでC++等各種プログラミング言語に対応カスタムシェーダLODスケルタルアニメーションMITライセンス
  5. 5. シーンの最小構成SceneManagerSceneNodeCameraEntity SceneManager Node カメラ RootNode Node Entity
  6. 6. シーンの描画CameraWindow(レンダーターゲット)Viewport カメラ Viewport Window
  7. 7. Entity
  8. 8. Entityシーン内に存在する移動可能な //Entity作成 Ogre::Entity* ent = NULL;オブジェクト(麻雀牌、点棒)Entityにメッシュとマテリアル ent = mSceneMgr->createEntity(を割当てる "msh:PaiBody:0"Entityインスタンスを通して ); ent->setMaterialName(Entityを複製可能 "mtr:Pai:1" ); ent->setCastShadows( true );
  9. 9. Entity解放 // Entity解放 mSceneMgr->destroyEntity( "msh:PaiBody:0" ); // SceneNode, Entitie, // Lightなど解放 mSceneMgr->clearScene();
  10. 10. SceneNode
  11. 11. SceneNodeSceneNodeはシーングラフ階 //SceneNode作成 Ogre::SceneNode* node = NULL;層のノード作成したノードにEntityやカメ node = mSceneMgr->ラといった要素を登録すること getRootSceneNode()->でシーンを構築 createChildSceneNode( “node:1” ); node->attachObject( ent );
  12. 12. SceneNode解放 // SceneNode解放 mSceneMgr->getRootSceneNode()-> removeAndDestroyChild( “node:1” ); // SceneNode, Entitie, // Lightなど解放 mSceneMgr->clearScene();
  13. 13. SceneNode操作SceneNodeを介して 移動/拡 //SceneNodeにEntityを登録大/回転などをおこなう node->attachObject( ent );一つの子ノードに複数のEntityを登録可能。同一ノードに属す // グローバル移動るオブジェクトに同一操作が適 node->setPosition(RX, RY, RZ);用できる。 // スケール node->setScale(1.00, 1.00, 1.00); // 回転 node->yaw( Ogre::Radian(1.57), Ogre::Node::TS_WORLD );
  14. 14. オーバーレイ用SceneNodeOverlay用の3D空間は別 //SceneNodeを作成ルートノードを自前で作成 Ogre::SceneNode* node_ov = new Ogre::SceneNode( mSceneMgr, name ); // SceneNodeを解放 delete node_ov; node_ov = NULL;
  15. 15. SceneManager
  16. 16. SceneManagerシーングラフを管理 //SceneManager作成 mSceneMgr =レンダリング方式の選定※1 gm->GM_getOgreRoot()->SceneManagerインスタンス createSceneManager(を作成するとルートノードがひ Ogre::ST_GENERICとつ作られる );ルートノードを基点に、各種オブジェクト(Entity、カメラ、パーティクル、Skyboxなど)を登録※1 Octree、BSP、Portal、Pagingなど
  17. 17. SceneManager Node MainCamera麻雀ゲームの例 Node SubCamera SceneManager Node Light Node Shadow RootNode Node 麻雀牌 Node 卓 Node 点棒 RootNode Node 前面の牌 Node パネル Overlay用 Node 文字 Node スコア
  18. 18. SceneManager解放 // SceneManager解放 Ogre::SceneManager* scene = NULL scene = Client->getSceneMgr(); if( scene ){ // SceneManager解放 gm->GM_getOgreRoot()-> destroySceneManager(scene); }
  19. 19. SceneManager複数のSceneManagerインスタンスを持てるデフォルトのレンダリング方式では空間分割は行われない
  20. 20. Viewport
  21. 21. Viewportレンダーターゲット上の描画領 // Viewport作成 unsigned short zorder = 100;域とカメラを結びつけるDirect3D9/OpenGLの Ogre::Viewport* vp =Viewportと同じ gm->GM_getOgreWindow()->カメラ毎にViewportは1個ま addViewport ( mCamera,で割当て zorder,レンダーターゲット毎に複数の 0.0f, 0.0f, //left, topViewportを追加できる 1.0f, 1.0f //width, height );
  22. 22. Viewport麻雀ゲームの例 カメラ Window カメラ カメラ Texture
  23. 23. Viewport解放 // Viewport解放 Ogre::RenderWindow* window = gm->GM_getOgreWindow(); if( window ){ window->removeViewport( zorder ); }
  24. 24. ViewportViewport毎にオーバーレイの // Viewportを隠す Ogre::Viewport* vp =表示/非表示の切替可能 camera->getViewport();Viewportを最小化して隠すテクニック(Viewportの再作成が if( vp ){面倒な場合) //幅を0に vp->setDimensions( 0.0f, 0.0f, 0.0f, 0.0f ); //フレーム更新をおこなわない vp->setAutoUpdated( false ); }
  25. 25. シーンの完全なクリア、解放
  26. 26. 手順以下の順に削除/解放をおこなう1)Mesh、ManualObject、Stat 6) CompositoricGeometry 7) CompositorChain2) Material 8) Viewport3) Texture 9) Camera4) OverlayElement 10) SceneNode5) Overlay 11) SceneManager
  27. 27. 例// 1) Mesh // 4) OverlayElementOgre::MeshManager::getSingleton(). Ogre::MaterialManager::getSingleton(). remove( "msh:Floor:0" ); remove( "p:ScoreBoard:0" );// 2) MaterialOgre::MaterialManager::getSingleton(). Ogre::OverlayManager::getSingleton(). remove( "mtr:Floor:0" ); destroyOverlayElement(// 3) Texture "p:ScoreBoard:0"Ogre::TextureManager::getSingleton(). ); remove( "RTT_Texture" ); // 5) Overlay Ogre::OverlayManager::getSingleton(). destroy( "OnSceneOverlay" );
  28. 28. 例// 6) Compositor // 7) CompositorChainOgre::Viewport* vp = Ogre::Viewport* vp = camera->getViewport(); camera->getViewport();if( vp ) if( vp ){ { Ogre::CompositorManager:: Ogre::CompositorManager:: getSingleton(). getSingleton(). removeCompositor( vp, removeCompositorChain( vp ); "Bloom" } );}
  29. 29. 例// 8) Viewport // 9) CameraOgre::RenderWindow* window = mSceneMgr->destroyAllCameras(); gm->GM_getOgreWindow();if( window ){ window->removeAllViewports();}
  30. 30. 例// 10) SceneNode, Entitie, Lightなど // 11) SceneManagermSceneMgr->clearScene(); gm->GM_getOgreRoot()-> destroySceneManager( mSceneMgr );
  31. 31. 忘れがちなことManualObjectからconvertToMeshしたらメッシュが作られるのでこれも解放対象
  32. 32. ジオメトリ
  33. 33. プリミティブ・ジオメトリRectangle2D //Rectangle2D作成 シンプルな平面型の四角形※例 rect = new Ogre::Rectangle2D( true );WireBoundingBox ワイヤーフレーム型のボックス Ogre::SceneNode*node = mSceneMgr-> getRootSceneNode()-> createChildSceneNode( "node:2" ); node->attachObject( rect ); rect->setMaterial( "mtr:Floor:0" );
  34. 34. プリミティブ・ジオメトリRectangle2D解放 //Rectangle2D解放 delete rect; Rectangle2Dインスタンスを先 に解放。関連するマテリアルや Ogre::MaterialManager:: テクスチャはその後削除 getSingleton(). remove( "mtr:Floor:0" );
  35. 35. カスタム・ジオメトリManualObjectを使用2種類の表示の仕方 SceneNodeに直接登録 convertToMeshメソッドでメッシュ 化したあとEntity登録※コード例
  36. 36. カスタム・ジオメトリ//ManualObject作成 mo->triangle(0,2,1);Ogre::ManualObject* mo = NULL; mo->triangle(2,0,3);mo = mSceneMgr-> mo->end(); createManualObject(“NakiMark”); //ManualObjectをメッシュ化mo->position(cmW,cpH,0); mo->convertToMesh(mo->textureCoord( 0,0f, 1.0f ); “msh:NakiMark:0”mo->position(cpW,cpH,0); );mo->textureCoord( 1.0f, 1.0f ); //Entity作成mo->position(cpW,cmH,0); Ogre::Entity* ent = mSceneMgr->mo->textureCoord( 1.0f, 0.0f ); createEntity("msh:NakiMark:0");mo->position(cmW,cmH,0);mo->textureCoord( 0.0f, 0.0f ); //この後 nodeにattachして表示
  37. 37. スタティック・ジオメトリ複数のEntityを単一オブジェクト化GPUへの転送命令を減らして性能向上スタティック・ジオメトリは分割できないすべて表示されるか、すべて表示されないか(カリングに問題を持つ)
  38. 38. プリミティブ・メッシュCreatePlane //CreatePlane作成 シンプルな平面※コード例 Ogre::MeshManager:: getSingleton().createPlane(CreateCurvedIllusionPlane "msh:Floor:0", 平面上に曲率を再現 Ogre::ResourceGroupManager::CreateCurvedPlane DEFAULT_RESOURCE_GROUP_NAME,CreateBezierPatch *plane, //MovablePlane ベジェ曲面 50, 50, 1, 1, true, 1, 1.0f, 1.0f, Ogre::Vector3::UNIT_Z );
  39. 39. 2Dイメージの表示
  40. 40. Ogre3Dでの2D表示方法A) Overlay APIを使うB) Manaual Objectを使うC) Ogre内部APIを使って描画D) 外部ライブラリを使う それぞれ長所短所あり
  41. 41. A)Overlay APIを使う表示/非表示の切替が可能 3DオーバーレイではマウスカーOverlay::rotateで回 ソル位置を拾えない(Rayを使転、Overlay::setScaleで拡縮 用できない)ダイナミック・テクスチャによ Entity::getWorldBoundingBり各種ブレンディング処理が可 oxもしくは、スクリーン座標か能 らマウスカーソルを判定
  42. 42. B)Manual Objectを使う回転、拡縮が可能各種ブレンディング処理が可能リアルタイムに制御するにはマテリアルの操作が必要視点に左右され、dot by dotな表示に難点
  43. 43. C)Ogre内部APIを使って描画各種ブレンディング処理が可能回転、拡縮はOgre内部コードを拡張する必要簡易2Dスプライトマネージャ http://www.ogre3d.org/tikiw iki/SpriteManager2d&struct ure=Cookbook
  44. 44. D)外部ライブラリを使うCEGUI、Gorilla、OgreMagicなどモジュールサイズが大きくなるCEGUI http://www.cegui.org.uk/wi ki/index.php/Main_PageGorilla※シンプルでお勧め http://www.ogre3d.org/tikiw iki/GorillaOgreMagic http://www.freewebs.com/o gremagic/index.htm
  45. 45. Overlayの使用方法プログラムからOverlayを作成してみます※コード例テクスチャ画像を読み込んでOvelayとして表示するサンプル function_panel.png
  46. 46. Overlayの使用方法//Overlay作成 //PanelOverlayElement作成Ogre::Overlay* ov = Ogre::OverlayContainer*oct =Ogre::OverlayManager:: cm->CM_createPanelOverlayElement getSingleton(). ( create( "OnSceneOverlay" ); "p:MesgPanel:0", "function_panel.png",ov->setZOrder( 1 ); //650が最前面 0, 0, 70, 26,ov->show(); 1.0f ); //Overlayに登録 ov->add2D( oct );
  47. 47. Overlayの使用方法//PanelOverlayElement取得 //表示位置Ogre::PanelOverlayElement* e = int vpW = 800; //スクリーン幅static_cast int vpH = 600; <Ogre::PanelOverlayElement *> (Ogre::OverlayManager:: e->setPosition(400/vpW, 200/vpH); getSingleton(). e->show(); getOverlayElement( “p:MesgPanel:0” //画面表示完了 ) );
  48. 48. 日本語フォント表示
  49. 49. 日本語フォント表示fontdefファイルに設定を記 MyFont {述する type truetypetypeセクションにtruetype source meiryo.ttcを指定した場合、sourceに size 32 resolution 96フォントデータを指定 code_points 33-166typeセクションにimageを 12272-12543指定した場合、sourceに画 23383-23383 28450-28450像ファイルを指定 }
  50. 50. 日本語フォント表示fontdefファイルの MyFont {code_pointセクションに type truetypeコードポイント(符号点)を記 source meiryo.ttc述 size 32 resolution 96code_pointセクションには code_points 33-166Unicodeを指定 12272-12543 23383-23383 28450-28450 }
  51. 51. Overlayにテキストを表示//Overlay作成 //PanelOverlayElement作成Ogre::Overlay* ov = Ogre::OverlayContainer*oct =Ogre::OverlayManager:: cm->CM_createTextOverlayElement getSingleton(). ( create( "OnSceneOverlay" ); "t:DEBUG:0", TEXT("デバッグモードです。"),ov->setZOrder( 1 ); //650が最前面 MIDDLE_FONT, //サイズov->show(); COLOR_WHITE //色 ); //Overlayに登録 ov->add2D( oct );
  52. 52. Overlayにテキストを表示//PanelOverlayElement取得 //表示位置Ogre::PanelOverlayElement* e = int vpW = 800; //スクリーン幅static_cast int vpH = 600; <Ogre::PanelOverlayElement *> (Ogre::OverlayManager:: e->setPosition(100/vpW, 100/vpH); getSingleton(). e->show(); getOverlayElement( ”t:DEBUG:0” //画面表示完了 ) );
  53. 53. その他必要なcode pointのみを指 Ogreでの日本語表示につい定する。多くを指定するとテ ては下記URLを参考にさせてクスチャが消費 いただきました。フォントのライセンス < CreoSproutソフトウェア研 再配布可能な日本語フォント 究部 > http://ahirujigen.blog97.fc2. その他、改変/商用可否など com/blog-entry-279.html

×