接着上篇写

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()的代码删除,为实现旋转,可添加如下代码:

      //旋转
2 //1 原始状态,未旋转
Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin","penguin.mesh");//
Ogre::SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//
node1->setPosition(-,,);//设置位置
node1->attachObject(ent1);//添加到场景节点
//2 向右平移,并绕X轴旋转90度
Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin","penguin.mesh");//
Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//
node2->attachObject(ent2);//
node2->translate(-,,);//平移到(-20,0,0)
node2->pitch(Ogre::Radian(Ogre::Math::HALF_PI));//绕着x轴旋转90度
//3 设置位置,并绕Y轴旋转90度
Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin","penguin.mesh");//
Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//
node3->setPosition(,,);//
node3->yaw(Ogre::Degree(90.0f));//绕着y主旋转90度
node3->attachObject(ent3);
//4 设置位置,并绕Z轴旋转90度
Ogre::Entity *ent4 = mSceneMgr->createEntity("penguin","penguin.mesh");//
Ogre::SceneNode *node4 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//
node4->setPosition(,,);
node4->roll(Ogre::Radian(-Ogre::Math::HALF_PI));//绕着z轴旋转90度
node4->attachObject(ent4);//

  效果如下:可看到四个小企鹅:  

  代码解释:

  pitch() 让节点绕着x轴绕着逆时针方向旋转90度,c参数Radian代表弧度,math代表数学类,而HALP_PI代表弧度为90。

  yaw() 绕y轴旋转指定的度数,Degree代表角度类

  roll() 绕z轴旋转指定的角度,参数如上

  缩放

  代码如下,主要用到scale()函数

         //缩放比例
//1 原始比例
Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin1","penguin.mesh");
Ogre::SceneNode * node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子节点
node1->setPosition(,,);
node1->attachObject(ent1);//将实体对象绑定到场景节点
//2 放大2倍
Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin2","penguin.mesh");
Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子场景节点
node2->setPosition(,,);
node2->scale(,,);//放大2倍
node2->attachObject(ent2);//将实体对象绑定到场景节点
//3 缩小一半
Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin3","penguin.mesh");
Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子场景节点
node3->setPosition(-,,);
node3->scale(0.5,0.5,0.5);//缩小一半
node3->attachObject(ent3);//将实体对象绑定到场景节点

  效果如图:

  代码解释:

  scale() --- 对实体进行缩放,参数也比较简单。

 

 空间变换

  世界坐标空间和父坐标空间的变换:

         //空间坐标
//1 节点1
Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//创建节点
node1->setPosition(,,);
node1->yaw(Ogre::Degree(180.0f));//旋转180度,节点1 z轴方向指向屏幕内
mSceneMgr->getRootSceneNode()->addChild(node1);
node1->attachObject(ent1);//将实体对象绑定到场景节点
//2 节点2
Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");//创建子场景节点
node2->setPosition(,,);
//node2->translate(0,0,20,Node::TS_WORLD);//相对于世界坐标空间,而世界坐标空间始终指向屏幕外,故向指向屏幕方向移动20单位
14 node2->translate(0,0,20);//相对于父节点移动,而node1 z轴方向指向屏幕内,故屏幕内移动20单位

node2->attachObject(ent2);//将实体对象绑定到场景节点  

 效果如图 node2->translate(0,0,20);这样的话是相对于父节点移动,而node1 z轴方向指向屏幕内,故屏幕内移动20单位。

  将代码改为node2->translate(0,0,20,Node::TS_WORLD);这样是相对于世界坐标空间,而世界坐标空间始终指向屏幕外,故向指向屏幕方向移动20单位。效果如图:

 局部坐标空间和父坐标空间

  局部坐标空间 ---- 是针对模型自身的,可用一下代码实验。

  代码如下:

         //局部坐标空间变换
Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//创建节点
node1->setPosition(,,);
node1->yaw(Ogre::Degree(180.0f));//绕y轴顺时针旋转180度,节点1 z轴方向指向屏幕内
node1->pitch(Ogre::Degree(-90.0f));//绕x轴顺时针旋转90度
mSceneMgr->getRootSceneNode()->addChild(node1);
node1->attachObject(ent1);//将实体对象绑定到场景节点 Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");
node2->yaw(Ogre::Degree());//绕y轴旋转45度
node2->translate(,,);//沿z轴正方向平移20 单位,以父坐标空间为基准
node2->attachObject(ent2); Ogre::Entity*ent3 =mSceneMgr->createEntity("ent3","Sinbad.mesh");
Ogre::SceneNode*node3 =node1->createChildSceneNode("node3");
node3->yaw(Ogre::Degree());//绕y轴旋转45度
node3->translate(,,,Ogre::Node::TS_LOCAL);//以自身坐标空间为基准,沿下图中箭头所指方向平移20单位
node3->attachObject(ent3);

  效果图如下:

代码解释:

  可以这样比喻,第一人首先向后转,然后我们切换视角,从上往下看,然后第二人在第一人的基础上直走20单位,而第三人在第一人的基础上,自己先左转了45度,然后直走20单位。

  

  这个空间旋转太绕了,迷了一天终于迷过来了。原来如此。

 

ogre3D程序实例解析1-平移旋转与缩放的更多相关文章

  1. 实验与作业(Python)-03 Python程序实例解析

    截止日期: 要求: 下周实验课前上交,做好后在实验课上检查可获取平时分. 做出进阶或选做的的请用清晰的标致标识出来,方便老师批改 本次作业:可提交也可不提交.作业算平时成绩. 本次作业内容量较大,请组 ...

  2. 实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)

    截止日期: 要求: 下周实验课前上交,做好后在实验课上检查可获取平时分. 做出进阶或选做的的请用清晰的标致标识出来,方便老师批改 本次作业:可提交也可不提交.作业算平时成绩. 本次作业内容量较大,请组 ...

  3. Python语言程序设计基础(2)—— Python程序实例解析

    温度转换 def tempConvert(ValueStr): if ValueStr[-1] in ['F','f']: ans = (eval(ValueStr[0:-1]) - 32)/1.8 ...

  4. [ Python ] Flask 基于 Web开发 大型程序的结构实例解析

    作为一个编程入门新手,Flask是我接触到的第一个Web框架.想要深入学习,就从<FlaskWeb开发:基于Python的Web应用开发实战>这本书入手,本书由于是翻译过来的中文版,理解起 ...

  5. 【转载】Unity中矩阵的平移、旋转、缩放

    By:克森 简介 在这篇文章中,我们将会学到几个概念:平移矩阵.旋转矩阵.缩放矩阵.在学这几个基本概念的同时,我们会用到 Mesh(网格).数学运算.4x4矩阵的一些简单的操作.但由于克森也是新手,文 ...

  6. exec函数族实例解析

    exec函数族实例解析 fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的 ...

  7. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  8. Android实例-Delphi开发蓝牙官方实例解析(XE10+小米2+小米5)

    相关资料:1.http://blog.csdn.net/laorenshen/article/details/411498032.http://www.cnblogs.com/findumars/p/ ...

  9. Android开发之IPC进程间通信-AIDL介绍及实例解析

    一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...

随机推荐

  1. 使用 h5 新特性,轻松监听任何 App 自带返回键

    var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : ...

  2. 好吧,不说闲言碎语,不抱怨,好好工作,好好学习,多总结。记录一下昨天做vuejs的心得

    1.做了两个bat文件,一个是直接定位到vuejs项目并且运行,另一个就是打包 run.bat d:cd wwwcd vuecd dtbpmcnpm run devpause build.bat cd ...

  3. Mac版 Slickedit 2013 v18.0.3.3 破解

    今天在Windows机器上面,无调试器的情况下,把 Mac系统下的Slickedit给破解了并测试通过. 原始安装包下载: Mac Slickedit 2013 (v18.0.3.3) 破解文件下载地 ...

  4. java校验maven下载的jar文件

    有时候maven真的很坑! 有时候提示invalid LOC header (bad signat signature), 但又有时候什么都不提示,工程报错,情况有肯多中,不知道大家遇到过几种诡异的. ...

  5. sudo的用法

    为了系统安全我们一般不直接使用root用户进行日常维护,sudo是临时提升root权限,有时执行一些命令或者更新没权限的文件时需要使用root,这个时候就需要sudo上场了 普通用户是没有sudo使用 ...

  6. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  7. 如何从桌面程序向浏览器传递cookie或自定义header

    类似问题 从c#程序启动ie并传递cookie 打开默认浏览器并传递cookie 打开一个web浏览器使用c#应用程序并添加请求头 猜想 从wpf程序打开默认浏览器并定位到一个url ,并且向这个ur ...

  8. 【转】iOS学习笔记(十七)——文件操作(NSFileManager)

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  9. 原型与原型继承demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 数据结构算法与应用c++语言描述 原书第二版 答案(更新中

    目录 第一章 C++回顾 函数与参数 1.交换两个整数的不正确代码. 异常 10.抛出并捕捉整型异常. 第一章 C++回顾 函数与参数 1.交换两个整数的不正确代码. //test_1 void sw ...