Nasa支持的WorldWind项目最近推出了1.4RC5版,可以加入三维模型,效果如下图所示:

WW1.4对XML配置文件增加了许多新的元素,其中ModelFeature就是用来增加三维模型的,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LayerSet Name="Clart Test" ShowOnlyOneLayer="false" ShowAtStartup="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerSet.xsd">
<ModelFeature ShowAtStartup="true">
<Name>Tiny1</Name>
<DistanceAboveSurface>160.0</DistanceAboveSurface>
<Latitude>
<Value>39.93</Value>
</Latitude>
<Longitude>
<Value>116.400002</Value>
</Longitude>
<ScaleFactor>2</ScaleFactor>
<MeshFilePath>Data\Model\tiny.x</MeshFilePath>
<Orientation>
<RotationX>0.0</RotationX>
<RotationY>90.0</RotationY>
<RotationZ>90.0</RotationZ>
</Orientation>
<MaxViewRange>10000.0</MaxViewRange>
<MinViewRange>10</MinViewRange>
</ModelFeature> <ModelFeature ShowAtStartup="true">
<Name>Tiny2</Name>
<DistanceAboveSurface>160.0</DistanceAboveSurface>
<Latitude>
<Value>39.93</Value>
</Latitude>
<Longitude>
<Value>116.410002</Value>
</Longitude>
<ScaleFactor>2</ScaleFactor>
<MeshFilePath>Data\Model\tiny.x</MeshFilePath>
<Orientation>
<RotationX>0.0</RotationX>
<RotationY>-90.0</RotationY>
<RotationZ>90.0</RotationZ>
</Orientation>
<MaxViewRange>10000.0</MaxViewRange>
<MinViewRange>10</MinViewRange>
</ModelFeature>
</LayerSet>

本来在LayerSet.xsd中应该对其进行描术,不过我下载的最新版本中该文件还没有更新,所以在VS2005里对这个XML文件进行编辑时会提示找不到ModelFeature这个元素,不用管它,打开源代码在WorldWind项目里的ConfigurationLoader单元,找到getRenderableFromLayerFile函数,有这样一段代码:

addImageLayersFromXPathNodeIterator(iter.Current.Select("ImageLayer"), parentWorld, parentRenderable);
addQuadTileLayersFromXPathNodeIterator(iter.Current.Select("QuadTileSet"), parentWorld, parentRenderable, cache);
addPathList(iter.Current.Select("PathList"), parentWorld, parentRenderable);
addPolygonFeature(iter.Current.Select("PolygonFeature"), parentWorld, parentRenderable);
addLineFeature(iter.Current.Select("LineFeature"), parentWorld, parentRenderable);
addModelFeature(iter.Current.Select("ModelFeature"), parentWorld, parentRenderable);
addWater(iter.Current.Select("Water"), parentWorld, parentRenderable);
addTiledPlacenameSet(iter.Current.Select("TiledPlacenameSet"), parentWorld, parentRenderable);
addTiledWFSPlacenameSet(iter.Current.Select("TiledWFSPlacenameSet"), parentWorld, parentRenderable);
addIcon(iter.Current.Select("Icon"), parentWorld, parentRenderable, cache);
addScreenOverlays(iter.Current.Select("ScreenOverlay"), parentWorld, parentRenderable, cache);
addChildLayerSet(iter.Current.Select("ChildLayerSet"), parentWorld, parentRenderable, cache); addExtendedInformation(iter.Current.Select("ExtendedInformation"), parentRenderable);

从这可以看出,源程序已经对ModelFeature提供了支持,而在addModelFeature函数中可以找到所有ModelFeature 的子元素,如“Name”、“Latitude”“Longitude”等。

private static void addModelFeature(XPathNodeIterator iter, World parentWorld, RenderableObjectList parentRenderable)
{
if (iter.Count > 0)
{
while (iter.MoveNext())
{
string name = getInnerTextFromFirstChild(iter.Current.Select("Name"));
string refreshurl = getInnerTextFromFirstChild(iter.Current.Select("RefreshURL"));
float lat = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("Latitude")));
float lon = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("Longitude")));
float alt = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("DistanceAboveSurface")));
float scaleFactor = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("ScaleFactor")));
string meshFilePath = getInnerTextFromFirstChild(iter.Current.Select("MeshFilePath")); float rotX = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
.Select("RotationX")));
float rotY = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
.Select("RotationY")));
float rotZ = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
.Select("RotationZ"))); ModelFeature model = new ModelFeature(name, parentWorld
, meshFilePath, lat, lon, alt,scaleFactor,rotX,rotY,rotZ);
model.RefreshURL = refreshurl;
parentRenderable.Add(model);
}
}
}

