[Gvsig_desarrolladores] OSGVP: Usar un jpg como suelo de un planeta

Rafa Gaitan rafa.gaitan en gmail.com
Lun Ene 26 11:14:27 CET 2009


Hola María,

ya he descubierto un par de cosas.

Por un lado, en la clase Mundo, añadiendo init() justo antes del
addTextureLayer, se soluciona el problema de la petición de capas.

           public Mundo() throws NodeException {
                   super("Mi Mundo",
                                   Planet.CoordinateSystemType.PROJECTED,
"WKT", "EPSG:23030",
                                   1, 1, 2, 2, 1.0, 1.0);
                   init(); // NECESARIO PARA QUE SE INICIALIZE EL SISTEMA DE
EVENTOS INTERNO.
                   addTextureLayer(getExtent());
                   setEnabledSubdivision(false);
           }

El problema es que debido a que hay verios threads independientes para el
manejo de la escena en 3D, hay implementado un sistema de eventos que se
inicializa automáticamente al dibujarse por primera vez la escena. En gvSIG,
antes de añadir capas se visualiza el planeta, por lo que no suele dar
problemas, pero en tu caso lo estabas creando todo desde el principio, con
la llamada init() antes de añadir capas se soluciona el problema.

Por otro lado, cambia el setTexture por esto:

earth.setTexture(evt.getTerrainNode(),
Util.extractResource("/earth.gif").getAbsolutePath(), 0);

La razón de por que no se carga desde los recursos diréctamente es por que
gvSIG es el encargado de generar la imagen, por lo que es mejor que nos pase
diréctamente la ruta al fichero, en este caso con que lo extraigas de los
recursos con Util es suficiente.

ya me comentas si todo va bien.

Un Saludo,
Rafa.


PD. los rangos de cámara, te recomiendo que los hagas entre 0.01 y el máximo
que quieras, ya que el extent que has puesto es relativamente pequeño.

On Mon, Jan 26, 2009 at 10:35 AM, Rafa Gaitan <rafa.gaitan en gmail.com> wrote:

> Hola María,
>
> El código parece correcto, voy a hacer unas pruebas a ver si es algo que se
> me ha olvidado comentarte y te digo.
>
> Un Saludo,
> Rafa.
>
>
> 2009/1/23 Maria Arias de Reyna <marias en emergya.es>
>
>> El Viernes 23 Enero 2009 11:41, Rafa Gaitan escribió:
>> > Por otro lado si lo que quieres es NO subdividir y poner una única
>> textura,
>> > añadiendo esto cuando creas el planeta es suficiente:
>> >
>> >     planet.setEnabledSubdivision(false);
>>
>> He intentado hacer lo que me has dicho, pero no consigo verlo. He creado
>> una
>> clase mundo que extiende a planeta y que llama a las funciones que me has
>> indicado. Pero aunque me pinta la proyección y me deja moverla y girarla,
>> en
>> ningún momento llama a la función de requestTextureLayer(...).
>>
>> public class Mundo extends Planet  {
>>
>>         public Mundo() throws NodeException {
>>                 super("Mi Mundo",
>>                                 Planet.CoordinateSystemType.PROJECTED,
>> "WKT", "EPSG:23030",
>>                                 1, 1, 2, 2, 1.0, 1.0);
>>                 addTextureLayer(getExtent());
>>                 setEnabledSubdivision(false);
>>         }
>> }
>>
>> Y luego llamo creo el mundo y lo pinto con la clase ejemplo:
>>
>> public class Ejemplo implements RequestLayerListener{
>>
>>        private static IViewerContainer canvas3d;
>>        private static PlanetViewer planetViewer;
>>        private static Mundo earth;
>>
>>        public void ejecutar()
>>        {
>>                JPanel jContentPane = new JPanel();
>>                jContentPane.setLayout(new BorderLayout());
>>                JFrame jFrame = new JFrame();
>>                jFrame.setContentPane(jContentPane);
>>                jFrame.setSize(800, 600);
>>                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>>
>>                /**
>>                 * Create a planet viewer
>>                 */
>>                try {
>>                        planetViewer = new PlanetViewer();
>>                } catch (NodeException e) {
>>                        // TODO Auto-generated catch block
>>                        e.printStackTrace();
>>                }
>>                /**
>>                 * Define the viewer type and add to the canvas
>>                 */
>>                canvas3d = ViewerFactory.getInstance().createViewer(
>>                                ViewerFactory.VIEWER_TYPE.CANVAS_VIEWER,
>> planetViewer);
>>                jContentPane.add((Component)canvas3d, BorderLayout.CENTER);
>>                ViewerFactory.getInstance().startAnimator();
>>                /**
>>                 * Add a planet to the scene data
>>                 */
>>                try {
>>                        earth = new Mundo();
>>                } catch (NodeException e3) {
>>                        // TODO Auto-generated catch block
>>                        e3.printStackTrace();
>>                }
>>                try {
>>                        planetViewer.addPlanet(earth);
>>
>>                } catch (NodeException e2) {
>>                        e2.printStackTrace();
>>                }
>>                earth.setRequestLayerListener(this);
>>                /**
>>                 * Put the camera in the scene
>>                 */
>>                double difx = earth.getExtent().getWidth() / 2.0d;
>>                double dify = earth.getExtent().getHeight() / 2.0d;
>>                double posx = earth.getExtent().getX() + difx;
>>                double posy = earth.getExtent().getY() + dify;
>>                double height = Math.sqrt(difx * difx + dify * dify) *
>> 4.0f;
>>
>>                Camera cam = planetViewer.getCamera();
>>                cam.setViewByLookAt((float) posx, (float) posy, (float)
>> height,
>>                                (float) posx, (float) posy, 0f, 0f, 1f,
>> 0f);
>>                planetViewer.setCamera(cam);
>>                /**
>>                 * Customizing the manipulator
>>                 */
>>                CustomTerrainManipulator manip = (CustomTerrainManipulator)
>> planetViewer
>>                                .getCameraManipulator();
>>
>>  manip.addAzimButtonMask(MouseButtonMaskType.LEFT_MOUSE_BUTTON, 'a');
>>
>>  manip.addRollButtonMask(MouseButtonMaskType.MIDDLE_MOUSE_BUTTON, 'b');
>>
>>  manip.addZoomButtonMask(MouseButtonMaskType.MIDDLE_MOUSE_BUTTON, 'c');
>>                manip.setMinCameraDistance(earth.getRadiusEquatorial() +
>> 10);
>>                manip.setMaxCameraDistance(earth.getRadiusEquatorial() +
>> 1000);
>>                manip.setEnabledNorthOrientation(true);
>>                jFrame.setVisible(true);
>>                jFrame.addWindowListener(new WindowAdapter() {
>>                        public void windowClosing(WindowEvent e) {
>>                                ViewerFactory.getInstance().stopAnimator();
>>                                canvas3d.dispose();
>>                        }
>>                });
>>        }
>>
>>
>>
>>        public void requestElevationLayer(Planet arg0, RequestLayerEvent
>> arg1) {
>>                // TODO Auto-generated method stub
>>
>>        }
>>
>>        public void requestTextureLayer(Planet arg0, RequestLayerEvent
>> arg1){
>>                earth.setTexture(arg1.getTerrainNode(), "/earth.gif", 0);
>>        }
>>
>> }
>>
>> --
>> María Arias de Reyna Domínguez
>> Emergya Consultoría
>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en runas.cap.gva.es
>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>
>>
>
>
> --
> Rafael Gaitán Linares
> Instituto de Automática e Informática Industrial  http://www.ai2.upv.es
> Ciudad Politécnica de la Innovación
> Universidad Politécnica de Valencia
>



-- 
Rafael Gaitán Linares
Instituto de Automática e Informática Industrial  http://www.ai2.upv.es
Ciudad Politécnica de la Innovación
Universidad Politécnica de Valencia
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20090126/1b17781b/attachment.htm


Más información sobre la lista de distribución gvSIG_desarrolladores