World Wind Java开发之十五——加载三维模型(转)
之前的一篇博客是关于加载粗三维模型的,见http://blog.csdn.net/giser_whu/article/details/43452703,这个地方还存在着不能加载纹理的问题,一直没呢解决。那么WW如何加载常用的三维模型格式(3ds、obj、skp)呢,通过一番搜索,了解到WW可以加载collada的dae格式的三维模型,并且还可以加载kml\kmz文件,那么WW加载三维模型的方法就出来了:首先将其他格式三维模型转换为kmz或kml文件,再加载。这里我是从su的三维模型库中下载的skp文件,在su中可以直接转换为kmz文件,通过测试,这个方法是可行的。先来看下效果图:
1.效果图



2.实现方法
3.源代码
- /*
- Copyright (C) 2001, 2010 United States Government
- as represented by the Administrator of the
- National Aeronautics and Space Administration.
- All Rights Reserved.
- */
- package gov.nasa.worldwindx.examples.kml;
- import gov.nasa.worldwind.WorldWind;
- import gov.nasa.worldwind.avlist.AVKey;
- import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
- import gov.nasa.worldwind.layers.RenderableLayer;
- import gov.nasa.worldwind.ogc.kml.KMLAbstractFeature;
- import gov.nasa.worldwind.ogc.kml.KMLRoot;
- import gov.nasa.worldwind.ogc.kml.impl.KMLController;
- import gov.nasa.worldwind.render.Offset;
- import gov.nasa.worldwind.retrieve.RetrievalService;
- import gov.nasa.worldwind.util.WWIO;
- import gov.nasa.worldwind.util.WWUtil;
- import gov.nasa.worldwind.util.layertree.KMLLayerTreeNode;
- import gov.nasa.worldwind.util.layertree.KMLNetworkLinkTreeNode;
- import gov.nasa.worldwind.util.layertree.LayerTree;
- import gov.nasa.worldwindx.examples.util.BalloonController;
- import gov.nasa.worldwindx.examples.util.HotSpotController;
- import java.beans.PropertyChangeEvent;
- import java.beans.PropertyChangeListener;
- import java.io.File;
- import java.io.IOException;
- import java.net.URL;
- import javax.swing.SwingUtilities;
- import javax.xml.stream.XMLStreamException;
- /**
- * 导入KML或KMZ文件,以图层形式查看,KML或KMZ文件的内容显示为一个要素树。在要素树上点击KML要素可以查看该要素
- * ,在球上点击要素可以弹出要素的描述信息框
- */
- public class SmartScopeKMLViewer
- {
- public static class KMLUtil
- {
- protected LayerTree layerTree; // 图层树
- protected RenderableLayer hiddenLayer; // 渲染图层(图层树)
- protected HotSpotController hotSpotController; // 热点controller
- protected KMLApplicationController kmlAppController; // KMLcontroller
- protected BalloonController balloonController; // BalloonController
- protected WorldWindowGLCanvas wwd; // ww
- public KMLUtil(WorldWindowGLCanvas worldWindowGLCanvas)
- {
- this.wwd = worldWindowGLCanvas;
- // 初始化图层树
- this.layerTree = new LayerTree(new Offset(20d, 160d, AVKey.PIXELS,
- AVKey.INSET_PIXELS));
- // this.layerTree.getModel().refresh(this.wwd.getModel().getLayers());
- // 图层树渲染图层
- this.hiddenLayer = new RenderableLayer();
- this.hiddenLayer.addRenderable(this.layerTree);
- this.wwd.getModel().getLayers().add(this.hiddenLayer);
- // 注册图层选择和气球热点选择事件监听
- this.hotSpotController = new HotSpotController(this.wwd);
- // 注册kml事件监听
- this.kmlAppController = new KMLApplicationController(this.wwd);
- this.balloonController = new BalloonController(this.wwd)
- {
- @Override
- protected void addDocumentLayer(KMLRoot document)
- {
- addKMLLayer(document);
- }
- };
- // 关联kml管理器和balloon管理器
- this.kmlAppController.setBalloonController(balloonController);
- // Set up to receive SSLHandshakeExceptions that occur during
- // resource retrieval.
- WorldWind.getRetrievalService().setSSLExceptionListener(
- new RetrievalService.SSLExceptionListener()
- {
- public void onException(Throwable e, String path)
- {
- System.out.println(path);
- System.out.println(e);
- }
- });
- }
- /**
- *
- * @方法名称: addKMLLayer ;
- * @方法描述: 添加KML图层: ;
- * @参数 :@param kmlRoot
- * @返回类型: void ;
- * @创建人:bluce ;
- * @创建时间:2015年3月17日 下午7:54:40;
- * @throws
- */
- protected void addKMLLayer(KMLRoot kmlRoot)
- {
- // Create a KMLController to adapt the KMLRoot to the World Wind
- KMLController kmlController = new KMLController(kmlRoot);
- // 添加kml图层
- RenderableLayer layer = new RenderableLayer();
- layer.setName((String) kmlRoot.getField(AVKey.DISPLAY_NAME));
- layer.addRenderable(kmlController);
- this.wwd.getModel().getLayers().add(layer);
- // 添加kml图层树节点
- KMLLayerTreeNode layerNode = new KMLLayerTreeNode(layer, kmlRoot);
- this.layerTree.getModel().addLayer(layerNode);
- this.layerTree.makeVisible(layerNode.getPath());
- layerNode.expandOpenContainers(this.layerTree);
- // Listens to refresh property change events from KML network link
- // nodes. Upon receiving such an event this
- // expands any tree paths that represent open KML containers. When a
- // KML network link refreshes, its tree
- // node replaces its children with new nodes created from the
- // refreshed content, then sends a refresh
- // property change event through the layer tree. By expanding open
- // containers after a network link refresh,
- // we ensure that the network link tree view appearance is
- // consistent with the KML specification.
- layerNode.addPropertyChangeListener(
- AVKey.RETRIEVAL_STATE_SUCCESSFUL,
- new PropertyChangeListener()
- {
- public void propertyChange(
- final PropertyChangeEvent event)
- {
- if (event.getSource() instanceof KMLNetworkLinkTreeNode)
- {
- // Manipulate the tree on the EDT.
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- ((KMLNetworkLinkTreeNode) event
- .getSource())
- .expandOpenContainers(layerTree);
- wwd.redraw();
- }
- });
- }
- }
- });
- }
- }
- /**
- *
- * @项目名称:worldwind-1.5.0
- * @类名称:WorkerThread
- * @类描述:加载KML文件线程类
- * @创建人:bluce
- * @创建时间:2015年3月17日 下午7:58:38
- * @修改备注:
- * @版本:
- */
- public static class WorkerThread extends Thread
- {
- /**
- * 待加载kml文件,在构造函数中初始化
- */
- protected Object kmlSource;
- /**
- * kmlapp
- */
- protected KMLUtil KMLUtil;
- public WorkerThread(Object kmlSource, KMLUtil KMLUtil)
- {
- this.kmlSource = kmlSource;
- this.KMLUtil = KMLUtil;
- }
- /**
- * Loads this worker thread's KML source into a new
- * <code>{@link gov.nasa.worldwind.ogc.kml.KMLRoot}</code>, then adds
- * the new <code>KMLRoot</code> to this worker thread's
- * <code>AppFrame</code>. The <code>KMLRoot</code>'s
- * <code>AVKey.DISPLAY_NAME</code> field contains a display name created
- * from either the KML source or the KML root feature name.
- * <p/>
- * If loading the KML source fails, this prints the exception and its
- * stack trace to the standard error stream, but otherwise does nothing.
- */
- public void run()
- {
- try
- {
- KMLRoot kmlRoot = this.parse();
- // 设置文档的显示名称
- kmlRoot.setField(AVKey.DISPLAY_NAME,
- formName(this.kmlSource, kmlRoot));
- // 启动一个任务进程加载解析的kml文件
- final KMLRoot finalKMLRoot = kmlRoot;
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- KMLUtil.addKMLLayer(finalKMLRoot);
- }
- });
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- /**
- *
- * @方法名称: parse ;
- * @方法描述: 解析KML文档 ;
- * @参数 :@return 返回KMLRoot
- * @参数 :@throws IOException:文档不可读
- * @参数 :@throws XMLStreamException :文档解析出现错误
- * @返回类型: KMLRoot ;
- * @创建人:bluce ;
- * @创建时间:2015年3月17日 下午8:02:59;
- * @throws
- */
- protected KMLRoot parse() throws IOException, XMLStreamException
- {
- // KMLRoot.createAndParse will attempt to parse the document using a
- // namespace aware parser, but if that
- // fails due to a parsing error it will try again using a namespace
- // unaware parser. Note that this second
- // step may require the document to be read from the network again
- // if the kmlSource is a stream.
- return KMLRoot.createAndParse(this.kmlSource);
- }
- }
- protected static String formName(Object kmlSource, KMLRoot kmlRoot)
- {
- KMLAbstractFeature rootFeature = kmlRoot.getFeature();
- if (rootFeature != null && !WWUtil.isEmpty(rootFeature.getName()))
- return rootFeature.getName();
- if (kmlSource instanceof File)
- return ((File) kmlSource).getName();
- if (kmlSource instanceof URL)
- return ((URL) kmlSource).getPath();
- if (kmlSource instanceof String
- && WWIO.makeURL((String) kmlSource) != null)
- return WWIO.makeURL((String) kmlSource).getPath();
- return "KML Layer";
- }
- }
World Wind Java开发之十五——加载三维模型(转)的更多相关文章
- World Wind Java开发之十二——加载粗制三维模型(ExtrudedPolygon)(转)
ww可以根据DLG图批量生成假三维模型,这对于小区等特征相似的建筑物模型的构建是非常有用的.下面来看如何一步步实现假三维模型的加载: 1.Shp文件的制作 首先在arcmap下数字化几个建筑物,并新建 ...
- World Wind Java开发之十五——载入三维模型
之前的一篇博客是关于载入粗三维模型的,见http://blog.csdn.net/giser_whu/article/details/43452703,这个地方还存在着不能载入纹理的问题,一直没呢解决 ...
- World Wind Java开发之十四——添加WMS地图服务资源(转)
数据是GIS的核心,没有数据一切无从谈起,Internet上有很多在线WMS地图服务资源,我们可以好好利用这些数据资源,比如天地图.必应地图.NASA.OGC数据服务等等. 在我们国家常用的还是天地图 ...
- Java开发学习(十五)----AOP入门案例及其工作流程解析
一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...
- World Wind Java开发之十——AnalyticSurface栅格渲染(转)
http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- 马凯军201771010116《面向对象与程序设计Java》第十五周学习知识总结
实验十五 GUI编程练习与应用程序部署 一.知识学习部分 清单文件 每个JAR文件中包含一个用于描述归档特征的清单文件(manifest).清单文件被命名为MANIFEST.MF,它位于JAR文件的 ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十五章:当后台线程遇到finally
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- Ansible Playbooks基本使用
你将学到什么 如何使用playbook 如何编写playbook 如何使用roles PlayBook使用 基础环境 ### 64 位 Ubuntu 16.04 LTS,创建CentOS LXC容器w ...
- 最短路——弗洛伊德算法(floyd)
模板: #include <bits/stdc++.h> using namespace std; ][]; int n,m,x,z,y; <<; int main() { c ...
- spring cloud微服务三:Eureka服务治理之注册服务提供者及服务的发现和消费
当服务注册中心成功建立以后,就需要有服务的注册和消费,否则这个服务注册中心就没有了存在的意义,而实际上,一个简单的服务注册也是非常简单的,仅仅需要实现四部曲就好. 首先,还是建立一个基本的spring ...
- django的models字段介绍
#增加数据库数据方法#方法1CalcData.objects.create(var1 ='21',var2='22')#方法2obj =CalcData(var1 ='21',var2='22')jo ...
- 异常HttpMessageNotWritableException解决办法
1. 问题描述 在写SpringBoot项目的时候,由于是前后端分离项目,为了统一接口形式,使用一个类封装了返回数据的形式,但是在测试的时候报异常HttpMessageNotWritableExcep ...
- centos6.5下安装python3.6、pip、ipython
一.先更换系统源 为了下载顺畅一般都会更改为国内源. 1 cd /etc/yum.repos.d/ 2 wget http://mirrors.163.com/.help/CentOS6-Base-1 ...
- haoi2018奇怪的背包题解
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p ...
- echart与Accelerometer综合
首先是x,y,z轴的加速度统计,利用四个数组记录,并长度为偶数时生成图表 var x=[]; var y=[]; var z=[]; var t=[]; document.addEventListen ...
- JS——变量和函数的预解析、匿名函数、函数传参、return
JS解析过程分为两个阶段:编译阶段.执行阶段.在编译阶段会将函数function的声明和定义都提前,而将变量var的声明提前,并将var定义的变量赋值为undefined. 匿名函数: window. ...
- Sort HDU - 5884 哈夫曼权值O(n)
http://acm.hdu.edu.cn/showproblem.php?pid=5884 原来求一次哈夫曼可以有O(n)的做法. 具体是,用两个队列,一个保存原数组,一个保存k个节点合并的数值,然 ...