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

OGRE根据高度图创建Terrain地形流程分析 OGRE可以通过两个接口来生成地形,分别是void TerrainSceneManager::setWorldGeometry( const String& filename )以及void TerrainSceneManager::setWorldGeometry(DataStreamPtr& stream, const String& typeName ),两者的根本区别就是一个是传递地形信息 阅读详情

By MulinB

 

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

 

OGRE的演示Demo里有个Terrain的演示,直接是一个由地形高程图生成三维地形场景的例子,其使用的是OGRE内置的TerrainSceneManager(下面简称TSM)场景管理器,《Pro OGRE 3D Programming》里面对这个场景管理器的使用介绍的相当详细,无非就是如何配置一个terrain.cfg的配置文件进行映射。更详细的介绍可以从官方wiki得到:http://www.ogre3d.org/wiki/index.php/Terrain_Scene_Manager 。用这个场景管理器载入比较小的地形高程图时效果还比较理想,不过载入比较大一点的地形高程图时,速度就明显慢了下来,打开程序时的等待时间变得很长,帧频也变得比较低。

 

到网上查了一下关于支持大地形的场景管理器的资料,发现OGRE的一个AddOn插件PLSM2(Paging Landscape SceneManager)可以将大的地形高程图分成小的page载入,无奈关于这个场景管理器的用法网上资料并不多,使用起来有些困难。经过一番痛苦的折磨调试,终于还算成功的在OGRE1.6版本下把PLSM2使用了起来,效果还不错,载入速度明显快了很多,只是仍然有些问题,就是在地形漫游时,地形会自己变形,郁闷……这个暂留作TODO吧,估计是有些设置没设置好,或者是这个场景管理器依然不完善。下面把使用PLSM2的过程记录一下备忘。

 

环境:Windows XP,  MS Visual Studio 2005 + SP1。

 

 

//--------------------------------------------------------------------------

 

关于PLSM2的使用的官方wiki:http://www.ogre3d.org/wiki/index.php/Paging_Scene_Manager 。

其中有关于PLSM2的安装、使用、配置文件如何配置的详细说明。但是按照这些官方wiki一步一步进行并不能让Demo程序顺利跑起来,你需要根据报错的提示信息将可执行文件相对于media文件夹的路径。而且这其中比较让人疑惑的是,会有两套media文件夹,一套是mapsplitter用,另一套才是使用PLSM2的Demo程序使用。需要注意的是,配置文件的填写很重要,也很耗时。需要mapsplitter的配置文件(用于将大地形高程图分割成小块),还需要配置运行时将小块地形图映射成三维场景下的世界坐标系的参数。主要的配置文件可以参考wiki:http://www.ogre3d.org/wiki/index.php/Paging_Scene_Manager_config_files 。

 

关于配置文件,需要说明的是,用于纹理自动生成的效果不是太好,如果没有合适的纹理,不妨使用Matlab+photoshop将地形高程图生成伪彩图作为地形纹理,使用TextureFormat=ImagePaging将纹理也分割成小块,从实验效果来看,如果伪彩图生成的合适,那么三维场景效果还比较漂亮。还有一点是配置Terrain map specification里的Map definition参数时,width和height的值是之前分割好的小块地形图在两个方向的个数,比如如果大地形图是16385×16385的话(注意地形图的大小按PLSM2的要求应该是(2^n)+1),小块的大小是PageSize=513的话(这里的pagesize也应该是(2^n)+1),那么width和height的大小应该是(16385-1) / (513-1) = 32。还有参数ScaleX, ScaleZ是将一个小块(pagesize大小的地形图)映射到三维场景后的长和宽,而不是将整个大图映射到三维场景的长和宽,经测试,这个ScaleX=PageSize×400的时候,三维地形效果比较理想,地形比较平滑,而且地形起伏明显。ScaleY是映射到三维场景下的高度范围(0~ScaleY)。其他的很多参数可以参照wiki说明去设置。

 

 

当你把Demo程序跑起来之后,你会发现使用PLSM2场景管理器载入大地形时的时间明显比TSM缩短,不过你会发现有个眼中的问题是当你在三维场景里漫游时,地形像是有生命一样,会动,当拉近镜头时,很多山会长高,当拉远镜头时,很多山会缩回去,⊙﹏⊙b汗……这个问题我调了很多设置参数也没搞定,哪位大侠搞定希望指点迷津,不过可以肯定的是,显卡比较好的时候这个效果不是太严重。

 

 

