场景管理器的使用

  最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World)、父节点空间(Parent)以及本地空间(Local)。

1、世界空间

  就是物体所存在的地方,当我们把一个模型放进世界模型里面去,那么它就有了一个世界坐标,这个世界坐标是用来标记世界中不同的模型所处的位置的。在世界空间里,世界的中心就是远点(0,0,0)。而在ogre中,这个也相当于场景根节点的位置,所以世界空间在ogre中也可以理解为“相对于场景根节点”。世界空间也意味着用全局的X,Y,Z坐标。

  父节点空间变换是相对于一个节点的父节点,也就是把父节点的坐标作为变换空间的矩阵原点。本地空间变换是相对于对象绑定的节点本身。大多数情况下,物体的移动是在父空间里面进行,旋转和缩放是在本体空间里面做,这也是ogre中所默认的操作方式。

2、物体空间

  你所创建的物体最终都要放到世界空间里。而所谓物体空间是指相对于物体本身的坐标系。

3、本地空间

  本地空间   ----   就是绕着自己的轴旋转,相对于自己的中心进行缩放。

4、父节点空间(Parent Space)

  父节点空间变换就是相对于父节点的变换。

5、场景中的活动物体(Movable Scene Object

  活动物体(Movable Object)由场景管理器创建,并且绑定到场景节点上,最后再由场景管理器销毁。

  以资源为基础的物体(Resource-Based Objects)

  在Ogre中有相当多的场景内容是根据磁盘的信息来创建的,在这里把它们称为以资源为基础(也可称为磁盘基础)的活动物体,其中最常见的莫过于模型本身以及相应的骨骼数据。

  以四边形为基础的物体(Qurd-Based Objects)

  在活动物体中有很多的以四边形(Quad)为基础的实体,其中包括了粒子系统(Particle System)、公告栏(Billboards)、跟踪轨迹(Ribbon Trail)、表层(Overlay)和天空盒(Skybox,以及相关的天空面Skyplane和穹顶Skydemo)。

  天空面、天空盒和穹顶之间的区别

  其中最大的共同点是它们总是和摄像机保持着固定距离;其次,它们要么是在所有场景物体渲染之前渲染(这也是默认的情况),要么是在所有场景物体渲染之后渲染;

  天空面(Skyplane)  

  天空面就是用来模拟现实世界中天空的一个平面。和ogre中所有其他的平面一样,通过法线和距离来确定在场景中放置位置。

  穹顶(Skydome)

  穹顶技术使用了五个平面来来构造天空,它是一个顶和四个侧面组成的半盒,就是没有底额盒子。天空半盒的每一个面都和摄像机保持固定的距离。这个距离可以交给具体应用来配置。

  天空盒(Skybox)

  首先要注意的是,天空盒并不是简单的在穹顶技术上增加一个底部平面。而是使用了标准的UV坐标变换映射的方法来处理相应纹理,进而只有天空盒才能使用立方体纹理(Cubic Texture)技术来实现天空的细节。

  渲染对象(Rendering Object)

  渲染对象是指用来帮助场景图进行渲染功能的对象,而不是渲染到屏幕的物体。在场景中两个最重要的对象是摄像机和灯光,其中摄像机帮助我们拍摄场景中的物体,而活动的灯光则是你的场景显得更立体和真实。

  摄像机(Camera)

  定义产生一个视截体用来处理渲染工作,有一个近截面和一个远截面。

  灯光(Light)

  分三种,点光源,聚光灯光源,有向光源。

 场景管理器例子:

  使用过程:首先要建立一个场景管理器的实例,然后至少还要构建一个摄像机,并执行“放置一个实体到场景中”的操作。

  建立一个场景管理器和摄像机

 1   virtual void chooseSceneManager(void)
{
// Create the SceneManager, in this case a generic one
mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");//创建
}
virtual void createCamera(void)
{
// Create the camera
mCamera = mSceneMgr->createCamera("PlayerCam");//
// Position it at 500 in Z direction
mCamera->setPosition(Vector3(0,0,500));//
// Look back along -Z
mCamera->lookAt(Vector3(0,0,-300));//
mCamera->setNearClipDistance(5);//
mCamera->setFarClipDistance(1000);//
}

  创建实体和灯光

 void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));//设置环境光源
