Ogre3D 基礎
            2013年 1月
Ogre3Dとは
       Entity
    SceneNode
   SceneManager
     Viewport
シーンの完全なクリア、解放
     ジオメトリ
  2Dイメージの表示
  日本語フォント表示
Ogre3Dとは
Ogre3D
レンダリングに特化し、シーン
グラフに基づくシーン指向なエ
ンジン
Direct3D/OpenGLを抽象化し
たクラスライブラリでC++等各
種プログラミング言語に対応
カスタムシェーダ
LOD
スケルタルアニメーション
MITライセンス
シーンの最小構成
SceneManager
SceneNode
Camera
Entity


               SceneManager
                                   Node   カメラ
                        RootNode
                                   Node   Entity
シーンの描画
Camera
Window(レンダーターゲット)
Viewport



                カメラ   Viewport   Window
Entity
Entity
シーン内に存在する移動可能な      //Entity作成
                    Ogre::Entity* ent = NULL;
オブジェクト(麻雀牌、点棒)
Entityにメッシュとマテリアル   ent = mSceneMgr->createEntity(
を割当てる                   "msh:PaiBody:0"
Entityインスタンスを通して    );
                    ent->setMaterialName(
Entityを複製可能
                        "mtr:Pai:1"
                    );
                    ent->setCastShadows( true );
Entity
解放       // Entity解放
         mSceneMgr->destroyEntity(
             "msh:PaiBody:0"
         );



         // SceneNode, Entitie,
         // Lightなど解放
         mSceneMgr->clearScene();
SceneNode
SceneNode
SceneNodeはシーングラフ階   //SceneNode作成
                    Ogre::SceneNode* node = NULL;
層のノード
作成したノードにEntityやカメ   node = mSceneMgr->
ラといった要素を登録すること         getRootSceneNode()->
でシーンを構築                createChildSceneNode(
                           “node:1”
                       );


                    node->attachObject( ent );
SceneNode
解放          // SceneNode解放
            mSceneMgr->getRootSceneNode()->
                removeAndDestroyChild(
                   “node:1”
                );


            // SceneNode, Entitie,
            // Lightなど解放
            mSceneMgr->clearScene();
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
                     );
オーバーレイ用SceneNode
Overlay用の3D空間は別   //SceneNodeを作成
ルートノードを自前で作成      Ogre::SceneNode* node_ov =
                     new Ogre::SceneNode(
                         mSceneMgr, name
                     );



                  // SceneNodeを解放
                  delete node_ov;


                  node_ov = NULL;
SceneManager
SceneManager
シーングラフを管理                       //SceneManager作成
                                mSceneMgr =
レンダリング方式の選定※1
                                   gm->GM_getOgreRoot()->
SceneManagerインスタンス                    createSceneManager(
を作成するとルートノードがひ                            Ogre::ST_GENERIC
とつ作られる                                );

ルートノードを基点に、各種オ
ブジェクト(Entity、カメラ、
パーティクル、Skyboxなど)
を登録


※1 Octree、BSP、Portal、Pagingなど
SceneManager
                              Node MainCamera
麻雀ゲームの例                       Node SubCamera
          SceneManager
                              Node    Light
                              Node   Shadow
                   RootNode
                              Node   麻雀牌
                              Node     卓
                              Node    点棒



                   RootNode   Node   前面の牌
                              Node   パネル
            Overlay用          Node    文字
                              Node   スコア
SceneManager
解放             // SceneManager解放
               Ogre::SceneManager* scene = NULL


               scene = Client->getSceneMgr();


               if( scene ){
                    // SceneManager解放
                    gm->GM_getOgreRoot()->
                        destroySceneManager(scene);
               }
SceneManager
複数のSceneManagerインス
タンスを持てる
デフォルトのレンダリング方式
では空間分割は行われない
Viewport
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, top
Viewportを追加できる                  1.0f, 1.0f //width, height
                           );
Viewport
麻雀ゲームの例


            カメラ
                    Window
            カメラ

            カメラ
                  Texture
Viewport
解放         // Viewport解放
           Ogre::RenderWindow* window =
               gm->GM_getOgreWindow();


           if( window ){


               window->removeViewport(
                  zorder
               );
           }
Viewport
Viewport毎にオーバーレイの    // Viewportを隠す
                     Ogre::Viewport* vp =
表示/非表示の切替可能
                         camera->getViewport();
Viewportを最小化して隠すテ
クニック(Viewportの再作成が   if( vp ){
面倒な場合)                    //幅を0に
                          vp->setDimensions(
                             0.0f, 0.0f, 0.0f, 0.0f
                          );
                         //フレーム更新をおこなわない
                         vp->setAutoUpdated( false );
                     }
シーンの完全なクリア、解放
手順
以下の順に削除/解放をおこなう

1)Mesh、ManualObject、Stat   6) Compositor
icGeometry                 7) CompositorChain
2) Material                8) Viewport
3) Texture                 9) Camera
4) OverlayElement          10) SceneNode
5) Overlay                 11) SceneManager
例
// 1) Mesh                             // 4) OverlayElement
Ogre::MeshManager::getSingleton().     Ogre::MaterialManager::getSingleton().
           remove( "msh:Floor:0" );           remove( "p:ScoreBoard:0" );
// 2) Material
Ogre::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" );
例
// 6) Compositor                 // 7) CompositorChain
Ogre::Viewport* vp =             Ogre::Viewport* vp =
   camera->getViewport();           camera->getViewport();