好吧,现在需要从Demo程序跳出来,把PLSM2用到自己的工程项目中了,你会发现之前从官方wiki介绍的地址 http://tuan.kuranes.free.fr/Ogre.html 下载的编译好的Demo程序、MapSplitter程序、PLSM2 DLL和Lib文件,是用OGRE1.2编译的,而如果你用的是最新版的OGRE SDK的话,或许是像我一样使用了OGRE1.6.1,那么你最好像我一样直接从SVN下载最新代码(最好是跟你使用的SDK版本相同的代码),自己编译出一套MapSplitter程序和PLSM2 DLL和Lib文件。

 

 

然后就是使用PLSM2的三维场景下的世界坐标系的问题了。在PLSM2的世界坐标系里,原点(x,z)=(0,0)点(注意在OGRE的三维世界坐标系里,x,z是长宽两个方向,y是高度方向)是在场景的中间,对应着地形高程图的中心位置,而不是地形高程图的左上角。例如:

大地形高程图大小:  16385×16385

块大小(PageSize):  513

Width, Height:  32

ScaleX, ScaleZ:  204800  (204800=(513-1)×400)

那么,PLSM2三维世界坐标系的大小是(SizeX, SizeZ) = 32×512×400 = (6553600, 6553600)

那么,PLSM2三维世界坐标系的左上角的坐标是(MinX, MinZ) = -6553600/2 = (-3276800, -3276800)

 

好在这些信息其实不用自己计算,PLSM2的场景管理器有相应的接口可以得到这些参数,而在代码里需要做的是,将一个SceneManager的指针mSceneMgr转换为PagingLandScapeSceneManager指针,然后用PagingLandScapeSceneManager提供的接口获得这些参数。在写代码之前,需要将PLSM2的头文件拷贝到当前工程中,因为PLSM2里头文件相互引用,想挑出这些头文件还要一番功夫,我拷贝的头文件清单如下:

OgrePagingLandScapeData2DManager.h

OgrePagingLandScapeOcclusion.h

OgrePagingLandScapeOcclusionElement.h

OgrePagingLandScapeOcclusionQuerySet.h

OgrePagingLandScapeOcclusionTraversal.h

OgrePagingLandScapeOctree.h

OgrePagingLandScapeOctreeCamera.h

OgrePagingLandScapeOctreeNode.h

OgrePagingLandScapeOctreeSceneManager.h

OgrePagingLandScapeOptions.h

OgrePagingLandScapePoolSet.h

OgrePagingLandScapePrerequisites.h

OgrePagingLandScapeSceneManager.h

 

之后,就可以使用PagingLandScapeSceneManager接口获得PLSM2特有的参数了,代码片段如下:

 

view plaincopy to clipboardprint?
PagingLandScapeSceneManager*  G_pPLSceneMgr = NULL;  
Real worldSizeX, worldSizeZ;  
G_pPLSceneMgr = static_cast<PagingLandScapeSceneManager*>(mSceneMgr);  
G_pPLSceneMgr->getWorldSize(&worldSizeX, & worldSizeZ);  
PagingLandScapeOptions* pPLSM2Options = G_pPLSceneMgr->getOptions();  
Real xScaleFactor = pPLSM2Options->scale.x;   
    //x方向放大因子, ScaleX/(PageSize-1) , 这里是400  
Real zScaleFactor = pPLSM2Options->scale.z;   
    //z方向放大因子, ScaleZ/(PageSize-1) , 这里是400  
Real maxY = pPLSM2Options->scale.y; //高度最大值, 这里是ScaleY 
PagingLandScapeSceneManager*  G_pPLSceneMgr = NULL;
Real worldSizeX, worldSizeZ;
G_pPLSceneMgr = static_cast<PagingLandScapeSceneManager*>(mSceneMgr);
G_pPLSceneMgr->getWorldSize(&worldSizeX, & worldSizeZ);
PagingLandScapeOptions* pPLSM2Options = G_pPLSceneMgr->getOptions();
Real xScaleFactor = pPLSM2Options->scale.x;
    //x方向放大因子, ScaleX/(PageSize-1) , 这里是400
Real zScaleFactor = pPLSM2Options->scale.z;
    //z方向放大因子, ScaleZ/(PageSize-1) , 这里是400
