• Viernes 15 de Noviembre de 2024, 05:26

Autor Tema:  Vectores En Opengl  (Leído 3447 veces)

fap1603

  • Miembro MUY activo
  • ***
  • Mensajes: 135
    • Ver Perfil
Vectores En Opengl
« en: Lunes 17 de Enero de 2005, 15:21 »
0
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.
Saludos,

Francisco Ayala Pinazo
Lima - Perú

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Vectores En Opengl
« Respuesta #1 en: Miércoles 19 de Enero de 2005, 13:01 »
0
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.
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

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Re: Vectores En Opengl
« Respuesta #2 en: Sábado 5 de Febrero de 2005, 18:12 »
0
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 ).