Ogre_初学指导_4_"空间坐标系统及其操作”

如果有疑问或发现错误可发E-Mail联系:swazer_z@126.com, 谢谢!

空间坐标系统及其操作:

      

上一节已经提到了对节点的位置操作,如绕Y轴旋转90度:yaw(Degree(90.0))

但是这一节详细的讲解关于Ogre中的3D空间操作。


          图OgreSpace

上图是Ogre中的坐标系统,竖直方向是Y轴,左右为X轴,垂直用户界面的是Z轴。这个图我们必须要时刻了然于胸否则很容易方向混乱。

这里主要以translate()这个函数进行讲解,以形象说明在Ogre中是如何操作3D空间的。

translate(变量1,变量2)主要有两个参数。

变量1:类型是Vector3,Vector3有三个变量:x、y、z。有时我们为了简便常写为translate(x,y,x,变量2),当然,也可以写为:translate(Ogre::Vector3(x,y,z),变量2)。

变量2:类型是(enum枚举)TransformSpace,其有三个可选值TS_LOCAL(局部空间)、TS_PARENT(父空间)、TS_WORLD(全局空间) ,在默认情况下,TransformSpace值是TS_PARENT

假设有三个节点:Node、Node2、Node3。Node的2、3的父节点,2、3是兄弟节点。

  • TS_PARENT(父空间):其坐标系统采用其父对象的坐标系统。如果Node2在此Space下translate(0,0,20)则Node2是沿着Node的Z轴方向移动了20个单位。
  • TS_LOCAL(局部空间):以自身的坐标系统为主。同样是translate(0,0,20,Ogre::Node::TS_LOCAL),Node3会在自己的Z轴方向移动20个单位。
  • TS_WORLD(全局空间):以Ogre所定义的坐标系统为准,即以图OgreSpace  空间系统进行位置变换。

由于只是想说明空间的问题,所以我只给出了对模型位置的移动操作,而没有写旋转操作,它们与translate一样也是两个主要参数,分别是角度(或弧度)、坐标系统。

如:yaw(Ogre::Degree(45),Ogre::Node::TS_LOCAL)。


可以参考具体代码查看效果图:

#include"ExampleApplication.h"

 

usingnamespaceOgre;

classexample1 :publicExampleApplication

{

protected:

      voidcreateScene()

      {

      Entity *ent = mSceneMgr->createEntity("MyEntity","Sinbad.mesh");

            SceneNode*node =mSceneMgr->createSceneNode("Node1");

            node->setPosition(0,0,0);

            mSceneMgr->getRootSceneNode()->addChild(node);

            node->attachObject(ent);

            //Parent Space is defult

      Entity *ent2 = mSceneMgr->createEntity("MyEntity2","Sinbad.mesh");

            SceneNode *node2 = node->createChildSceneNode("node2");

            node2->yaw(Ogre::Degree(45));

            node2->translate(0,0,20,Ogre::Node::TS_PARENT);

            node2->attachObject(ent2);

            //Local Space

      Entity *ent3 = mSceneMgr->createEntity("MyEntity3","Sinbad.mesh");

            SceneNode *node3 = node->createChildSceneNode("node3");

            node3->yaw(Ogre::Degree(45));

            node3->translate(0,0,20,Ogre::Node::TS_LOCAL);

            node3->attachObject(ent3);

      }

public:

      example1(){}

      ~example1(){}

};

int main()

{

      example1ex1;

      ex1.go();

      return0;

}

我以简单图示表示效果 ——Local& Parent

如下图:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值