Ogre是右手坐标系:x轴正向向右,y轴正向向上,z轴正向指向屏幕外
node->setPosition(x,y,z)与node->translate(x,y,z)的区别:
setPosition将节点位置设置到(x,y,z),而translate是将节点(x,y,z)的值加到当前位置上,得到的值才是节点新的位置。
例如:node的位置(10,20,30),调用node->(30,20,10)那么新位置为(30,20,10),若调用node->translate(30,20,10),那么新位置为(40,40,40)。
pitch()绕x轴旋转,yaw()绕y轴旋转,roll()绕z轴旋转。
缩放node->scale(Ogre::Vector3(x,y,z)); 还有node->setScale(Ogre::Vector3(x,y,z));
两者之间的区别与setPositon()同translate()之间的区别一样。
#include "http://www.cnblogs.com/include/ogre/ExampleApplication.h" class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(10, 10, 0); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = node->createChildSceneNode("node2"); node2->setPosition(10, 0, 0); node2->attachObject(ent2); node2->scale(2.0f, 2.0f, 2.0f); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = node->createChildSceneNode("node3", Ogre::Vector3(20, 0, 0)); node3->attachObject(ent3); node3->scale(0.2f, 0.2f, 0.2f); } private: }; int main() { MyApplication app; app.go(); return 0; }
class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(10, 10, 0); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "ninja.mesh"); Ogre::SceneNode* node2 = node->createChildSceneNode("node2"); node2->setPosition(10, 0, 0); node2->attachObject(ent2); node2->setScale(0.02f, 0.02f, 0.02f); // node改变位置,旋转会影响其子节点node2的位置 node->setPosition(40, 10, 0); node->yaw(Ogre::Degree(180.0f)); }
Ogre的三个空间: 本地空间,父空间,世界空间。
本地空间的坐标原点在几何体的中心点。几何体的每个顶点相当于translate from 原点。
节点的平移变换默认是在父空间里。
class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(0, 0, 400); node->yaw(Ogre::Degree(180.0f)); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = node->createChildSceneNode("node2"); node2->setPosition(10, 0, 0); node2->translate(0, 0, 10); node2->attachObject(ent2); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = node->createChildSceneNode("node3"); node3->setPosition(20, 0, 0); node3->translate(0, 0, 10); node3->attachObject(ent3); } private: };
节点在世界空间平移
class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(0, 0, 400); node->yaw(Ogre::Degree(180.0f)); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = node->createChildSceneNode("node2"); node2->setPosition(10, 0, 0); node2->translate(0, 0, 10); node2->attachObject(ent2); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = node->createChildSceneNode("node3"); node3->setPosition(20, 0, 0); // 相对于父空间的平移 // node3->translate(0, 0, 10); // 在世界空间里平移,因为世界空间是左手坐标系,若相对于世界空间平移(0,0,10) // 那么node3的终点位置就是世界空间里的(0,0,10) node3->translate(0, 0, 10, Ogre::Node::TS_WORLD); node3->attachObject(ent3); } private: };
节点在本地空间平移
class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(0, 0, 400); node->yaw(Ogre::Degree(180.0f)); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = node->createChildSceneNode("node2"); // 绕y轴旋转45度==相当于将node绕y轴旋转45度后的位置就是node2 node2->yaw(Ogre::Degree(45)); // 虽然此时node3位于z,x轴的平面的对角线上,但是调用translate时 // 是相对于其父节点的位置的,因父节点在(0,0,400),所以执行下面的语句后 // node2的位置为(0,0,420) node2->translate(0, 0, 20); node2->attachObject(ent2); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = node->createChildSceneNode("node3"); // 相当于将node绕y轴旋转45度后的位置就是node3 node3->yaw(Ogre::Degree(45)); // 此时node3位于z,x轴的平面的对角线上,调用translate时 // 是在其本地空间进行的,所以新的位置仍然在z,x平面之间 // 只是z轴上加了20个单位 node3->translate(0, 0, 20, Ogre::Node::TS_LOCAL); node3->attachObject(ent3); } private: };
节点旋转默认实在本地空间进行的。
class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("node2"); node2->setPosition(10, 0, 0); // 旋转变换默认是在本地空间进行的,以本地空间为参考, // 下面的语句等同于node2->yaw(Ogre::Degree(90), Ogre::Node::TS_LOCAL); // 由于是在本地空间旋转的,所以旋转后本地空间的坐标轴的朝向会同 // 模型的朝向一起发生变化。 node2->yaw(Ogre::Degree(90)); node2->roll(Ogre::Degree(90)); node2->attachObject(ent2); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = node->createChildSceneNode("node3"); node3->setPosition(20, 0, 0); // 在世界空间旋转是以世界空间坐标系为参考的,模型旋转后不改变 // 世界空间的坐标轴的朝向,只是模型自己的朝向发生了变化。 node3->yaw(Ogre::Degree(90), Ogre::Node::TS_WORLD); node3->roll(Ogre::Degree(90), Ogre::Node::TS_WORLD); node3->attachObject(ent3); } private: };
缩放变换与空间无关。