if( vp )                         if( vp )
{                                {
     Ogre::CompositorManager::        Ogre::CompositorManager::
         getSingleton().                  getSingleton().
         removeCompositor( vp,          removeCompositorChain( vp );
            "Bloom"              }
       );
}
例
// 8) Viewport                       // 9) Camera
Ogre::RenderWindow* window =         mSceneMgr->destroyAllCameras();
   gm->GM_getOgreWindow();


if( window ){
     window->removeAllViewports();
}
例
// 10) SceneNode, Entitie, Lightなど   // 11) SceneManager
mSceneMgr->clearScene();             gm->GM_getOgreRoot()->
                                        destroySceneManager(
                                           mSceneMgr
                                        );
忘れがちなこと
ManualObjectから
convertToMeshしたらメッ
シュが作られるのでこれも解放
対象
ジオメトリ
プリミティブ・ジオメトリ
Rectangle2D        //Rectangle2D作成
  シンプルな平面型の四角形※例   rect =
                       new Ogre::Rectangle2D( true );
WireBoundingBox
  ワイヤーフレーム型のボックス   Ogre::SceneNode*node =
                      mSceneMgr->
                      getRootSceneNode()->
                      createChildSceneNode(
                          "node:2"
                      );


                   node->attachObject( rect );
                   rect->setMaterial( "mtr:Floor:0" );
プリミティブ・ジオメトリ
Rectangle2D解放           //Rectangle2D解放
                        delete rect;
  Rectangle2Dインスタンスを先
  に解放。関連するマテリアルや        Ogre::MaterialManager::
  テクスチャはその後削除              getSingleton().
                           remove( "mtr:Floor:0" );
カスタム・ジオメトリ
ManualObjectを使用
2種類の表示の仕方
  SceneNodeに直接登録
  convertToMeshメソッドでメッシュ
  化したあとEntity登録※コード例
カスタム・ジオメトリ
//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して表示
スタティック・ジオメトリ
複数のEntityを単一オブジェ
クト化
GPUへの転送命令を減らして
性能向上
スタティック・ジオメトリは
分割できない
すべて表示されるか、すべて
表示されないか(カリングに
問題を持つ)
プリミティブ・メッシュ
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
                            );
2Dイメージの表示
Ogre3Dでの2D表示方法
A) Overlay APIを使う
B) Manaual Objectを使う
C) Ogre内部APIを使って描画
D) 外部ライブラリを使う



  それぞれ長所短所あり
A)Overlay APIを使う
表示/非表示の切替が可能             3Dオーバーレイではマウスカー
Overlay::rotateで回        ソル位置を拾えない(Rayを使
転、Overlay::setScaleで拡縮   用できない)
ダイナミック・テクスチャによ           Entity::getWorldBoundingB
り各種ブレンディング処理が可           oxもしくは、スクリーン座標か
能                        らマウスカーソルを判定
B)Manual Objectを使う
回転、拡縮が可能
各種ブレンディング処理が可能
リアルタイムに制御するにはマ
テリアルの操作が必要
視点に左右され、dot by dotな
表示に難点
C)Ogre内部APIを使って描画
各種ブレンディング処理が可能
回転、拡縮はOgre内部コードを
拡張する必要
簡易2Dスプライトマネージャ
  http://www.ogre3d.org/tikiw
  iki/SpriteManager2d&struct
  ure=Cookbook
D)外部ライブラリを使う
CEGUI、Gorilla、OgreMagic
など
モジュールサイズが大きくなる
CEGUI
  http://www.cegui.org.uk/wi
  ki/index.php/Main_Page
Gorilla※シンプルでお勧め
  http://www.ogre3d.org/tikiw
  iki/Gorilla
OgreMagic
  http://www.freewebs.com/o
  gremagic/index.htm
Overlayの使用方法
プログラムからOverlayを作
成してみます※コード例
テクスチャ画像を読み込んで
Ovelayとして表示するサン
プル




                   function_panel.png
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 );
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”         //画面表示完了
        )
   );
日本語フォント表示
日本語フォント表示
fontdefファイルに設定を記     MyFont
                     {
述する                      type          truetype
typeセクションにtruetype       source        meiryo.ttc
を指定した場合、sourceに          size          32
                         resolution    96
フォントデータを指定               code_points   33-166
typeセクションにimageを                       12272-12543
指定した場合、sourceに画                        23383-23383
                                       28450-28450
像ファイルを指定             }
日本語フォント表示
fontdefファイルの        MyFont
                    {
code_pointセクションに        type          truetype
コードポイント(符号点)を記          source        meiryo.ttc
述                       size          32
                        resolution    96
code_pointセクションには       code_points   33-166
Unicodeを指定                            12272-12543
                                      23383-23383
                                      28450-28450
                    }
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 );
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”             //画面表示完了
        )
   );
その他
必要なcode pointのみを指   Ogreでの日本語表示につい
定する。多くを指定するとテ       ては下記URLを参考にさせて
クスチャが消費             いただきました。
フォントのライセンス           < CreoSproutソフトウェア研
 再配布可能な日本語フォント       究部 >
                     http://ahirujigen.blog97.fc2.
 その他、改変/商用可否など       com/blog-entry-279.html
Ogre3d 基礎

Ogre3d 基礎