[转]在WorldWind中加入*.x格式的三维模型
2021-01-20 13:12
标签:archive hive val tst img tiles false path 更新 Nasa支持的WorldWind项目最近推出了1.4RC5版,可以加入三维模型,效果如下图所示: 本来在LayerSet.xsd中应该对其进行描术,不过我下载的最新版本中该文件还没有更新,所以在VS2005里对这个XML文件进行编辑时会提示找不到ModelFeature这个元素,不用管它,打开源代码在WorldWind项目里的ConfigurationLoader单元,找到getRenderableFromLayerFile函数,有这样一段代码: 从这可以看出,源程序已经对ModelFeature提供了支持,而在addModelFeature函数中可以找到所有ModelFeature 的子元素,如“Name”、“Latitude”“Longitude”等。 根据这些,我们只要生成一个XML文件放到相应模型(如Earth)的配置文件目录,就可以显示自己的三维模型啦!
原文链接:在WorldWind中加入三维模型 [转]在WorldWind中加入*.x格式的三维模型 标签:archive hive val tst img tiles false path 更新 原文地址:https://www.cnblogs.com/rainbow70626/p/12128410.html
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>Tiny1Name>
DistanceAboveSurface>160.0DistanceAboveSurface>
Latitude>
Value>39.93Value>
Latitude>
Longitude>
Value>116.400002Value>
Longitude>
ScaleFactor>2ScaleFactor>
MeshFilePath>Data\Model\tiny.xMeshFilePath>
Orientation>
RotationX>0.0RotationX>
RotationY>90.0RotationY>
RotationZ>90.0RotationZ>
Orientation>
MaxViewRange>10000.0MaxViewRange>
MinViewRange>10MinViewRange>
ModelFeature>
ModelFeature ShowAtStartup="true">
Name>Tiny2Name>
DistanceAboveSurface>160.0DistanceAboveSurface>
Latitude>
Value>39.93Value>
Latitude>
Longitude>
Value>116.410002Value>
Longitude>
ScaleFactor>2ScaleFactor>
MeshFilePath>Data\Model\tiny.xMeshFilePath>
Orientation>
RotationX>0.0RotationX>
RotationY>-90.0RotationY>
RotationZ>90.0RotationZ>
Orientation>
MaxViewRange>10000.0MaxViewRange>
MinViewRange>10MinViewRange>
ModelFeature>
LayerSet>
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);
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);
}
}
}
我做了一个例子,下载后,解压到WorldWind1.4的安装目录(如:D:\Program Files\NASA\World Wind 1.4 ),重新启动程序在图层管理里可以看到一个新的层,如下图所示:
再用菜单Edit->Place Finder跳转到相应的坐标就可以看到自己的模型了,如下图所示:
例子下载地址:http://www.cnblogs.com/Files/reonlyrun/ClarkTest.rar
上一篇:C#实现文件和目录的复制替换
文章标题:[转]在WorldWind中加入*.x格式的三维模型
文章链接:http://soscw.com/index.php/essay/44545.html