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