world wind java_WorldWind Java 版学习:1、启动过程

陈功
2023-12-01

一、JOGL使用介绍

使用 JOGL,需要构造GLCapabilities、GLCanvas 和 GLEventListener 的对象,其中 GLCapabilities 对象用于构造 GLCanvas 对象,将 GLCanvas 添加到相应的 Container 中用于窗口显示,实现 GLEventListener 中的init、display、reshape 等方法用于 GL 的设置和渲染,然后添加到 GLCanvas 上从而被程序调用。例子程序操作步骤如下:

1、新建 Java 工程,新建两个类,一个窗口相关类(JoglApp),一个GL相关类(JoglEventListener)

2、下载 WorldWind Java 版,解压后得到一些 jar 包和 dll 动态库文件,将其中 jogl.jar 和 gluegen-rt.jar 的加入工程 classpath 中,将 dll 文件放入系统 path 中

3、在窗口类中添加 GL 相关的代码:

// 创建 GLCapabilities对象

GLCapabilities glcaps = new GLCapabilities();

// 创建 GLCanvas 用于绘制

GLCanvas glcanvas = new GLCanvas(glcaps);

// 添加 GLEventListener 从而将调用 init、display、reshape 等方法

glcanvas.addGLEventListener(new JoglEventListener());

// 将 GLCanvas 添加到窗口中

getContentPane().add(glcanvas);

4、令 JoglEventListener 类实现接口 GLEventListener,从而实现所需的 init、display、reshape 等方法,在各个方法中添加相应的代码:

public void init(GLAutoDrawable drawable) {

GL gl = drawable.getGL();

gl.glEnable(GL.GL_DEPTH_TEST);

// 状态设置    }

public void display(GLAutoDrawable drawable) {

GL gl = drawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

// 具体绘制    }

public void reshape(GLAutoDrawable drawable, int x, int y, int width,  int height) {

// 设置投影、视口等    }

二、WorldWind启动过程介绍

WorldWind Java版是基于JOGL库进行开发的,所以同样使用了上述结构, GLCanvas 和 GLEventListener对象分别对应WorldWind中的WorldWindowGLCanvas和WorldWindowGLAutoDrawable,而GLCapabilities 对象是在WorldWindowGLCanvas对象中构造的。具体过程如下:

1、类 gov.nasa.worldwindx.applications.worldwindow.WorldWindow

在入口 main 方法中构造了 Controller 对象,进而调用了该对象的 start 方法

2、类 gov.nasa.worldwindx.applications.worldwindow.core.Controller

在 Controller 类中有两个重要的对象,一个是(Registry registry),用于在 WorldWind 启动过程中构造和注册某个具体的对象,另一个是(AppConfiguration appConfig),用于读取配置文件,进而初始化和配置对象

在 start 方法最后,调用了 redraw 方法,该方法调用 getWWd 方法获取一个 WorldWindow 对象,并调用该对象的 redraw 方法

在 getWWd 方法中,首先调用 getWWPanel 方法获的一个 WWPanel 类型的对象,而 WWPanel 对象是由 registry 创建和注册的,最终得到的是实现接口 WWPanel 的 WWPanelImpl 对象,然后调用 WWPanelImpl 类的 getWWd 方法,返回一个 WorldWindow 类型的对象,最终得到的是实现接口 WorldWindow 的 WorldWindowGLCanvas 的对象

3、类 gov.nasa.worldwindx.applications.worldwindow.core.WWPanelImpl

在 WWPanelImpl 类中有两个重要的对象,一个是和窗口相关的(JPanel panel),一个是(WorldWindowGLCanvas wwd)

在 WWPanelImpl 的构造函数中,依次构造了 panel、wwd 以及 m 等对象,最后将 wwd 添加到 panel 上用于显示

4、类 gov.nasa.worldwind.awt.WorldWindowGLCanvas

在 WorldWindowGLCanvas 类中有(WorldWindowGLDrawable wwd)对象

在 WorldWindowGLCanvas 的构造函数中,依次构造了 GLCapabilities 和 WorldWindowGLDrawable 对象,最终得到的是实现接口 WorldWindowGLDrawable 的 WorldWindowGLAutoDrawable 对象,然后调用 WorldWindowGLAutoDrawable 对象的 initDrawable 方法把添加了 GLEventListener,然后还构造了 BasicOrbitView 对象

5、类 gov.nasa.worldwind.WorldWindowImpl

在 WorldWindowImpl 类中有(SceneController sceneController)成员,调用构造函数时进行构造,最终得到的是 StereoOptionSceneController 对象

6、类 gov.nasa.worldwind.WorldWindowGLAutoDrawable

该类继承了 WorldWindowImpl 类,实现了 GLEventListener 接口

在 display(GLAutoDrawable glAutoDrawable) 方法中调用了 doDisplay() 方法,进而调用 AbstractSceneController 类的 repaint() 方法,进而调用 BasicSceneController 类的 doRepaint(DrawContext dc) 方法,在 doRepaint 中创建了地形,处理了拾取,最后调用 AbstractSceneController 类的 draw(DrawContext dc) 方法进行逐层以及表面物体的渲染

 类似资料: