ogre3D程序實例解析1-平移旋轉與縮放


接着上篇寫

http://www.cnblogs.com/songliquan/p/3294902.html

  旋轉

這里有必要看一下關於旋轉的源代碼:

   virtual void pitch(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

   virtual void yaw(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

   virtual void roll(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

   virtual void translate(const Matrix3& axes, Real x, Real y, Real z, TransformSpace relativeTo = TS_PARENT);

  由以上代碼可看出,pitch,yaw,roll旋轉是默認是按照局部坐標空間旋轉的,而translate則是默認按照父空間坐標平移的。這樣下面理解就簡單了。

 

 將createScene()的代碼刪除,為實現旋轉,可添加如下代碼: 

 1     //旋轉
2
//1 原始狀態,未旋轉 3 Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin1","penguin.mesh");// 4 Ogre::SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 5 node1->setPosition(-80,0,0);//設置位置 6 node1->attachObject(ent1);//添加到場景節點 7 //2 向右平移,並繞X軸旋轉90度 8 Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin2","penguin.mesh");// 9 Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 10 node2->attachObject(ent2);// 11 node2->translate(-20,0,0);//平移到(-20,0,0) 12 node2->pitch(Ogre::Radian(Ogre::Math::HALF_PI));//繞着x軸旋轉90度 13 //3 設置位置,並繞Y軸旋轉90度 14 Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin3","penguin.mesh");// 15 Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 16 node3->setPosition(40,0,0);// 17 node3->yaw(Ogre::Degree(90.0f));//繞着y主旋轉90度 18 node3->attachObject(ent3); 19 //4 設置位置,並繞Z軸旋轉90度 20 Ogre::Entity *ent4 = mSceneMgr->createEntity("penguin4","penguin.mesh");// 21 Ogre::SceneNode *node4 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 22 node4->setPosition(100,0,0);
23 node4->roll(Ogre::Radian(-Ogre::Math::HALF_PI));//繞着z軸旋轉90度
24 node4->attachObject(ent4);//

  效果如下:可看到四個小企鵝:  

  代碼解釋:

  pitch() 讓節點繞着x軸繞着逆時針方向旋轉90度,c參數Radian代表弧度,math代表數學類,而HALP_PI代表弧度為90。

  yaw() 繞y軸旋轉指定的度數,Degree代表角度類

  roll() 繞z軸旋轉指定的角度,參數如上

  縮放

  代碼如下,主要用到scale()函數

 1         //縮放比例
 2         //1 原始比例
 3         Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin1","penguin.mesh");
 4         Ogre::SceneNode * node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//創建子節點
 5         node1->setPosition(0,0,0);
 6         node1->attachObject(ent1);//將實體對象綁定到場景節點
 7         //2 放大2倍
 8         Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin2","penguin.mesh");
 9         Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//創建子場景節點
10         node2->setPosition(100,0,0);
11         node2->scale(2,2,2);//放大2倍
12         node2->attachObject(ent2);//將實體對象綁定到場景節點
13         //3 縮小一半
14         Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin3","penguin.mesh");
15         Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//創建子場景節點
16         node3->setPosition(-100,0,0);
17         node3->scale(0.5,0.5,0.5);//縮小一半
18         node3->attachObject(ent3);//將實體對象綁定到場景節點

  效果如圖:

   代碼解釋:

  scale() --- 對實體進行縮放,參數也比較簡單。

 

 空間變換

  世界坐標空間和父坐標空間的變換:

 1         //空間坐標
 2         //1 節點1
 3         Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
 4         Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//創建節點
 5         node1->setPosition(0,0,450);
 6         node1->yaw(Ogre::Degree(180.0f));//旋轉180度,節點1 z軸方向指向屏幕內
 7         mSceneMgr->getRootSceneNode()->addChild(node1);
 8         node1->attachObject(ent1);//將實體對象綁定到場景節點
 9         //2 節點2
10         Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
11         Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");//創建子場景節點
12         node2->setPosition(20,0,0);
13         //node2->translate(0,0,20,Node::TS_WORLD);//相對於世界坐標空間,而世界坐標空間始終指向屏幕外,故向指向屏幕方向移動20單位 14  node2->translate(0,0,20);//相對於父節點移動,而node1 z軸方向指向屏幕內,故屏幕內移動20單位
15         node2->attachObject(ent2);//將實體對象綁定到場景節點  

 效果如圖 node2->translate(0,0,20);這樣的話是相對於父節點移動,而node1 z軸方向指向屏幕內,故屏幕內移動20單位。

  將代碼改為node2->translate(0,0,20,Node::TS_WORLD);這樣是相對於世界坐標空間,而世界坐標空間始終指向屏幕外,故向指向屏幕方向移動20單位。效果如圖:


 局部坐標空間和父坐標空間

  局部坐標空間 ---- 是針對模型自身的,可用一下代碼實驗。

  代碼如下:

 1         //局部坐標空間變換
 2         Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
 3         Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//創建節點
 4         node1->setPosition(0,0,400);
 5         node1->yaw(Ogre::Degree(180.0f));//繞y軸順時針旋轉180度,節點1 z軸方向指向屏幕內
 6         node1->pitch(Ogre::Degree(-90.0f));//繞x軸順時針旋轉90度
 7         mSceneMgr->getRootSceneNode()->addChild(node1);
 8         node1->attachObject(ent1);//將實體對象綁定到場景節點
 9 
10         Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
11         Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");
12         node2->yaw(Ogre::Degree(45));//繞y軸旋轉45度
13         node2->translate(0,0,20);//沿z軸正方向平移20 單位,以父坐標空間為基准
14         node2->attachObject(ent2);
15 
16         Ogre::Entity*ent3 =mSceneMgr->createEntity("ent3","Sinbad.mesh");
17         Ogre::SceneNode*node3 =node1->createChildSceneNode("node3");
18         node3->yaw(Ogre::Degree(45));//繞y軸旋轉45度
19         node3->translate(0,0,20,Ogre::Node::TS_LOCAL);//以自身坐標空間為基准,沿下圖中箭頭所指方向平移20單位
20         node3->attachObject(ent3);    

  效果圖如下:

代碼解釋:

  可以這樣比喻,第一人首先向后轉,然后我們切換視角,從上往下看,然后第二人在第一人的基礎上直走20單位,而第三人在第一人的基礎上,自己先左轉了45度,然后直走20單位。

  

  這個空間旋轉太繞了,迷了一天終於迷過來了。原來如此。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM