WorldWind 学习笔记 五、添加模型

本文详细介绍了如何在WorldWind中添加三维模型,通过XML配置文件解析模型数据,包括模型的位置、旋转、缩放等参数。文章还讨论了模型加载、初始化、更新和渲染的过程,特别是针对大型场景中坐标精度问题的解决方案。最后提到了模型优化和性能提升的建议,如LOD、纹理压缩和分块模型管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/// <类别> WorldWind 学习笔记
/// <编号> 五、添加模型
///

 
 *  WW1.4对XML配置文件增加了许多新的元素,其中ModelFeature就是用来增加三
 *  维模型的,打开源代码在WorldWind项目里的ConfigurationLoader单元,找到
 *  getRenderableFromLayerFile函数,有这样一段代码:

 


 * 根据这些,我们只要生成一个XML文件放到相应模型(如Earth)的配置文件目录,
 * 就可以显示自己的三维模型啦! 以下是模型的例子
 * http://files.cnblogs.com/reonlyrun/ClarkTest.rar
 * 详细文章网上有许多转载,由于在博客园中的原文失效,此处附我自己的转载:
 * http://hi.baidu.com/%B0%D7%B3%D5%B4%F3%CA%E5/blog/item/312558467df09d076a63e588.html
 *
 * 本文的重点在于详细说明模型类ModelFeature的一些问题
 *
 * 1 加载 addModelFeature
 * 模型的加载主要是通过xml文件配置,通过addModelFeature函数读取xml文件,再通过
 * ModelFeature的构造函数实现模型的加载.即为开篇所说的内容,在此不重复.
 * 2 初始化 Initialize

 * 在初始化函数中重点需要理解的两个函数是IsVisible和LoadDirectXMesh
 * 2.1 IsVisible
 * 在ww中的模型是否可见,是通过视锥裁剪实现的

 * 此处有一个重要的弊端,即只把一个模型看成一个位置点,而非一个立面体来对待
 * 正确的方法,应该求出模型的包围盒,再通过视锥与包围盒的相交进行判断
 * 参考函数
 * camera.ViewFrustum.Intersects(BoundingBox bb)
 * camera.ViewFrustum.Contains(BoundingBox bb)
 *
 * 2.2 LoadDirectXMesh
 * 熟悉directX 3D的人入门需要学的读取.x模型方法最简单的就是Mesh.FromFile

 

 * 在此处载入模型共需要得到三个数据,分别是mesh(三角网),meshTextures(纹理),
 * meshMaterials(材质属性).其中mesh中主要记录了构成模型的点和三角面信息,
 * meshTextures主要通过TextureLoader.FromFile从文件名读取纹理信息,
 * meshMaterials则主要记录了纹理的材质球信息,包括漫反射/镜面反射等各种信息.
 * 对于有特殊需要的人可以重写该函数,以实现对特定文件的读写.甚至要实现.x文件
 * 的动画效果,还需要读取x文件的骨骼和动画信息,都需要重写该文件.
 * 以上获得的三部分数据,将直接用于渲染.
 *
 * 3 更新 Update
 * 此处的更新,只是针对初始化标志进行更新,即如果图形有任何改动(如地形放大倍数
 * 改变/高程有更新需要重新贴地等),进行重新初始化

 

 * 此处若需要加入模型的动画效果,可重写Update函数,即更新时间和帧率进行控制,
 * 同时由骨骼和动画的一些参数进行更新mesh的顶点和三角面
 *
 * 4 渲染
 * 渲染主要分为三部分内容
 * 4.1 渲染效果控制
 * 4.2 设备矩阵变换
 * 4.3 mesh绘制

 *
 * 在此处重点要说明的是2.设备投影变换矩阵,因为这里牵扯到一个在大型游戏世界
 * 坐标中的精度问题.如果不解决,会产生在城市级别的地球漫游中,场景会产生抖动
 * 现象,这是由于在d3d中的渲染采用单精度,对于地球6,000,000多米的场景中,最多
 * 只能精确到0.1米级别的精度.而城市级别的漫游,则会产生明显的抖动现象

 * 有关该问题的详细说明,可参照Andrew Kimse的<游戏编程精粹4>
 * 的中译本第133-143页,我很郁闷的是,在辽东学院学报(自然科学版)2006年9月第
 * 13卷第3期有一篇相似文章<虚拟城市中世界坐标的精度问题及解决方法>王浩涌,
 * 杨艳玲,完全是抄袭!!!不过如果大家很难获得<游戏编程精粹4>的中译本,也可以
 * 通过这个山寨版进行学习.
 *
 * 在此本人提出一种最简单的修改方法,只需要将第二部分修改成以下代码
 *

 * 有关drawArgs.WorldCamera.ReferenceCenter相对中心的观点,与前文提到解决精度
 * 问题采用的基片加偏移的方法有异曲同工之秒,但更有方便之片,有兴趣研究的可深入.
 *
 * 对于模型的渲染,还有很多建议:
 * 1 模型优化,根据LOD分级化简点数和页数
 * 2 纹理压缩,采用多级LOD显示
 * 3 分块模型索引管理,视角裁剪优化
 * 这些都将在后续研究中实现,希望本文对研究WW的人有帮助

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值