OGRE - 场景管理器

osg 三维gis开发_三维gis开发引擎——ogre和osg和osgearth对比 OSG(OpenSceneGraph):专为GIS而生。但是呢。。原生的OpenSceneGraph也并不支持三维分析和三维存储。但是能人拓展的OSGEarth却可以支持。OSG(OpenSceneGraph)简介:linkOGRE:侧重于游戏画面渲染 用游戏引擎来做三维地球显示。。数据联动是个问题。以上的三款gis开发引擎最大的特点都是免费开源的,相比于国外的gis开发商软件,它们的优势在于可... 阅读详情
OGRE教程 - 场景管理器

上次,我们讲了初始化OGRE,写完以后对自己很不满意,觉得写出来的东西没有什么实质内容,大家学不了什么东西.这次就讲点实际的吧.

首先讲解一点图形学知识.

基本变换

所谓变换,就是指物体的平移,旋转,缩放这几个最基本的操作. 而在3D的世界,这几个操作都是源于矩阵的乘法.(大家会不会问:平移怎么会是乘法呢?明明是加法啊?这个后面讲)

首先来讲讲矩阵的意义吧.

一个物体在一个三维坐标系中有一个固定的位置或者说是坐标 (x,y,z), 这就是一个1*3的矩阵.

平移

那么要使物体的位置发生变化,例如向X方向移动5个单位,实际上只需要简单的执行x+5即可,那么反映在矩阵上就是加上一个平移矩阵

clip_image002

旋转

clip_image004clip_image006

绕z轴旋转α度后的坐标转换为矩阵乘法:

clip_image008

缩放

缩放实际上就是让每个点的坐标乘以一个拉伸系数,如果把一个平面的四个点都乘以系数,那clip_image010么体系在平面上的效果就是平面被缩放了

讲完了最基本的三种变化以后,我讲讲变化的合成

例如,我们想让一个物体绕空间中任意轴旋转

clip_image012

那么我们需要做的要分几步:

第一步: 通过平移和旋转建立一个新的坐标轴,使新的坐标系的z轴和任意轴重合.

第二步: 在新的坐标系中,把物体绕新的z轴旋转(实际上就是绕k旋转)

第三步: 通过反向平移和旋转把物体恢复到以前的坐标系.

这个有点不好理解,大家多实践吧.

最开始我讲了在3D游戏中,一个物体往往既要平移,又要旋转等,而大量的矩阵乘法运算会极大的影响系统的速度,所以我们需要把矩阵乘法合并,即我们需要把平移矩阵和旋转缩放矩阵合并成一个矩阵来提高效率.可是我们的平移矩阵和源坐标执行的是加运算,怎么能合并呢?

我们的解决方案是齐次坐标系,把原先的三维矩阵扩展成四位从而实现平移矩阵和源矩阵相乘.

clip_image014齐次坐标转换:

那么在齐次坐标系下的平移,缩放,旋转分别如下:

clip_image016平移

缩放:

clip_image018

旋转:

clip_image020

合成三个操作只需要简单的把三个矩阵先乘起来即达到目的.

好,理论就到这里: 来点实际的.

今天我们讲OGRE的场景管理器

从数据管理上理解,场景管理器就是一个存放众多游戏单位的容器.从数据结构上讲,就是一个树的结构.之所以用树状结构,是因为在3D游戏中,对父节点的矩阵变化会应用到子结点.想像一个人在走动,人的身体这个根节点上挂接了手脚,人的平移会带动手脚的平移.

那么我介绍一个OGRE管理器的主要功能吧:

·在场景中创建和放置活动物体、灯光以及摄像机,并维护他们的在场景图中的变换。

·载入和布置世界地图(World geometry,与活动实体不同,世界地图是巨大且可以延伸的,通常情况下是不可移动的,比如一个完整的BSP地图 – 这个概念后面讲到)。

·对场景查询(Scene Queries)的支持,比如回答“在世界的某个原型空间内,都包含了那些物体”。

·剔除不可见物体并且将可见物体放入渲染队列。

·根据当前和渲染物体的透视图,对无方向的光源(Nondirectional Light)进行组织和排序(按由近到远)。

·设置并且渲染场景中的阴影。

·渲染场景中的其他物体,如背景和天空盒

·发送组织好的内容到渲染系统执行渲染

以前我们讲过,OGRE的优势是把场景管理器作为插件的形式载入.所以我们会和很多管理器打交道,但是有人会问,问什么需要很多管理器呢?不就是存游戏单位的容器吗?实际上,一个庞大的3D游戏,例如地牢围攻,即包含了广阔的平原,又包括了室内空间,而渲染这两种场景,需要不同的算法来进行渲染优化.

OGRE提供了两种管理器:

OctreeSceneManager,八叉树

这个以前znnren师兄在版上讲过

TerrainSceneManager

这个我还没有搞懂

这是OGRE场景管理器的树状结构图.

clip_image022

当我们在创建管理器的时候,我们会得到一个总的父节点Root Scene Node,用来挂接我们自己的节点.

讲完了层次关系,我们来讲讲坐标系这个概念:

在OGRE中,我们要和以下几个坐标系打交道:

物体坐标系:

如果你创建了一个物体(不论是通过3D模型工具产生还是手动构造),物体的顶点都会被放置在世界空间中。我们在这里举个例子:我们在这里是用3DS Max工具来进行模型的制作,在编辑场景的原点(0,0,0)建立一个边长为1的立方体,这样他的顶点都在类似(0.5,0.5,0.5)的范围内。我们所用的坐标,都是处在物体坐标系中的.当OGRE载入了这个物体之后,所有顶点的位置仍然何在3DS Max编辑空间内相同。换句话说,一个在3D工具中设置在点(1,1,1)的顶点,在导出到Ogre系统中,这个顶点相对于它挂接的场景节点的位置仍然是(1,1,1)。

当物体被挂接到场景节点上的时候,这个场景节点上的世界空间转换矩阵就会应用到这个物体上面的所有顶点上,从而把物体转换到世界空间的绝对位置,这也是确定物体在3D空间位置、缩放以及方向的原理。事实上这些转换并不是直接施加在物体顶点上面的,所以这些操作也不会影响物体上面所顶点到所挂接场景节点位置的距离。

本地空间

这个概念没什么可说的,只需要注意:对于物体的旋转和缩放来说,“本地空间”的概念就是绕着自己的轴旋转;相对于自己的中心点进行缩放。

父节点空间(Parent Space)

想像地球围着太阳转动吧.太阳就是地球的父节点

世界空间(World Space)

我们的摄像机所在空间就在世界空间中,相信这个概念也很好理解

其他的关于场景管理器的内容我们下次讲解

下面我给出一些代码

这是有Root创建场景管理器的代码,字符串表示创建的管理器类型标示

mSceneMgr = mRoot->createSceneManager(“TerrainSceneManager”);

接下来我们完善这个空的场景

void createScene(void)

{

   //设置环境光

   mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));

   // Create a point light 创建点光源

   Light* l = mSceneMgr->createLight(“MainLight”);

   l->set Position(20,80,50);

//创建一个场景内容(注意我们建立的是内容,不是一个场景节点,因为OGRE的理念是场景 //内容和场景节点分离,从而提高扩展性),读取.mesh文件,上一章讲过mesh,可以理解成一个//素材

   Entity * ent = mSceneMgr->createEntity(“head”, “ogrehead.mesh”);

   // 设置材质

   Ent->setMaterialName(“Examples/EnvMappedRustySteel”);

   // 建立一个子场景节点,在该节点上挂接场景内容

   mSceneMgr->gerRootSceneNode()->createChildSceneNode()->attachObject(ent);

}

接下来我们从代码上来了解平移变化:

OGRE非常友善的封装了矩阵乘法(实际上从DirectX和OpenGL层面上就已经封装了,只不过我们还是要和矩阵打交道,因为我们没有场景管理器:p),所以你只需要说明你想要平移的单位,例如x方向100个单位,y方向10个单位. 下面的代码同样是在场景节点上进行变化,产生的结果是导致挂接在节点上的场景内容发生平移.节点和内容分离万岁

mSceneNode->translate(100.0, 10.0, 0.0);

其他的实例:

注意, TS_PARENT是声明使用的坐标系.顾名思义,PARENT表示使用父节点坐标系.说到这里,让我想起来刚才我们讲的矩阵变化的合成,如果没有场景管理器,你将自己解决所谓的LACAL和WORLD坐标系这些概念.你需要PUSH压栈,POP出栈你的矩阵来实现这一切.

// 对象绕自己的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);

// 在X轴缩放两倍,其他轴不缩放

mSceneNode->scale(2.0, 1.0, 1.0);

Information Fusion投稿避坑指南:从初稿到返修的完整流程解析(附模板下载) 本文详细解析了向Information Fusion投稿的全流程,从初稿准备到返修策略,涵盖了22个关键细节。特别强调了投稿前的隐形门槛、LaTeX模板的字体陷阱、图表规范要求以及返修回复的进阶技巧,帮助研究者避免常见错误,提升稿件接受率。附有实用模板下载,助力学术写作效率提升。 阅读详情

相关推荐

手把手教你用ZYNQ PS端GPIO模拟SPI驱动OLED屏幕(附Vivado工程)

