2010-08-02 14 views
7

Tengo el siguiente método que se llama cuando el usuario hace clic en una posición en la pantalla:picking object not working?

 public void setup(int xi, int yi){ 
    int f = 0; 
    PerspectiveCamera camera = new PerspectiveCamera(); 
    camera.setViewport(320, 508); 
    camera.update(); 
    Ray touch = camera.getPickRay(xi, yi); 

    while(f < GLCamTest.array.length){ 
     //Vertex 1 
     float x1 = GLCamTest.array[f]; 
     f++; 
     float y1 = GLCamTest.array[f]; 
     f++; 
     float z1 = GLCamTest.array[f]; 
     f++; 

     //Vertex 2 
     float x2 = GLCamTest.array[f]; 
     f++; 
     float y2 = GLCamTest.array[f]; 
     f++; 
     float z2 = GLCamTest.array[f]; 
     f++; 

     //Vertex 3 
     float x4 = GLCamTest.array[f]; 
     f++; 
     float y4 = GLCamTest.array[f]; 
     f++; 
     float z4 = GLCamTest.array[f]; 
     f++; 

     //Vertex 4 
     float x5 = GLCamTest.array[f]; 
     f++; 
     float y5 = GLCamTest.array[f]; 
     f++; 
     float z5 = GLCamTest.array[f]; 
     f++; 

     Intersector sect = new Intersector(); 
     float z3 = 10; 
     //Mid-point formula 
     float x3 = (x2+x4)/2; 
     float y3 = (y2+y4)/2; 

     //Triangle one is (x1,y1), (x2,y2), (x3, y3) 
     //Triangle two is (x4, y4), (x5, y5), (x3, y3) 

     //Now, I have my 2 tri-angles I need for the 
     // Polygon test.. 
     Vector3 t1 = new Vector3(x1,y1,z1); 
     Vector3 t2 = new Vector3(x2,y2,z2); 
     Vector3 t3 = new Vector3(x3,y3,z3); 
     Vector3 t4 = new Vector3(x4,y4,z4); 
     Vector3 t5 = new Vector3(x5,y5,z5); 

     if(sect.intersectRayTriangle(touch, t1, t2, t3, t4) 
      == true){ 
      System.out.println("TOUCHED AN OBJECT!!"); 
      if (f <= 12){ 
       System.out.println("SQUARE 1"); 
      } else if(f <= 24 && f >=13){ 
       System.out.println("SQUARE 2"); 
      } else if(f <= 36 && f >= 25){ 
       System.out.println("SQUARE 3"); 
      } 
     } 
     if(sect.intersectRayTriangle(touch, t4, t5, t3, t1) 
       == true){ 
      System.out.println("TOUCHED AN OBJECT!!"); 
      if (f <= 12){ 
       System.out.println("SQUARE 1"); 
      } else if(f <= 24 && f >=13){ 
       System.out.println("SQUARE 2"); 
      } else if(f <= 36 && f >= 25){ 
       System.out.println("SQUARE 3"); 
      } 
     }else{ 
      System.out.println("NO TOUCH"); 
     } 
    } 
    f = 0; 
} 

Básicamente la clase toma en la pantalla de co-ords que se ha hecho clic, configura la ventana y todo el matrices luego genera el Rayo. Una vez que se genera el rayo, toma cada vértice y lo pone en su propio Vector3, luego prueba si el rayo se cruza con cualquiera de los puntos. El método dice que el rayo intersecta "SQUARE2" en ciertos puntos de la pantalla independientemente de si hay un objeto allí o no ... ¿por qué? ¿Qué podría estar causando esto? ¿Cómo lo arreglo?

edición:

Está golpeando la sentencia if "square2" cada vez que piensa que "encuentra" un object.It sólo encuentra una intersección cuando golpeo el "medio" de la pantalla (esto es donde los objetos podrían dibujar) pero solo muestra una intersección para la primera declaración if en el lado izquierdo del medio de la pantalla y el segundo para el lado derecho del medio de la pantalla

Así que, por ejemplo, solo piensa que es tocó el cuadrado 2 en los puntos marcados X donde el Rectángulo es la pantalla del teléfono.

_________ 
    |  | 
    |  | 
    |X  X| 
    |  | 
    |_______| 

Los otros métodos que estoy llamando a la trazado de rayos se encuentran en otro proyecto .. (http://code.google.com/p/libgdx/source/browse/#svn/trunk/gdx/src/com/badlogic/gdx/math Los Gráficos carpeta tiene cámara de perspectiva, que contiene getPickRay(); y Intersector contiene al otro).

edit2: Parece que está recogiendo la ubicación correcta donde los objetos PODRÍAN estar, pero que actualmente no es debido a que el mundo gira, por lo que parece estar teniendo problemas con el mundo girando. Así es como estoy rotando el mundo ...

public void onDrawFrame(GL10 gl) { 
    onDrawFrameCounter++; 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    bindCameraTexture(gl); 
    float bear = Global.bearing; 
    gl.glLoadIdentity(); 
    gl.glNormal3f(0,0,1); 
    gl.glRotatef(bear, 0, 1, 0); 

    int e = 0; 
    for(int q=0; q < Global.cubes;q++){ 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4); 
    e = e+4; 
    } 
} 

¿Cómo ajustaría mi código para que reconozca cuando los objetos están EN REALIDAD en la pantalla?

Respuesta

1

girar la cámara - algo que su cámara no tenga soporte de clase - y luego usar su método setMatrices en lugar de

gl.glLoadIdentity(); 
gl.glNormal3f(0,0,1); 
gl.glRotatef(bear, 0, 1, 0); 

-> Es necesario una mejor clase de cámara