2014年5月23日金曜日

OgreのBasic Tutorial 1その2

昨日の続き

拡大・縮小と回転

2匹目の鬼をシーンに追加してみる。
これは簡単。setupDemoScene()の中で名前を変えて同じメッシュのエンティティを生成し、新たに生成したノードに割り当てる。
単純に追加すると1匹目の鬼と位置が被ってしまうので、2匹目は位置を変える。これは、createChildSceneNode(...)の第2引数で指定できる。
Ogreは、OpenGLとDirectXのどちらもサポートするけど、座標系はOpenGLと同じ右手座標系(Z座標は手前が正方向)らしい。
// 1匹目の鬼
Ogre::Entity* ogreHead = sceneMgr->createEntity("Head", "ogrehead.mesh");
// Create a SceneNode and attach the Entity to it
Ogre::SceneNode* headNode = sceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");
headNode->attachObject(ogreHead);
 
// 2匹目を追加
Ogre::Entity* ogreHead2 = sceneMgr->createEntity("Head2", "ogrehead.mesh");
// Create a SceneNode and attach the Entity to it
Ogre::SceneNode* headNode2 = sceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode2", Ogre::Vector3( 50, 0, -100 ));
headNode2->attachObject(ogreHead2);
Twoogres
2匹目のEntityとNodeをそれぞれ1匹目とは別に新たに生成しているけど、1匹目のEntityを2匹目にも使い回せないのか試してみた。
// 2匹目を追加
// Ogre::Entity* ogreHead2 = sceneMgr->createEntity("Head2", "ogrehead.mesh");
// Create a SceneNode and attach the Entity to it
Ogre::SceneNode* headNode2 = sceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode2", Ogre::Vector3( 50, 0, -100 ));
headNode2->attachObject(ogreHead);  // <== 1匹目の鬼のエンティティを使ってみる
結果はダメ。こうなった。
Badogre
1匹目の鬼の顔がどよ〜んと暗くなり、2匹目の姿は影も形もない。位置はNodeで指定しているのでEntityは使い回せるかと思ったけどダメみたい。この辺の仕組みはまだよく理解できていない。
2匹目を追加できたはいいけど、iPhoneの画面では大きすぎるので、鬼を小さくしてみる。(カメラをズームアウトしてもいいんだけど)
これは、ノードのScale(...)で指定できる。
// 1匹目の鬼
Ogre::Entity* ogreHead = sceneMgr->createEntity("Head", "ogrehead.mesh");
// Create a SceneNode and attach the Entity to it
Ogre::SceneNode* headNode = sceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");
headNode->attachObject(ogreHead);
headNode->scale(0.5, 0.5, 0.5);
 
// 2匹目を追加
Ogre::Entity* ogreHead2 = sceneMgr->createEntity("Head2", "ogrehead.mesh");
// Create a SceneNode and attach the Entity to it
Ogre::SceneNode* headNode2 = sceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode2", Ogre::Vector3( 50, 0, -100 ));
headNode2->attachObject(ogreHead2);
headNode2->scale(0.5, 0.5, 0.5);
Scale
各軸とも同じ値を指定したけど、当然それぞれの方向に違う値も指定できる。
// 1匹目の鬼
 :
headNode->scale(0.2, 0.5, 0.5);
 
// 2匹目の鬼
 :
headNode2->scale(0.5, 0.3, 0.5);
Scale2
次は回転させてみる。
// 1匹目の鬼
 :
headNode->scale(0.5, 0.5, 0.5);
headNode->rotate(Ogre::Vector3( 0, 0, 1 ), Ogre::Degree(45));
 
// 2匹目の鬼
 :
headNode2->scale(0.5, 0.5, 0.5);
headNode2->rotate(Ogre::Vector3( 0, 0, 1 ), Ogre::Degree(-90));
Rotate
上の書き方では、z軸を回転軸として1匹目の鬼を45°、2匹目の鬼を-90°回転させている。他にもpitch(...),yaw(...),roll(...)という回転用のメソッドがあって、それぞれ、x軸, y軸, z軸を回転軸として回転させる。
上の例の場合では、headNode->roll(Ogre::Degree(45)); と書いても同じ。

カメラの移動

今度は、鬼ではなくてカメラの方を動かしてみる。
その前に鬼のスケールと回転はコメントアウトしておく。
// 1匹目の鬼
 :
// headNode->scale(0.5, 0.5, 0.5);
// headNode->rotate(Ogre::Vector3( 0, 0, 1 ), Ogre::Degree(45));
// 2匹目の鬼
 :
// headNode2->scale(0.5, 0.5, 0.5);
// headNode2->rotate(Ogre::Vector3( 0, 0, 1 ), Ogre::Degree(-90));
カメラは、iPhone用のテンプレートを使った場合、OgreFramework.cppのinitOgre(...)の中で生成している。この辺はチュートリアルで使われている内容と違うので紛らわしい。
とりあえず、カメラの位置をもっと手前の方に動かしてみる。
// m_pCamera->setPosition(Vector3(0, 60, 60));
m_pCamera->setPosition(Vector3(0, 60, 150));
Cameraposition
カメラの回転もノードと同様のメソッドでできる。但し、lookAt(...)の後でやらないと反映されなかった。
m_pCamera->setPosition(Vector3(0, 60, 150));
m_pCamera->lookAt(Vector3(0, 0, 0));
m_pCamera->roll(Ogre::Degree(30));
Cameraroll
で、この辺のソースを見てたら、背景色を指定しているコードを発見。ピンクに変えてみる。
m_pCamera->lookAt(Vector3(0, 0, 0));
m_pCamera->roll(Ogre::Degree(30));
m_pCamera->setNearClipDistance(1);
    
m_pViewport = m_pRenderWnd->addViewport(m_pCamera);
// m_pViewport->setBackgroundColour(ColourValue(0.8f, 0.7f, 0.6f, 1.0f));
m_pViewport->setBackgroundColour(ColourValue(1.0f, 0.4f, 0.7f, 1.0f));  // ピンクに変更
   
m_pCamera->setAspectRatio(Real(m_pViewport->getActualWidth()) / Real(m_pViewport->getActualHeight()));
 
m_pViewport->setCamera(m_pCamera);
Pinkcolor
今日はここまで。
WebGL関連の記事を書くつもりで始めたブログだけど、いきなりOgreにハマってしまった。WebGLもやりたいけど...

追記...

Ogre用とWebGL用とブログを分けて、WebGL関連の記事は、http://glabc.blogspot.jp/ に書くことにしました。

0 件のコメント:

コメントを投稿