接着上篇寫
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單位。
這個空間旋轉太繞了,迷了一天終於迷過來了。原來如此。