Ogre 2011-11-24

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:

};

  

缩放变换与空间无关。

你可能感兴趣的:(r)