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单位。
这个空间旋转太绕了,迷了一天终于迷过来了。原来如此。
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/3296510.html