根据这些,我们只要生成一个XML文件放到相应模型(如Earth)的配置文件目录,就可以显示自己的三维模型啦! 

    我做了一个例子,下载后,解压到WorldWind1.4的安装目录(如:D:\Program Files\NASA\World Wind 1.4 ),重新启动程序在图层管理里可以看到一个新的层,如下图所示:

再用菜单Edit->Place Finder跳转到相应的坐标就可以看到自己的模型了,如下图所示:

例子下载地址:http://www.cnblogs.com/Files/reonlyrun/ClarkTest.rar

原文链接:在WorldWind中加入三维模型

[转]在WorldWind中加入*.x格式的三维模型的更多相关文章

  1. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  2. 在js中实现邮箱格式的验证

    在js中实现邮箱格式的验证 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><htm ...

  3. 在现有的图像处理软件中融合dxf格式输出

    在现有的图像处理软件中融合dxf格式输出 dxf格式是autocade的支持格式.如果将现有图像识别的结果导出到dxf格式,就能够使用autocad的强大功能进行后续处理. dxf的格式比较复杂,开源 ...

  4. 关于mysql(或MariaDB)中的用户账号格式

    之前在修改数据库本地root用户密码时,发现我远程连接的root用户的密码并没有改变,之后查了一下,发现原来这两个root不是同一个用户(汗..) 于是联想到之前配置数据库每次给用户赋予远程连接权限时 ...

  5. 在JSP页面中输出JSON格式数据

    JSON-taglib是一套使在JSP页面中输出JSON格式数据的标签库. JSON-taglib主页: http://json-taglib.sourceforge.net/index.html J ...

  6. PHP中的定界符格式

    <?php //nowdoc(单引号定界符) //ABC可以是任合内容,放在单引号中 $c=<<<'ABC' 这里可以是任合内容 我是历的苛夺基 本原则叶落归根在运 输费艰难田 ...

  7. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  8. SQL导入txt以及SQL中的时间格式操作

    原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表 ...

  9. js中的数字格式变成货币类型的格式

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  10. Ajax中的JSON格式与php传输过程的浅析

    在Ajax中的JSON格式与php传输过程中有哪些要注意的小地方呢? 先来看一下简单通用的JSON与php传输数据的代码 HTML文件: <input type="button&quo ...

随机推荐

  1. MiGPT让你的小爱音响更聪明

    大家好,我是晓凡. 今天要给大家带来一个超级有趣的开源项目MiGPT. 这个项目,简直就是给小爱音箱装上了超级大脑,让你的小爱音箱更聪明. 想象一下,当小爱音箱接入大模型后,上知天文,下知地理,从&q ...

  2. Visual Studio NUGET 清理方法

    NUGET全局包存储位置配置 NuGet缓存实在是太大了,把我唯一的120G固态硬盘(系统盘)基本占用完了--只能是清理一下了,同时修改缓存路径到其他盘以便一劳永逸. 1. 在C:\Program F ...

  3. SpringBoot数据访问,配置数据源

    配置文件目录 配置数据源jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

  4. SpringMvc请求注解@RequestBody请求体/@PathVaribale/@RequestParam【支持Ajax】

    一.@RequestBody请求体 注意请求体只有form表单才有,而对于链接来说不使用 1).在Controller中写 @RequestBody String body是基本用法 另外可以封装对象 ...

  5. 识别指定window窗口的文本

    1. 简单需求 通过图文识别读取一个指定window窗口的文本. 获取窗口句柄,截图保存成bitmap ,调用图文识别库. 测试结果是对中文下的识别不是特别好. 需要注意的是,tessdata要下载指 ...

  6. duxapp放弃了redux,在duxapp中局部、全局状态的实现方案

    全局状态 全局状态是一个很实用的功能,例如管理用户信息,组件间状态共享等功能都需要用到全局状态,react有很多成熟的全局状态管理工具,但是很多写起来太过麻烦,duxapp提供了几种应对不同场景的全局 ...

  7. 2-3 C++复合类型

    目录 2.3.1 引用(References) 2.3.2 指针(Pointers) 关于指针 指针操作 其它事项 空指针的三种表示 void* 指针 易混淆的符号 指针的值(地址)的四种状态 对比与 ...

  8. 解决MobaXterm自动断开连接,亲测有效~

    场景: 使用MobaXterm工具通过SSH连接Linux服务器,如果一段时间没有操作,MobaXterm会把连接自动断开,这个设定很是不方便.通过更改下面的设置可以使SSH保持长连接,不会自动断开.

  9. position 的值, relative 和 absolute 分别是相对于谁进行定位的?

    relative:  相对定位 相对于自己本身在正常文档流中的位置进行定位 相对它原来的位置.原来在标准流中的位置继续占有. absolute: 绝对定位 相对于最近一级定位不为static的父元素进 ...

  10. Quartz集群增强版_01.集群及缺火处理(ClusterMisfireHandler)

    Quartz集群增强版_01.集群及缺火处理(ClusterMisfireHandler) 转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18542452 主要 ...