// Create a point light
Light* l = mSceneMgr->createLight(“MainLight”); //创建点光源
// Accept default settings: point light, white diffuse, just set position
// NB I could attack the light to a SceneNode if I wanted it to move
// automatically with other objects, but I don’t
l->set Position(,,);  //设置位置
Entity * ent = mSceneMgr->createEntity(“head”, “ogrehead.mesh”);//创建实体
// Set material loaded from Example.material
Ent->setMaterialName(“Examples/EnvMappedRustySteel”);//
// Add entity to the root scene node
mSceneMgr->gerRootSceneNode()->createChildSceneNode()->attachObject(ent);//将实体添加到场景节点
}

  场景节点的移动和旋转

  mSceneNode->translate(100.0, 10.0, 0.0);//场景节点在默认的情况下变换空间为父节点空间(TS_PARENT)

  mSceneNode->translate(100.0, 10.0, 0.0, TS_WORLD);//如果在世界空间进行节点变换,就这样调用

  mSceneNode->translate(0.0,0.0,100.0,TS_LOCAL);//对于本体空间的变换也是类似,本例是将一个节点沿着它朝向的方向“向前”移动100个单位

  对于旋转场景节点而言,默认的变换空间为本地空间(TS_LOCAL);如果你需要不同的旋转空间,必须明确的告知Ogre:

 // 对象绕自己的Y轴旋转一弧度,大约57角度
mSceneNode->yaw(Ogre::Radian(1.0));//
// 对象绕父节点的X轴旋转一弧度,大约57角度
mSceneNode->pitch(Ogre::Radian(1.0), TS_PARENT);//
// 对象绕世界的Z轴旋转一弧度,大约57角度
mSceneNode->roll(Ogre::Radian(1.0),TS_WORLD);//

  缩放不需要关系空间;它在节点本身执行,同时影响节点的所有子节点。

  mSceneNode->scale(2.0, 1.0, 1.0);// 在X轴缩放两倍,其他轴不缩放

ogre3D学习基础6---场景管理器的使用的更多相关文章

  1. ogre3D学习基础11 -- 交换两个场景管理器

    这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...

  2. ogre3D学习基础8 --- 资源管理器

    资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术.通路.纹理单元等数据的定义). 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh.包含几何信息和一些 ...

  3. ogre3D学习基础1 -- 核心对象与脚本技术

    一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...

  4. ogre3D学习基础9 -- 光源程序实例

    这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...

  5. 转:Ogre的八叉树场景管理器OctreeSceneManager

    上面是我绘制的一张图. 关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager. 下面摘录图 ...

  6. 转:OGRE场景管理器介绍

    一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可 ...

  7. [Axiom 3D]3.SceneManager场景管理器

    首先看看Axiom.Core命名空间下public abstract class SceneManager : DisposableObject A SceneManager organizes th ...

  8. ogre3D学习基础17 --- 如何手动创建ogre程序

    建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...

  9. ogre3D学习基础16 -- 手动创建实体(ManualObject)

    这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板 #include "ExampleApplication.h" class Example1 ...

随机推荐

  1. ABAP扫雷游戏

    . INCLUDE <icon>. CONSTANTS: " >> board cell values blank_hidden ', blank_marked TY ...

  2. 《Ionic 2 实例开发》发布

    Ionic 2系列教程集结成册,在百度阅读上架发布,名为<Ionic 2实例开发>(点击书名将打开地址:http://yuedu.baidu.com/ebook/ba1bca51e4189 ...

  3. Web Api2中使用Session

    要在webApi里面使用Session必须在Global.asax插入 public override void Init() { this.PostAuthenticateRequest += (s ...

  4. 本号讯 | 人工智能手表为帕金森患者带来书写希望;微软翻译发布可实时翻译幻灯片的Presentation Translator

    7 月 12 日,微软成立微软研究院人工智能中心(Microsoft Research AI).这是一个隶属于微软研究体系内的科研和孵化中心,将聚焦于解决最复杂的人工智能挑战. 这支由科学家和工程师组 ...

  5. Windows 7, Visual Studio 2015下编译Webkit

    因工作需要,需要编译Windows版本的Webkit,中间走了不少弯路,都记录下来,供大家参考!也随时欢迎大家讨论(QQ群:345802342) 整个编译工作参考的是官方文档:https://webk ...

  6. 随记:UWP开发中怎么使当前页面拓展到标题栏

    public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); CoreAp ...

  7. AutoHotKey设置ide的光标功能键

    CapsLock:: SetCapsLockState,off ;锁定为小写 CapsLock & d:: flag_C=1 ;小写d代替control键,实现跨词移动CapsLock &am ...

  8. JAVA多线程编程——JAVA内存模型

    一.何为“内存模型” 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,但是编译器 ...

  9. JavaScript -- 操作符和逻辑运算

    算数操作符 + : 加 - : 减 * : 乘 / : 除 %:取余 递增和递减 1.递增 ++a与a++都是对a进行递增的操作 区别 ++a先返回递增之后的a的值 a++先返回a的原值,再返回递增之 ...

  10. echarts实现仪表盘(自己动起来,没有后端,顺便重温math.random

    let a = parseInt(Math.random() * (2 + 1), 10); let arr = []; arr.push(res[a]); let option = { toolti ...