Real maxY = pPLSM2Options->scale.y; //高度最大值, 这里是ScaleY

 

 

上面的代码中的变量pPLSM2Options,在调试模式观察之,其实可以观察到很多PLSM2的参数,是使用PLSM2的很好的一个帮手。

 

其他的按照官方wiki做应该没有什么问题。

 

 

//--------------------------------------------------------------------------


附本人做的小程序的截图一张(纹理贴图使用Matlab+Photoshop生成):


 

 

 

附Matlab生成伪彩图代码(之后可以采用photoshop进行拼接、调色):

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all;close;

 

%读取未经过处理的地形高程图,高度值范围(0~5000),png为16位灰度(0~65535)

dxgc_data=imread('dxgct.png');

 

%定义用于贴图的伪彩显示的colormap,是本人经过手工调色事先用matlab调好的颜色表

dxcolor=[0 0 0.5625;0.1 0.2 0.7813;0.2 0.4 1;0.3333 0.5333 1;0.4667 0.6667 1;0.6 0.8 1;0.5 0.8 0.75;0.4 0.8 0.5;0.3 0.8 0.25;0.2 0.8 0;0.24 0.78 0;0.28 0.76 0;0.32 0.74 0;0.36 0.72 0;0.4 0.7 0;0.44 0.68 0;0.48 0.66 0;0.52 0.64 0;0.56 0.62 0;0.6 0.6 0;0.5926 0.5852 0;0.5852 0.5704 0;0.5778 0.5556 0;0.5704 0.5407 0;0.563 0.5259 0;0.5556 0.5111 0;0.5481 0.4963 0;0.5407 0.4815 0;0.5333 0.4667 0;0.5259 0.4519 0;0.5185 0.437 0;0.5111 0.4222 0;0.5037 0.4074 0;0.4963 0.3926 0;0.4889 0.3778 0;0.4815 0.363 0;0.4741 0.3481 0;0.4667 0.3333 0;0.4593 0.3185 0;0.4519 0.3037 0;0.4444 0.2889 0;0.437 0.2741 0;0.4296 0.2593 0;0.4222 0.2444 0;0.4148 0.2296 0;0.4074 0.2148 0;0.4 0.2 0;0.4 0.1882 0.01176;0.4 0.1765 0.02353;0.4 0.1647 0.03529;0.4 0.1529 0.04706;0.4 0.1412 0.05882;0.4 0.1294 0.07059;0.4 0.1176 0.08235;0.4 0.1059 0.09412;0.4 0.09412 0.1059;0.4 0.08235 0.1176;0.4 0.07059 0.1294;0.4 0.05882 0.1412;0.4 0.04706 0.1529;0.4 0.03529 0.1647;0.4 0.02353 0.1765;0.4 0.01176 0.1882;0.4 0 0.2];

 

%高程图转化为索引图

dxgct_ind=gray2ind(dxgc_data, 1000); %经实践,1000对应着60个索引灰度级

 

%索引图转化为伪彩图,本来这一行就可以生成,但是地形图太大时matlab会内存不足,所以改为分块

%dxgct_rgb=ind2rgb(dxgct_ind, colormap(dxcolor)); %使用之前调整好的colormap

 

%分块输出

dxgct_rgb0=ind2rgb(dxgct_ind(1:1500,1:1500), colormap(dxcolor));

dxgct_rgb1=ind2rgb(dxgct_ind(1:1500,1501:3000), colormap(dxcolor));

dxgct_rgb2=ind2rgb(dxgct_ind(1501:3000,1:1500), colormap(dxcolor));

dxgct_rgb3=ind2rgb(dxgct_ind(1501:3000,1501:3000), colormap(dxcolor));

 

%输出为png,matlab内存不足,改为分块

%imwrite(dxgct_rgb, 'dxgct_texture.png', 'PNG');

 

%分块输出

imwrite(dxgct_rgb0, 'dxgct_texture0.png', 'PNG');

imwrite(dxgct_rgb1, 'dxgct_texture1.png', 'PNG');

imwrite(dxgct_rgb2, 'dxgct_texture2.png', 'PNG');

imwrite(dxgct_rgb3, 'dxgct_texture3.png', 'PNG');

 

 

<完>

 

ogre3d 插件 plsm2 VS2010 编译无错版 SVN 下到的PLSM2源代码用VS2010编译有一堆错误,这个是排除所有错误后编译无错的版本 立即下载