本文详细介绍了如何利用ZYNQ PS端的EMIO功能,通过GPIO模拟SPI协议驱动SSD1306 OLED屏幕。从Vivado工程配置、SPI协议软件实现到SSD1306驱动开发,提供了完整的解决方案和优化技巧,适合嵌入式开发者快速上手。

weixin_30776545的博客 129

在ogre中加载 ogremax场景文件方法

 在ogre中加载 ogremax场景文件方法发布: 2009-2-10 21:54 |  作者: webmaster |  来源: 本站原创 |  查看: 27次看到很多人对ogremax在ogre中怎么加载不大熟悉,其实作者有一篇文章有介绍的,我把我自己在我的ogreview中用ogremax的方法写下来,供各位参考。(1)首先下载最新的ogremax. (2)找到图片

Oman-3D 3640

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2851

ogre 世界坐标、本地坐标、屏幕坐标之间的转换

1.本地坐标转为世界坐标 void local2World(const Vector3 locP, Vector3 &worldP, const SceneNode* node) { Matrix4 worldMat; node->getWorldTransforms(&worldMat); //获取该物体的世界坐标矩阵 worldP = worldMat * locP; } 2.世

Anne的IT小天地 1901

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8332

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析

本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。

weixin_29245767的博客 1151

Ogre 场景管理器

转自:http://blog.sina.com.cn/s/blog_694aab1b0100rdvm.html 在通常的情况下,Ogre的场景管理器会负责处理以下事情: ·在场景中创建和放置活动物体、灯光以及摄像机,并维护他们的在场景图中的周游和变换。 ·载入和布置世界地图(World geometry,与活动实体不同,世界地图是巨大且可以延伸的,通...

aikb6223的博客 234

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 169

ogre的场景管理器

原文地址:ogre的场景管理器作者:zhouwenjie在通常的情况下,Ogre的场景管理器会负责处理以下事情: ·在场景中创建和放置活动物体、灯光以及摄像机,并维护他们的在场景图中的周游和变换。 ·载入和布置世界地图(World geometry,与活动实体不同,世界地图是巨大且可以延伸的,通常情况下是不可移动的,比如一个完整的BSP地图)。   ·对场景查询(Scene Queries)的支持

胖大星的博客 877

【计算机视觉 | 目标检测】目标检测常用数据集及其介绍(十一)

【计算机视觉 | 目标检测】目标检测常用数据集及其介绍(十一)

wzk4869的博客 738

opencv 双目摄像头拍照(分别左右镜头拍照)

准备一个usb线的双目同步摄像头: 运行环境是vc2015,opencv3.1。 将左右两个摄像头拍到的图片分别保存起来。 1)适用条件 双目同步摄像头(两个镜头,共用一个设备ID) 使用语言:C++ 、opencv库 摄像头 分辨率2560*960 或以上。 源程序: #include"stdafx.h" #include<iostream&g...

黎国溥 1万+

OGRE场景管理器

场景管理器不是单例,您想创建多少就创建多少。创建方法1、new SceneManager()2、Root的createSceneManager方法 一般都使用方法2为什么使用createSceneManager函数?原因是Ogre的插件系统,比如你使用了OctreeSceneManager插件的话,OctreeSceneManager会将自身注册为ST_GENERIC类

人在旅途/章鸽 的专栏 1366

Linux内核4.14版本——drm框架分析(1)——drm简介

本文介绍了DRM架构的发展历史、驱动框架以及简单示例,旨在帮助读者了解DRM架构的形成、功能流程实现。

phmatthaus的专栏 2551

