SoloCodigo

Programación Específica => Programación de Videojuegos => OpenGL => Mensaje iniciado por: fap1603 en Lunes 17 de Enero de 2005, 15:21

Título: Vectores En Opengl
Publicado por: fap1603 en Lunes 17 de Enero de 2005, 15:21
Hola a todos, miren estoy usando opengl en vb, y necsito hacer un vetor que sea seleccionable con el mouse, es decir una linea o cadena de ellas, dibujadas en un espacio, las cuales pueda seleccionar al hacer click sobre ellas, si alguien tiene una idea se lo agradeceria mucho.
Título: Re: Vectores En Opengl
Publicado por: Ruben3d en Miércoles 19 de Enero de 2005, 13:01
Hola.

Tienes dos opciones:

a) Trazar una línea desde el punto en el que se encuentra el ratón paralela al eje Z, y calcular colisión contra los objetos ya proyectados (multiplicados por la matriz de proyección). Si quieres saber qué coordenada es en espacio no ortogonal, habrás de multiplicar el resultado por la inversa de la matriz de proyección.

b) Usar las funciones que OpenGL te da para la tarea. En esta web hay un buen tutorial:
NeHe - Picking, Alpha Blending, Alpha Testing, Sorting (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=32).
Fijate en la función void Selection(void);

Se deja como ejercicio para el lector convertir el código a Visual Basic :P

Un saludo.

Ruben3d
Título: Re: Vectores En Opengl
Publicado por: luzop en Sábado 5 de Febrero de 2005, 18:12
Bueno, quizás ya lo resolvistes,...pero por si las moscas.

Este codigo genera la dirección de un Rayo que apunta "hacia la pantalla".

Código: Text
  1.  
  2.   private final int[]    viewport    = new int[4];
  3.   private final double[]  modelview    = new double[16];
  4.   private final double[]  projection   = new double[16];
  5.   private final double p0_X[] = new double [1];
  6.   private final double p0_Y[] = new double [1];
  7.   private final double p0_Z[] = new double [1];
  8.   private final double p1_X[] = new double [1];
  9.   private final double p1_Y[] = new double [1];
  10.   private final double p1_Z[] = new double [1];
  11.     private int height;
  12.     private int x;
  13.     private int y;
  14.     private final Ray rayo = new Ray();
  15.   
  16.    //---------------------------------------------------------------------
  17.    // EL origen del rayo esta dado por la posición de la cámara
  18.    // gluLookAt(....)
  19.    //--------------------------------------------------------------------
  20.     private void generarDireccionRayo(GL gl,GLU glu){
  21.         gl.glGetDoublev(  GL.GL_MODELVIEW_MATRIX, modelview );
  22.     gl.glGetDoublev(  GL.GL_PROJECTION_MATRIX, projection );
  23.     gl.glGetIntegerv( GL.GL_VIEWPORT, viewport );
  24.                   
  25.                  // height, es la altura de la ventana
  26.     int val = glu.gluUnProject(x,height-y,0,
  27.                      modelview, projection, viewport,
  28.                                p0_X , p0_Y , p0_Z);
  29.  
  30.     if(val == GL.GL_FALSE)
  31.             throw new RuntimeException("Error en gluUnproject()");
  32.  
  33.     val = glu.gluUnProject(x,height-y,1,
  34.                    modelview, projection, viewport,
  35.                            p1_X , p1_Y , p1_Z);
  36.  
  37.     if(val == GL.GL_FALSE)
  38.             throw new RuntimeException("Error en gluUnproject()");
  39.  
  40.     rayo.direction.x = (float)(p1_X[0] - p0_X[0]);
  41.     rayo.direction.y = (float)(p1_Y[0] - p0_Y[0]);
  42.     rayo.direction.z = (float)(p1_Z[0] - p0_Z[0]);
  43.     rayo.direction.normalize();
  44.     }
  45.  
  46.     public void mouseClicked(MouseEvent e) {
  47.         x = e.getX();
  48.         y = e.getY();
  49.     }
  50.  
  51.  

Teniendo la dirección del rayo, le das una magnitud lo suficientemente grande para
que alcance tus objetos(vectoresen este caso). Luego lo intersectas con los objetos que quieras "pickear"  (intersección Rayo/segmento_de_linea supongo ).