/// <类别> 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的人有帮助