OGRE - 场景管理器

 1月20日OGRE教程 - 场景管理器上次,我们讲了初始化OGRE,写完以后对自己很不满意,觉得写出来的东西没有什么实质内容,大家学不了什么东西.这次就讲点实际的吧. 首先讲解一点图形学知识. 基本变换 所谓变换,就是指物体的平移,旋转,缩放这几个最基本的操作. 而在3D的世界,这几个操作都是源于矩阵的乘法.(大家会不会问:平移怎么会是乘法呢?明明是加法啊?这个后

痞子龙3D编程 2754

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

(3) OGRE的基石:场景管理器、场景节点、实体

提示1、确定你已经按照前一教程配置好了第一个应用程序的环境2、所有的代码,你应该自己去敲键盘,尝试多种情况并运行查看效果简介在这篇教程里,我会向您介绍OGRE最基础的构架:场景管理器,场景节点和实体从这里开始将前一教程的工程拷贝一份,我们将在他的基础上做一些功能扩充和展示。我们所需要修改的只有一个代码文件:TutorialApplication.cpp,而且我们只需要关注成员函数:createScene()。OK,让我们边写代码边讲解吧,GO!为成员函数createScene()补充如下代码:void Tu

armoonwei的专栏 2978

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ogre 场景管理器 scenemanager

声明:本篇转自 痞子龙3D编程 优快云博客,仅留作学习交流之用 ^_^ 原文参照: http://blog.youkuaiyun.com/pizi0475/archive/2010/04/05/5451319.aspx OGRE除了我们已经见过的普通场景以外还支持大型复杂的场景,如:宽阔的野外地形和复杂的大楼和迷宫。3D引擎支持大型复杂场景的主要难度在于对场景的组织和裁减。一个大型场景的三角型数

深入思考 2955

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Ogre场景管理器

第五章 Ogre场景管理器 在这里我可以大胆的断言,目前在地球上,所有的图形引擎都在使用场景图(Scene Graph)的概念来组织管理它里面可渲染的物体(我甚至怀疑外星人也在用这个)。 场景图在图形引擎中的地位是毋庸置疑的,它不仅提供了对用户在空间中查找和搜索物体提供了高速的优化,并且针对程序库(对我们而言就是Ogre)的渲染需要,提供了相应的搜索、排序以及剔除功能。在某些时候也被用来进行

debugconsole的专栏 4027

Ogre的分页大地形场景管理器PLSM2使用手记

By MulinB 最近项目需要模拟一个3D场景飞机飞行的简单演示,主要功能就是提供一个比较大的地形高程图和一个飞机飞行路线,能在三维下显示演示飞机飞行。感觉以前自己见过不少类似的游戏,这无非是第一个人称射击类或者模拟飞行类的游戏的简化版,所以从避免重复制造轮子的角度决定查一下开源游戏引擎,看看有没有类似的可以很快开发出第一人称射击类游戏的引擎。经过查看了一些网上的评论和对比文章决定使用三

MulinB的技术博客 6171

转:OGRE场景管理器介绍

一个场景代表在虚拟世界中显示的物品。场景可以包括静态几何体(比如地形或者室内),模型(比如树、椅子等),光和摄像机。场景有下面种类。室内场景:可能由走廊、有家具的屋子和挂着装饰品的墙组成。室外场景:可能由山,树木,微微摇动的草地,飘着云彩的天空组成。Ogre提供了一套不同的场景管理器,每一种特别支持某种场景,本文档将列出Ogre提供的场景管理器和它们的优缺点。 1选择一个...

aolan7349的博客 244

SceneManager 第五章 Ogre场景管理器

<br />第五章 Ogre场景管理器作者:赵光强 发表于 2010-8-2 16:58:49     在这里我可以大胆的断言,目前在地球上,所有的图形引擎都在使用场景图(Scene Graph)的概念来组织管理它里面可渲染的物体(我甚至怀疑外星人也在用这个)。 场景图在图形引擎中的地位是毋庸置疑的,它不仅提供了对用户在空间中查找和搜索物体提供了高速的优化,并且针对程序库(对我们而言就是Ogre)的渲染需要,提供了相应的搜索、排序以及剔除功能。在某些时候也被用来进行碰撞检测。在一些具体的设计里面,场景图甚至

I&U 2382

Ogre基础教程(一)----- 场景管理器,场景节点和实体.

简介 在这篇教程里,我会向您介绍OGRE最基础的构架:场景管理器,场景节点和实体。由于我需要在这篇教程里把OGRE的基本概念介绍给你,所以我们不会接触太多的代码。 在您阅读这篇教程的同时,您应该自己一点一点的添加代码来体会代码的作用,只有这样才可以真正理解这些概念。 从这里开始 在这篇教程里,我们将使用已经写好的代码作为模版。除了我们将要在createScene函数里面添加的代码之外,您

无敌的专栏 1482

OGRE中 场景管理器,场景节点和实体

场景管理器:在屏幕上显示的所有东西都是由场景管理器来管理。当您在 场景中添加物体时,场景管理器会记录这些物体的位置。当您添加摄像机 来观看某个场景时,场景管理器会记录摄像机的位置。当您添加平面、广 告牌、灯光时,场景管理器同样会管理他们。 OGRE里有很多种场景管理 器。有的场景管理器渲染地面,有的场景管理器渲染BSP表等等。 场景节点:场景节点将持续跟踪与它绑在一起的实体的方位。...

weixin_30859423的博客 155

Ogre各种场景管理器以及和插件关系深入分析

OgreOctreeSceneManagerDll.cpp文件 extern "C" void _OgreOctreePluginExport dllStartPlugin( void ) {     // Create new scene manager     octreePlugin = OGRE_NEW OctreePlugin();     // Register     R

Wait的专栏 1713
上一篇: OGRE 查询遮罩
下一篇: 射线使用-碰撞检测
性感花脸
博客等级 码龄20年 26粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值