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