Statistics
| Revision:

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

History | View | Annotate | Download (12.7 KB)

1
=================================================================
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
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

    
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
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

    
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
* createView3DPanel(int mode) : View3DPanel
118

    
119
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

    
121
* createView3DPanel(MapContext theMapContext, int mode) : View3DPanel
122

    
123
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

    
125

    
126
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
* add(FLayer layer) : void
132

    
133
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

    
135
* add(FLayers layers) : void
136

    
137
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

    
139
* getMapContext() : MapContext
140

    
141
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

    
143
* getVerticalExaggeration() : double
144

    
145
Obtiene la exageración vertical del visor.
146

    
147
* reloadLayers() : void
148

    
149
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

    
151
* 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
* setMapContext(MapContext theMapContext) : void
160

    
161
Establece el MapContext al visor. 
162

    
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
* synchronizeViewPorts() : void
192

    
193
Sincroniza el viewPort de la vista 2D enlazada al visor con el enfoque del visor 3D.
194

    
195
* 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
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

    
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

    
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
.. image:: images/world-wind-diagram.png
294

    
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. 
306