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单位。

  

  这个空间旋转太绕了,迷了一天终于迷过来了。原来如此。

 

原文地址:https://www.cnblogs.com/songliquan/p/3296510.html