[转]在WorldWind中加入*.x格式的三维模型
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格式的三维模型的更多相关文章
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- 在js中实现邮箱格式的验证
在js中实现邮箱格式的验证 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><htm ...
- 在现有的图像处理软件中融合dxf格式输出
在现有的图像处理软件中融合dxf格式输出 dxf格式是autocade的支持格式.如果将现有图像识别的结果导出到dxf格式,就能够使用autocad的强大功能进行后续处理. dxf的格式比较复杂,开源 ...
- 关于mysql(或MariaDB)中的用户账号格式
之前在修改数据库本地root用户密码时,发现我远程连接的root用户的密码并没有改变,之后查了一下,发现原来这两个root不是同一个用户(汗..) 于是联想到之前配置数据库每次给用户赋予远程连接权限时 ...
- 在JSP页面中输出JSON格式数据
JSON-taglib是一套使在JSP页面中输出JSON格式数据的标签库. JSON-taglib主页: http://json-taglib.sourceforge.net/index.html J ...
- PHP中的定界符格式
<?php //nowdoc(单引号定界符) //ABC可以是任合内容,放在单引号中 $c=<<<'ABC' 这里可以是任合内容 我是历的苛夺基 本原则叶落归根在运 输费艰难田 ...
- 在PHP代码中处理JSON 格式的字符串的两种方法:
总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...
- SQL导入txt以及SQL中的时间格式操作
原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表 ...
- js中的数字格式变成货币类型的格式
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- Ajax中的JSON格式与php传输过程的浅析
在Ajax中的JSON格式与php传输过程中有哪些要注意的小地方呢? 先来看一下简单通用的JSON与php传输数据的代码 HTML文件: <input type="button&quo ...
随机推荐
- 云原生周刊:Helm Charts 深入探究 | 2024.3.11
开源项目推荐 Glasskube Glasskube 提供了一个用于 Kubernetes 的缺失的包管理器.它具有图形用户界面(GUI)和命令行界面(CLI).Glasskube 包是具备依赖感知. ...
- 立即报名 | 云原生 + AI Meetup 成都站 11.4 正式开启
2023 年,KubeSphere 社区已经在深圳.杭州.上海三个城市各组织了一场线下 Meetup.第四站,我们将走进天府成都. 11 月 4 日,云原生 + AI Meetup 成都站将正式开启! ...
- 格点拉格朗日插值与PME算法
技术背景 在前面的一篇博客中,我们介绍了拉格朗日插值法的基本由来和表示形式.这里我们要介绍一种拉格朗日插值法的应用场景:格点拉格朗日插值法.这种场景的优势在于,如果我们要对整个实数空间进行求和或者积分 ...
- C#_自定义简单ORM
一,基本思路:利用C#的标签和反射功能实现自定义轻量级ORM 标签Attribute附着在实体属性或实体类名上,这样可以取到实体对应的表名,属性对应的表字段名,数据类型,是否主键,字段注释等基本信息 ...
- 根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill = FieldFill.INSERT)
根据字符串,获取实体属性上的annotation,如:createTime" 找到对应实体属性中的 TableField(value = "create_time", f ...
- 每日学学Java开发规范,常量定义(附阿里巴巴Java开发手册(终极版))
前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...
- 强化学习环境gym/gymnasium下的atari环境的v0、v4、v5的说明
声明: 本文是最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明的部分更新和汇总,可以看作是更新和延续版本. 由于gym已经由openai公司独立出来,虽然开发团队和投 ...
- 简单但实用,RTC时钟使用指南
合宙Air201快速入门-RTC实时时钟使用示例- 本教程教你通过使用脚本代码,实现Air201内置RTC实时时钟同步时间.获取时间.设置时间等功能,可根据实际需求灵活应用. 我们先了解一些相关基础知 ...
- python 3.7环境安装并使用csv
因为调换需要,进了另外一个维护组,需要用python解析excel csv,所以就下载了一下他们需要的python3.7 如何做呢,看步骤 1.去官网 2.找版本 3.下源码 4.解压出来进入文件夹 ...
- golang之媒体处理
[视频] 获取视频封面图: 1) 如果是使用oss的话, 可以添加指定的后缀生成指定图片 视频截帧: https://help.aliyun.com/zh/oss/user-guide/video-s ...