Statistics
| Revision:

gvsig-3d / 2.1 / trunk / doc / Fase 1 / dt-visor-3d.rst @ 424

History | View | Annotate | Download (12.7 KB)

1 398 llmarques
=================================================================
2
 Visor 3D básico que integra Nasa WW SDK
3
=================================================================
4
5
-------------------
6
 Diseño técnico
7
-------------------
8
9
:Company:   gvSIG Association
10
:Author:    DiSiD Corporation, S.L.
11
:Revision:  $Rev: $
12
:Date:      $Date: $
13
:Copyright: All rigths reserved
14
15
.. contents::
16
   :depth: 2
17
   :backlinks: none
18
19
.. sectnum::
20
   :depth: 2
21
   :start: 1
22
23
.. |year| date:: %Y
24
25
.. header::
26
27
   .. class:: headertable
28
29
   +-----------------------+-------------------------+
30
   |.. class:: left        |.. class:: right         |
31
   |                       |                         |
32
   | Diseño técnico        |###Page###               |
33
   +-----------------------+-------------------------+
34
35
36
.. footer::
37
38
    .. include:: <isonum.txt>
39
40
    .. class:: left
41
42
    *Visor 3D básico que integra Nasa WW SDK - Diseño técnico*
43
44
    |copy| |year| **
45
46
47
Introducción
48
=============
49
50
Este documento detalla el diseño técnico del nuevo visor 3D basado en la librería NASA WW SDK para gvSIG 2.1+. Para más información consulte:
51
52
 * http://worldwind.arc.nasa.gov/java/
53
 * http://goworldwind.org/
54
55
El diseño técnico tendrá en cuenta el análisis de requisitos y el análisis funcional realizados. En primer lugar se detallarán el API y las implementaciones de los diferentes módulos del proyecto.
56
57
Diseño técnico
58
=====================
59
60
Para tener un poco del contexto del diseño técnico, se expone como debería de funcionar de forma resumida el visor 3D. Seguidamente se detallará el API e implementación de la librería y las extensiones del plugin.
61
62
Ejemplo de casos de uso
63
-------------------------------
64
65 404 llmarques
A partir de una vista 2D, se desea representar la información cargada en la vista de forma tridimensional. Para ello, el usuario dispondrá de dos entradas de menú / botones para crear los dos tipos de visores: esférico y plano (View3DExtension, una única extensión para dos acciones). Al pulsar sobre uno de los botones, el plugin accederá a la información de la vista activa mediante la obtención del MapContext y la servirá a la librería NASA WW SDK mediante View3DPanel#add(FLayer layer). El panel obtendrá la capa equivalente mediante el View3DManager#getWWLayer(FLayer, loadMode) y la añadirá a un objeto gov.nasa.worldwind.Model. Cuando todas las capas hayan sido añadidas, se creará el visor mediante View3DSwingManager#createView3DPanel(MapContext, mode).
66 398 llmarques
67
Además de las dos extensiones para la creación de visores, el usuario también dispondrá de una extensión llamada RefreshView3DExtension para la actualización de los datos del visor activo con los posibles cambios efectuados sobre la vista 2D. La extensión ejecutará el método View3DPanel#reloadLayers().
68
69 404 llmarques
Y finalmente, existirá una última extensión llamada SynchronizeView3DExtension que permitirá al usuario sincronizar los enfoques de la vista 2D y el visor 3D asociado a la vista. Se accederá al ViewPort del MapContext asociado para sincronizarlo con el enfoque del visor 3D.
70 398 llmarques
71
LIB API
72
--------
73
74
.. note::
75
   Los métodos deben lanzar excepciones hacia el nivel más alto de la librería. Como no esta definido el API de excepciones no indico que tipo de excepciones pueden lanzar los métodos.
