Revision 429

View differences:

2.1/trunk/doc/Fase 1/dt-visor-3d.rst
50 50
.. note::
51 51
 Este documento esta en continua construcción. A medida que se avance en el proyecto se irá añadiendo nueva información y refinando la existente.
52 52

  
53
Este documento detalla el diseño técnico de la fase 1 del nuevo visor 3D basado en la librería NASA WW SDK para gvSIG 2.1+. Para más información consulte:
53
Este documento detalla el diseño técnico de las funcionalidades definidas y la arquitectura del nuevo visor 3D basado en la librería NASA WW SDK para gvSIG 2.1+. Para más información consulte:
54 54

  
55 55
* http://worldwind.arc.nasa.gov/java/
56 56
* http://goworldwind.org/
......
68 68
Ejemplo de caso de uso
69 69
-------------------------------
70 70

  
71
A partir de una vista 2D, se desea representar la información cargada 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). Pero antes de crear el visor 3D, el usuario debe indicar como se deben de cargar las capas (si no lo indica se cargarán con los modos de carga por defecto). 
71
A partir de una vista 2D, se desea representar la información cargada 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). Pero antes de crear el visor 3D, el usuario debe indicar como se deben de cargar las capas mediante las propiedades de cada capa (si no se indica se cargarán con los modos de carga por defecto). 
72 72

  
73 73
Las capas dependiendo del tipo puede cargarse del siguiente modo:
74 74

  
75
* Las capas vectoriales pueden cargarse como "Capa vectorial rasterizada" o "Capa vectorial con simbología 3D". El modo de carga "Capa vectorial rasterizada" toma la información vectorial y crea una imagen (proceso de rasterización) y la carga en el visor 3D. El modo de carga "Capa vectorial con simbología 3D" carga la capa usando simbología 3D. Este último modo de carga no se aboradará a priori. Si el usuario no indica el modo de carga de una capa vectorial por defecto se cargará como "Capa vectorial rasterizada".
76
* Las capas raster puede cargarse como "Capa raster como imagen" o "Capa raster como elevación". El modo de carga "Capa raster como imagen" toma el raster y lo representa teselado en el visor 3D mientras que el modo de carga "Capa raster como elevación" toma el raster e interpreta los datos para crear una elevación en la superficie del terreno. Si el usuario no indica el modo de carga de una capa raster por defecto se cargará como "Capa raster como imagen".
75
* Las capas vectoriales pueden cargarse como "Capa vectorial rasterizada" (LOADMODE.RASTERIZEDVEC) o "Capa vectorial con simbología 3D" (LOADMODE.VECTORIAL). El modo de carga "Capa vectorial rasterizada" toma la información vectorial y crea una imagen (proceso de rasterización) y la carga en el visor 3D. El modo de carga "Capa vectorial con simbología 3D" carga la capa usando simbología 3D. Este último modo de carga no se aboradará a priori. Si el usuario no indica el modo de carga de una capa vectorial por defecto se cargará como "Capa vectorial rasterizada".
76
* Las capas raster puede cargarse como "Capa raster como imagen" (LOADMODE.RASTER) o "Capa raster como elevación" (LOADMODE.ELEVATION). El modo de carga "Capa raster como imagen" toma el raster y lo representa teselado en el visor 3D mientras que el modo de carga "Capa raster como elevación" toma el raster e interpreta los datos para crear una elevación en la superficie del terreno. Si el usuario no indica el modo de carga de una capa raster por defecto se cargará como "Capa raster como imagen".
77 77

  
78
Una vez definidos los modos de carga de las capas, el usuario debe pulsar sobre uno de los botones para crear un visor. Al pulsar, el plugin obtendrá la vista activa en ese momento. Con la vista activa se obtendrá el MapContext mediante IView#getMapControl().getMapContext(). Una vez obtenido el MapContext se creará un nuevo visor mediante View3DManager#createView3DPanel(mapContext, mode). El modo dependerá de la acción ejecutada por el usuario. Al crear el visor, este automáticamente añade las capas del MapContext mediante View3DPanel#add(layer, loadMode). Sólo queda invocar el método View3DPanel#show() para mostrar el visor. 
78
Una vez definidos los modos de carga de las capas, el usuario debe pulsar sobre uno de los botones para crear un visor. Al pulsar, el plugin obtendrá la vista activa en ese momento. Con la vista activa se obtendrá el MapContext mediante IView#getMapControl().getMapContext(). Una vez obtenido el MapContext se creará un nuevo visor mediante View3DManager#createView3DPanel(mapContext, type). El tipo dependerá de la acción ejecutada por el usuario. Al crear el visor, este automáticamente añade las capas del MapContext mediante View3DPanel#add(layer, loadMode). Sólo queda invocar el método View3DPanel#show() para mostrar el visor.
79 79

  
80 80
Además de la extensión 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().
81 81

  
82
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.
82
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. 
83 83

  
84 84
Para más información acerca de las funcionalidades consultar el análisis funcional indicado en `Introducción`_.
85 85

  
......
101 101
View3DPanel
102 102
****************************
103 103

  
104
Define el API del visor 3D. 
104
Define el API del visor 3D.
105 105

  
106 106
* add(FLayer layer, LOADMODE loadMode) : void
107 107

  
......
190 190
TYPE
191 191
*************
192 192

  
193
Enumerado que representa los dos tipos posibles de un visor 3D. Los dos tipos son: TYPE.SPHERE y TYPE.FLAT.
193
Enumerado que representa los dos tipos posibles de un visor 3D. Los dos tipos son: SPHERE y FLAT.
194 194

  
195 195
LOADMODE
196 196
**************
......
202 202

  
203 203
Clase abstracta que extiende de JPanel. Esta clase abstracta no implementa ninguno de lo métodos de la interfaz View3DPanel, sólo implementa el código relacionado con la instanciación y creación de los componentes de la vista. La implementación por defecto del API recae sobre la clase DefaultView3DPanel.
204 204

  
205
LayerConverter
206
****************
207

  
208
Interfaz que permite convertir una capa gvSIG en una capa WW. Este proceso dependende del tipo de capa y el modo de carga definido.
209

  
210
* convert(FLayer layer) : gov.nasa.worldwind.layers.Layer
211

  
212
Método que a partir de una capa gvSIG obtiene la capa equivalente en WW.
213

  
205 214
SWING IMPL
206 215
--------------
207 216

  
208
Este es la implementación 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.
217
Este es la implementación de la interfaz de usuario de la librería del visor 3D.
209 218

  
210 219
* Project: org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl
211 220
* Package: or.gvsig.view3d.swing.impl
......
218 227
DefaultView3DPanel extends AbstractView3DPanel
219 228
***************************************************
220 229

  
221
Implementación por defecto de los métodos descritos en la interfaz View3DPanel.
230
Implementación por defecto de los métodos descritos en la interfaz View3DPanel. Esta clase tendrá asociado un MapContext que permitirá obtener información acerca del enfoque, eschuchar enventos de cambio sobre capas y enfoque, versionado... 
222 231

  
232
* public DefaultView3DPanel(MapContext mapContext, TYPE type);
233

  
234
Constructor que permite instancia un nuevo visor 3D a partir de un MapContext y el tipo. Este constructor invocará a super(type) para la creación e inicialización de los componentes del visor. Además, también accederá a las capas del mapContext para añadirlas al componente de la librería WW. Para añadir una capa al componente WW es necesaria una transformación (LayerConverter#convert(layer)) de la capa gvSIG a una capa WW en base al modo de carga asociado espeficicado por el usuario.
235

  
236
DefaultRasterLayerConverter implements LayerConverter
237
**********************************************************
238

  
239
Implementación por defecto para convertir capas FLyrRaster de gvSIG en capas SurfaceImageLayer de WW. Se usará el API del objeto FLyrRaster para la conversión. El objeto SurfaceImageLayer permite añadir imágenes mediante dos modos: ruta al archivo y como BufferedImage. Al añadir una imagen a una capa SurfaceImageLayer, la librería WW automáticamente obtiene el proveedor necesario para la lectura de la imagen, la carga y la tesela por lo que no es necesario realizar ninguna acción previa antes de añadir la imagen. La carga de la imagen se debe realizar en un hilo nuevo para no bloquear gvSIG usando TaskStatus. 
240

  
241
Se puede encontrar un ejemplo de como cargar imagenes en una capa SurfaceImageLayer:
242

  
243
 http://worldwind31.arc.nasa.gov/svn/tags/2.0.0/WorldWind/src/gov/nasa/worldwindx/examples/SurfaceImageViewer.java
244

  
223 245
.. note::
224
  TODO: Añadir información de como dar soporte a los diferentes modos de carga.
246
 A priori parace más sencillo usar el path de la imagen que obtener un objecto BufferedImage a partir de la capa raster.
225 247

  
248
DefaultWMSLayerConverter implements LayerConverter
249
**********************************************************
250

  
251
.. note::
252
  TODO en fases posteriores
253

  
254
DefaultElevationLayerConverter implements LayerConverter
255
***********************************************************
256

  
257
.. note::
258
  TODO en fases posteriores
259

  
260
DefaultVectorialLayerConverter implements LayerConverter
261
***********************************************************
262

  
263
.. note::
264
  TODO en fases posteriores
265

  
226 266
View3D APP
227 267
----------------
228 268

  
......
251 291
* SynchronizeView3DExtension: 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().
252 292

  
253 293
Persistencia
254
******************
294
*************
255 295

  
256 296
.. note::
257
  TODO: Apartado incompleto. Completar cuando se diseñe como integrar la propiedades dentro de la librería. 
297
  TODO en fases posteriores. Definir panales y gestión de preferencias.
258 298

  
259
Se creará un archivo llamado plugin-persistence.def que definirá la estructura de las preferencias. A priori las preferencias tendrán las siguientes propiedades:
260

  
261
 * Tamaño por defecto x : int
262
 * Tamaño por defecto y : int
263
 * Mostrar minimapa : boolean
264
 * Mostrar atmósfera : boolean
265
 * Mostrar escala : boolean
266
 * Mostrar indicar del norte : boolean
267
 * Mostrar fondo de estrellas : boolean
268

  
269
Se creará un panel para añadirlo a las preferencias generales de aplicación para que el usuario pueda modificar las preferencias del plugin.
270

  
271 299
Integración con la librería NASA WW SDK
272 300
----------------------------------------
273 301

  
......
284 312
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 que no tengan que interactuar con la librería WW. La integración del plugin con la librería World Wind se ha diseñado del siguiente modo:
285 313

  
286 314
* 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).
287
* 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.
288

  
289
.. note:: 
290
  TODO: Apartado imcompleto. Cuando se defina el sopote de los modos de carga definir como se obtiene la capa WW a partir de una capa de gvSIG.
315
* La librería posee unos archivos de configuración en XML que son cargados cuando la librería se registra. Estos archivos de configuración por un lado definen la clases que implementan los distintos servicios que ofrece la librería y por otro las capas que se cargan por defecto al crear un modelo básico.
316
* Además de esta configuración, es necesario configurar unos parámetros espeficios para crear un WorldWindowGLJPanel esférico o plano. Esta configuración se realiza al instanciar un objecto View3DPanel. Dependiendo del modo indicado como parámetro, se establece una configuración u otra.
317
* La obtención de las capas WW a partir de capas de gvSIG se realiza mediante la clase LayerConverter la cual permite obtener la capa equivalente en WW a partir de una capa de gvSIG para añadirla a las capas del modelo WW.

Also available in: Unified diff