2010-08-02 7 views
7

J'ai la méthode suivante qui est appelée lorsque l'utilisateur clique sur une position sur l'écran:choisir l'objet ne fonctionne pas?

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

Fondamentalement, la classe prend dans l'écran co-ords qui ont été cliqués, met en place la fenêtre et toutes les matrices, il génère ensuite le Ray. Une fois que le rayon est généré, il prend chaque sommet et le met dans son propre Vector3 puis teste le rayon intersecte l'un des points. La méthode dit que le rayon croise "SQUARE2" à certains points de l'écran, qu'il y ait ou non un objet ... pourquoi? Qu'est-ce qui peut causer cela? Comment je le répare?

modifier:

Il est frappant l'instruction if « Square2 » à chaque fois qu'il pense qu'il « trouve » un object.It trouve seulement une intersection quand je frappe le « milieu » de l'écran (ce qui est l'endroit où les objets pourraient être dessiné) mais il montre seulement une intersection pour la première déclaration if sur le côté gauche du milieu de l'écran et la seconde pour le côté droit du milieu de l'écran

Ainsi, par exemple, il pense seulement qu'il est touché le carré 2 aux points marqués X où le rectangle est l'écran des téléphones.

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

Les autres méthodes que je vous appelle à la traçabilité des rayons sont situés dans un autre projet .. http://code.google.com/p/libgdx/source/browse/#svn/trunk/gdx/src/com/badlogic/gdx/math (Le dossier Graphics a caméra Perspective qui contient getPickRay(); et Intersector contient l'autre). Il semble qu'il se trouve juste où les objets pourraient être, mais ils ne sont pas en raison de la rotation du monde, donc il semble avoir juste des problèmes avec le monde en rotation .. Voici comment je fais tourner le monde ...

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

Comment est-ce que j'ajusterais mon code de sorte qu'il reconnaisse quand les objets sont réellement sur l'écran?

Répondre

1

Faites pivoter la caméra - quelque chose que votre soutien ne marche pas de classe de la caméra - puis utiliser la méthode setMatrices au lieu de

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

-> Vous avez besoin d'une meilleure classe de la caméra