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://files.cnblogs.com/reonlyrun/ClarkTest.rar
Posted on 2007-02-10 00:16 Clark Zheng 阅读(3321) 评论(11)  编辑 收藏 所属分类: D. OpenSource

Feedback

#1楼    回复  引用  查看    

2007-02-11 15:25 by liujun      
支持的模型是不是只有directX的mesh格式?

#2楼    回复  引用  查看    

2007-02-12 00:52 by edison1024      
对,只能支持X文件。

#3楼    回复  引用    

2007-03-07 16:07 by hui [未注册用户]
世界风?哥哥,你搞的东西还真是深奥诶!

#4楼    回复  引用    

2007-03-22 15:14 by 戴眼镜的太阳 [未注册用户]
呵呵,看后又长了不少见识

#5楼    回复  引用    

2007-04-10 17:47 by 小莫 [未注册用户]
这个挺有意思,作个模拟现场不错。

#6楼    回复  引用    

2007-06-08 22:44 by yuejw [未注册用户]
太好了,终于找到这个东西了

#7楼    回复  引用  查看    

2007-10-10 08:23 by 1-2-3      
佩服。

#8楼    回复  引用  查看    

2008-02-20 10:18 by Chris Liu      
正在学习 World Wind呢,这是很好的学习材料,郑总有没有做过World Wind地下三维,地下漫游的东西

#9楼 [楼主]   回复  引用  查看    

2008-02-25 09:26 by Clark Zheng      
@Chris Liu
据我所知ww是不支持地下浏览的,它的基础是展现在一个球体的表面,也许可以利用它的实现原理自己去实现,不过估计难度会很大

#10楼    回复  引用    

2008-06-02 09:02 by pplive_2007 [未注册用户]
可不可以实现3ds文件模型呢?请教,另外能不能实现绘制三维线

#11楼 [楼主]   回复  引用  查看    

2008-06-02 14:27 by Clark Zheng      
@pplive_2007
我使ww时,还不支持3ds,不知道最新的版本什么样了。
不过绘制三维线很简单

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-09-12 17:55 编辑过


相关链接: