• ogre3D学习基础6---场景管理器的使用


    场景管理器的使用

      最常使用的坐标系统空间(同时也是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)
     2     {
     3         // Create the SceneManager, in this case a generic one
     4         mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");//创建
     5     }
     6     virtual void createCamera(void)
     7     {
     8         // Create the camera
     9         mCamera = mSceneMgr->createCamera("PlayerCam");//
    10          // Position it at 500 in Z direction
    11         mCamera->setPosition(Vector3(0,0,500));//
    12         // Look back along -Z
    13         mCamera->lookAt(Vector3(0,0,-300));//
    14         mCamera->setNearClipDistance(5);//
    15         mCamera->setFarClipDistance(1000);//
    16     }

      创建实体和灯光

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

      场景节点的移动和旋转

      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:

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

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

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

  • 相关阅读:
    0180 定时器 之 setInterval() :开启定时器,京东倒计时案例,停止定时器,发送短信倒计时案例
    0179 定时器 之 setTimeout() :开启定时器,5秒后关闭广告案例,停止定时器
    json常用的注解
    Base64 编码与解码详解
    API 交互中怎么做好图片验证码?
    CSS中cursor 鼠标指针光标样式(形状)
    本地数据存储解决方案以及cookie的坑
    base64原理浅析
    Web前端十种常用的技术
    FreeMarker网页静态化
  • 原文地址:https://www.cnblogs.com/songliquan/p/3293126.html
Copyright © 2020-2023  润新知