76
77
Este es el API de la librería del visor 3D, la cual esta basada en el modelo de implementación simple API/IMPL.
78
79
* Project: org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.api
80
* Package: or.gvsig.view3d.lib.api
81
82
View3DManager
83
*********************************************
84
85
Proveerá las siguientes operaciones:
86
87
* getWWLayer(FLayer layer, int loadMode) : gov.nasa.worldwind.layers.Layer
88
89
A partir de una capa de gvSIG y un modo de carga se obtiene una capa nativa de la librería World Wind. Existen 4 modos de carga: raster imagen, raster elevación, vectorial rasterizada y vectorial 3d. Dependiendo del modo de carga se obtendrá una capa nativa u otra.
90
91
92
DataReader
93
*********************************************
94
95
Proveerá las siguientes operaciones:
96
97
* canRead(Object sourceFile) : boolean
98
99
Determina si la fuente de datos se puede acceder o no. Puede recibir como parámetro un objeto del tipo File, java.net.URL, String o java.io.InputStream.
100
101
* read(Object sourceFile) : gov.nasa.worldwind.layers.Layer
102
103
A partir de una fuente de datos crea una capa gov.nasa.worldwind.layers.Layer.
104
105
106
SWING API
107
----------
108
109
Este es el API de la interfaz de usuario de la librería del visor 3D, la cual esta basada en el modelo de implementación simple API/IMPL.
110
111
* Project: org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.api
112
* Package: or.gvsig.view3d.swing.api
113
114
View3DSwingManager
115
********************
116
117 404 llmarques
* createView3DPanel(int mode) : View3DPanel
118 398 llmarques
119 404 llmarques
Crea un panel con el componente para dibujar la información en 3D y lo configura dependiendo del modo indicado. Existen dos modos posibles View3DMode.SPHERE y View3DMode.FLAT.
120 398 llmarques
121 404 llmarques
* createView3DPanel(MapContext theMapContext, int mode) : View3DPanel
122 398 llmarques
123 404 llmarques
Crea un panel con el componente para dibujar la información en 3D a partir de un MapContext y lo configura dependiendo del modo indicado. Existen dos modos posibles View3DMode.SPHERE y View3DMode.FLAT.
124 398 llmarques
125 404 llmarques
126 398 llmarques
View3DPanel extends JPanel
127
****************************
128
129
Clase abstracta que extiende de JPanel. Como JPanel no tiene una interfaz definida, crearemos una clase abstracta que implementará la vista del visor (tamaño, inicialización de componentes...) y definirá el API de nuestro componente. Se añadirá los siguientes métodos definidos pero sin implementarlos.
130
131 399 llmarques
* add(FLayer layer) : void
132 398 llmarques
133 399 llmarques
A partir de la capa que recibe como parámetro, obtiene la capa equivalente en la librería World Wind y la añade..
134 398 llmarques
135 399 llmarques
* add(FLayers layers) : void
136 398 llmarques
137 399 llmarques
A partir de la colección de capas, obtiene las capas equivalentes en la librería World Wind y las añade respetando el orden.
138 398 llmarques
139 404 llmarques
* getMapContext() : MapContext
140 399 llmarques
141 404 llmarques
Obtiene el MapContext asociado al panel. Del MapContext asociado se extrae la información necesaria para la representación de los datos en 3D y la sincronización de enfoques.
142 399 llmarques
143 398 llmarques
* getVerticalExaggeration() : double
144
145
Obtiene la exageración vertical del visor.
146
147
* reloadLayers() : void
148
149 404 llmarques
Elimina las capas cargadas. Accede al MapContext asociado al visor y carga de nuevo las capas. Se usa para actualizar el visor con los posibles cambios realizados sobre la vista 2D.
150 398 llmarques
151 399 llmarques
* remove(FLayer layer) : void
152
153
Elimina la capa equivalente de la recibida como parámetro.
154
155
* removeAll() : void
156
157
Elimina todas las capas cargadas.
158
159 404 llmarques
* setMapContext(MapContext theMapContext) : void
160 398 llmarques
161 404 llmarques
Establece el MapContext al visor.
162 398 llmarques
163
* setVerticalExaggeration(double verticalExaggeration) : void
164
165
Establece las exageración vertical del visor.
166
167
* show() : void
168
169
Muestra el visor.
170
171
* showAtmosphere() : void
172
173
Muestra la atmósfera si el visor es esférico.
174
175
* showNortIndicator() : void
176
177
Muestra el indicador del norte.
178
179
* showMiniMap() : void
180
181
Muestra el minimapa.
182
183
* showScale() : void
184
185
Muestra la escala de la capa.
186
187
* showStarBackgroundLayer() : void
188
189
Muestra el fondo de estrellas.
190
191 399 llmarques
* synchronizeViewPorts() : void
192
193
Sincroniza el viewPort de la vista 2D enlazada al visor con el enfoque del visor 3D.
194
195 398 llmarques
* hideAtmosphere() : void
196
197
Oculta la atmósfera en visores esféricos.
198
199
* hideMiniMap() : void
200
201
Oculta el minimapa.
202
203
* hideStarBackgroundLayer() : void
204
205
Oculta el fondo de estrellas.
206
207
* hideNorthIndicator() : void
208
209
Oculta el indicador del norte.
210
211
* hideScale() : void
212
213
Oculta la escala del mapa.
214
215
216
LIB IMPL
217
----------
218
219
DefaultView3DManager implements View3dManager
220
****************************************************
221
222
Implementación por defecto del manager View3DManager
223
224
DefaultVectorialDataReader implements DataReader
225
*************************************************
226
227
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo vectorial.
228
229
DefaultRasterDataReader implements DataReader
230
************************************************
231
232
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo raster.
233
234
DefaultElevationDataReader implements DataReader
235
************************************************
236
237
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo raster y el modo de carga elevación.
238
239
240
SWING IMPL
241
--------------
242
243
DefaultView3DSwingManager implements View3DSwingManager
244
********************************************************
245
246
Implementación por defecto del manager View3DSwingManager
247
248
DefaultView3DPanel extends View3DPanel
249
***************************************************
250
251
Implementación por defecto de los métodos descritos en la clase abstracta View3DPanel
252
253
View3D Plugin
254
----------------
255
256
Plugin principal de la librería. Estará compuesto por tres extensiones: View3DExtension, RefreshView3DExtension y SynchronizeView3DExtension. Además, gestionará la persistencia de las opciones establecidas por el usuario. El plugin registrará las acciones mediante el config.xml y creará el instalable con los archivos JARs.
257
258
View3DExtension
259
************************
260
261 399 llmarques
Extensión de Andami asociada a dos acciones: "create-flat-view3d" y "create-spherical-view3d". Esta extensión deberá estar siempre visible y activa solo cuando se active una vista 2D con un capa o más. Las dos acciones obtendrán la instancia del View3DSwingManager, crearán el panel, añadirán las capas de la vista activa, y lo mostrarán.
262 398 llmarques
263
RefreshView3DExtension
264
************************
265
266
Extensión de Andami asociada a la acción: "refresh-view3D". Esta extensión deberá estar visible cuando se active un visor 3D y siempre activa. La extensión obtendrá la instancia de tipo View3DPanel y ejecutará la operación View3DPanel#reloadLayers().
267
268
SynchronizeView3DExtension
269
****************************
270
271
Extensión de Andami asociada a la acción: "synchronize-view3D". Esta extensión deberá estar visible cuando se active una vista3D y siempre activa. La extensión obtendrá la instancia de tipo View3DPanel y ejecutará la operación View3DPanel#synchronizeViewPorts().
272
273
Persistencia
274
******************
275
276
Se creará un archivo llamado plugin-persistence.def que definirá la estructura de las preferencias. A priori las preferencias tendrán las siguientes propiedades:
277
278
 * Tamaño por defecto x : int
279
 * Tamaño por defecto y : int
280
 * Mostrar minimapa : boolean
281
 * Mostrar atmósfera : boolean
282
 * Mostrar escala : boolean
283
 * Mostrar indicar del norte : boolean
284
 * Mostrar fondo de estrellas : boolean
285
286
Se creará un panel para añadirlo a las preferencias generales de aplicación para que el usuario pueda modificar las preferencias del plugin.
287 401 llmarques
288
Integración con la librería NASA WW SDK
289
----------------------------------------
290
291
World Wind es una colección de componentes que de forma interactiva muestran información geográfica en 3D. Las aplicaciones o applets que usen la librería deberá integrar uno o más componentes dentro de su interfaz gráfica. World wind sigue el siguiente esquema:
292
293 424 llmarques
.. image:: ../images/world-wind-diagram.png
294 401 llmarques
295
* Globe: representa la forma del planeta y el terreno. Contiene un Tessellator el cual es el encargado de generar el terreno.
296
* Layer: las capas añaden las imagenes, objectos u otra información al globo. La capas se ajustan a la forma del globo y se mueven junto a el cuando el usuario navega por el espacio tridimensional.
297
* Model: junta el globo y las capas.
298
* View: determina la vista del usuario sobre el modelo. La vista se va modificando en base a los eventos de ususario que recibe.
299
* SceneController: asocia la vista con el modelo. Controla el tiempo y el renderizado del modelo.
300
301
Se pretende crear una nivel de abstracción que ofrezca a los consumidores de la librería la funcionalidades descritas en el análisis funcional de forma transparente. La integración del plugin con la librería World Wind se ha diseñado del siguiente modo:
302
303
* El componente View3DPanel integra un componente WorldWindowGLJPanel. WorldWindowGLJPanel es autocontenido y su propósito es servir la aplicación WorldWind mostrando el modelo definido (globo y capas).
304
* La configuración del globo se realiza al instanciar un objecto View3DPanel. Dependiendo del modo indicado como parámetro, el panel establece una configuración u otra.
305
* La creación de las capas se realiza mediante View3DManager, el cual dependiendo del tipo de carga y el modo instancia una implementación de DataRaster u otra. Estas implementaciónes delegan en la librería World Wide la lectura y procesamiento de los datos de entrada para la creación de las capas WW. Las capas raster imagen usarán la implementación DefaultRasterDataReader, las capas de elevación usarán DefaultElevationDataReader y las capas vectoriales rasterizadas la implementación DefaultVectorialDataReader.