博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ogre 2011-11-24
阅读量:6956 次
发布时间:2019-06-27

本文共 6094 字,大约阅读时间需要 20 分钟。

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:};

  

缩放变换与空间无关。

你可能感兴趣的文章
5分钟入门AWK
查看>>
GPS定位系统怎么定位监控,如何快速二次开发行业应用 ...
查看>>
Nacos 发布 1.0.0 GA 版本,可大规模投入到生产环境 ...
查看>>
1月2日云栖精选夜读 | 阿里巴巴达摩院发布2019十大科技趋势:语音AI在特定领域通过图灵测试 ...
查看>>
阿里云中间件有哪些?这里最全面
查看>>
scrapy自带文件下载器,实现多层级目录结构的存储 ...
查看>>
批处理 启动和关闭 Oracle 11g 服务
查看>>
解决WIN7启动DHCP服务报1075错误办法
查看>>
移动端弹性滑动以及vue记录滑动位置
查看>>
Windows10 VS2017 C++信号处理
查看>>
GPS定位系统源码GPS定位系统 GPSBD专为二次开发而设计 ...
查看>>
LocalDateTime API 整理
查看>>
ASK动画获三千资本A+轮投资,将加速推进原创动漫作品的创作 ...
查看>>
Postgresql服务器配置-设置参数
查看>>
你想了解Python中的 == 和IS 其他?
查看>>
最强求职攻略:java程序员如何通过阿里、百度社招面试
查看>>
B2B电商营销若有十分惊艳,九分在内容营销
查看>>
阿里云护航罗振宇2018“时间的朋友”跨年演讲,与千万观众一起跨年
查看>>
如何使用Hanlp加载大字典
查看>>
jdbc练习题
查看>>