相关推荐

3D MESH格式 OGRE大场景模型

3D MESH格式 大场景模型 可用于OGRE场景调试

Ogre创建地形过程和分析

Ogre 1.7中的地形教程  转自:http://blog.youkuaiyun.com/dragon2/article/details/5862925 地形创建的工作步骤: 1.创建地形全局配置 2.创建地形分组 3.创建默认的地形分块属性 4.创建地形分块 第一步 首先,在Ogre1.7中,地形是由一块一块的地形组成的,他们每快地形都有共同的属性,所以在创建地形之前我们必须指定地

Wait的专栏 2554

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3757

PLSM2

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

d04421024的专栏 854

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World

QML第一讲:创建QML工程、详解QML第一个程序Hello World

郭老二 7796

基于OGRE的大规模森林场景可视化研究

基于OGRE的大规模森林场景可视化研究 张  敏 (核工业计算机应用研究所,北京100048) 摘要:利用动态impostor技术的树木绘制方法,不仅可以快速地绘制树木,而且具有较高的真实感效果,而分页技术提供高度优化的方法来渲染大量的覆盖在无限区域上的树木模型,PLSM技术为大区域地形提供了可行的调度策略。利用以上方法,在OGRE图形引擎的基础上开发了大规模森林可视化系统,实现了虚拟森林三

痞子龙3D编程 3760

PCL基础:getTransformation函数全流程解析与应用实例,一篇文章精通点云变换

在 Eigen 和 PCL 中,getTransformation是一个常用的函数,用于根据输入的平移和旋转信息(如欧拉角或四元数)生成一个仿射变换矩阵(Eigen::Affine3f或 Eigen::Affine3d)。1)在 Eigen 中,可以通过四元数和平移向量构造一个变换矩阵。2)讲解了从四元数转换到欧拉角,或者从欧拉角转换到四元数的方法。

weixin_42896234的博客 1368

大型场景裁剪渲染

原文:http://nvidia.e-works.net.cn/document/200908/article8917.htm   3D游戏特别是网络在线游戏中,室外大场景渲染是一块非常重要的内容,它也是3D图形引擎的核心。它是图形学和图像处理理论最直接的应用,其涉及的技术还可以应用于其它领域,比如虚拟现实、3D GIS、数据可视化等,其重要性不容置疑。随着硬件的不断发展,行业对渲染场

jaccen的专栏 1万+

【ESP 保姆级教程】玩转emqx数据集成篇④ ——数据桥接之HTTP服务

主要是学习数据桥接功能以及构建自己的http服务器,这是一个非常有用的功能。包括各种传感器上报基本上都需要数据桥接功能支持,所以还是希望认真学习这一块开发,然后结合数据库存储等等知识点进行进一步学习。

单片机菜鸟哥的博客 1307

AI爬虫:一文讲通AI爬虫技术和原理,及34个AI爬虫工具推荐

AI 爬虫 是一种结合了传统网络爬虫技术和人工智能(AI)技术的工具,能够更智能、高效地从网页中提取和处理数据。与传统爬虫相比,AI 爬虫能够更好地处理动态内容、复杂网页结构以及非结构化数据,同时具备数据清洗、分类、情感分析等高级功能。

数据知道的博客 1万+

PLSM2:Paging Scene Manager

目录1PLSM22Plugin2.1介绍2.2特性2.3数据资源加载模式2.4纹理模式2.4.1PLSM2 提供的纹理模式2.4.2 用户自定义纹理模式2.5速度优化<br />2.6连续一致裁减Coherent Occlusion Culling (CHC)2.7Run Time Option and Scene Manager Features Uses3示例应用程序3.1使用说明4Mapsplitter应用程序4.1高度图4.2配置文件5安装PLSM26与物理引擎集成7与PagedGeometry集成

痞子龙3D编程 3523

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

PLSM 配置文件

目录1 介绍 2 地图选择配置 2.1 maptools.cfg 2.2 paginglandscape2.cfg 3 地图定义细节 3.1 公用配置选项(maptools.cfg和paginglandscape2.cfg) 3.1.1 地图定义 3.2 地图分割专用配置 3.2.1 高度图定义 3.2.2 数据源

Redefine的专栏 1647

第21章—技术管理篇(上):身为技术人该怎样带好团队并做好管理者

上节讲了职业规划和学习提升这两个话题,随着职业规划的不断落地,或者自己能力的不断提升,大家也会逐渐被提拔成“职级更高”的人。企业规模扩张时,员工数量也会变多,意味着Boss需要更多的人来辅助管理,而管理者会从外部招聘吗?也许会,但大多企业更喜欢从内部选拔,毕竟人的天性更希望找的人值得信赖。此时,一些能力不错、做事靠谱的老员工,就会被“赶上”管理者的位子。作管理不难,但想要“”就需要一定情商。

运维老生常谈 1366

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OGRE分析之场景管理

Mythma http://www.cppblog.com/mythma Email: mythma@163.com 一、场景的组成 antsam在《Ogre场景组织分析》中比喻场景的组织:“场景组织就像一个舞台,需要摄影机、灯光、服饰、道具和演员”,在这里我也借用一下。场景大概有如下几部分组成: cameras ——〉摄影机 lights ——〉灯光 materials ——〉服装

flyingleo1981的专栏 1369

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ogre中将PLSM2和Hydrax结合遇到的问题

搞了近两天,总算把PLSM2和Hydrax 成功结合了,虽然效果一般,但总比用静态的海洋贴图好哈哈哈哈。。。     说一下遇到的问题,本来已经将PLSM2和Qt结合起来了,看到Hydrax的海洋效果不错,就打算再加上Hydrax。所以下载了Hydrax0.5.1的源码和dem

872

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

plsm2使用手记(3)-plsm2基本使用方法

来源:http://sxoo0305.blog.163.com/blog/static/10132887200911555816746/ Plsm2使用方法  注意:在看本文前,请先确认你已经看过前边的plsm2环境搭建,并且搭建成功。  下面以要加载一副名为gcany

909

OGRE新插件PagedGeometry(海量场景分页调度)

1,介绍: PagedGeometry是OGRE引擎的一个插件,它对(无穷)大区域的海量网格的渲染提供优化策略。它非常适合于稠密的森林和室外场景,那里有海量的树,草,岩石,灌木丛等场景对象。2, PagedGeometry管理PagedGeometry class 该类负责加载那些需要立即(或很快)可见的场景几何,而不加载其他的场景以节约内存空间。PagedGeometry引擎可以

痞子龙3D编程 2168

plsm2使用手记

<br />一.准备<br />1.      OGRE3D-1.6.4源码以depence.<br />2.      Microsoft DirectX SDK (March 2009).<br />3.      PLSM2源码(http://tuan.kuranes.free.fr/Ogre.html).<br />4.      VS2008(sp1).<br />5.      PLSM2在OGRE3D上的官方论坛<br />http://www.ogre3d.org/wiki/index.ph

痞子龙3D编程 2382

[Ogre][地形][原创]基于OgreTerrain的地形实现

 需要用到的外部图片资源:   在ogre调用时需要多用到的几个外部dll: OgreTerrain_d.dll   需要添加头文件 #include "Ogre\Ogre.h"#include "Ogre\OgreFileSystemLayer.h"#include "Ogre\OgreTerrain.h"#include "Ogre\OgreTerrainGroup.h"#in...

weixin_34054866的博客 242

Ogre 天龙八部地形 Heightmap(高度图)+GridInfo(地表信息)初步结果

刚研究出的天龙八部的地形高度和GridInfo,正确的载入了高度图和地表信息,可以看出场景的大致样子了:)第一张图是我自己载入的 明教的光明殿地形,第二张是天龙八部游戏中的场景,可以看出差距啊:)经过分析天龙八部场景的实现方式,我用了跟天龙八部实现方式完全相同的做法,载入了HeightMap和GridInfo文件,并且可以解析多个版本的GridInfo结构。以下是使用Ogre渲染出来的天龙

痞子龙3D编程 8500

MATLAB 不等间隔一阶低通:按真实时间更新,并把长缺口重置说清楚

不等间隔数据若直接套固定平滑系数,会改变实际时间常数。本文从左端零阶保持模型推导一阶低通更新,分别计算衰减与输入系数,显式标记长缺口重置,并给出解析解对照、时序负例、边界测试和完整 MATLAB 代码。

hxy_programmer的博客 330
上一篇: OGRE 使用技巧总结
下一篇: Ogre3D 1.7版本 SampleBrowser 分析
Redefine
博客等级 码龄19年 4粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值