2010-08-02 94 views
7

当用户点击屏幕上的位置,我有那个叫下面的方法:采摘对象不工作?

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

基本上类需要在获得点击屏幕共同ORDS,树立视和所有的矩阵它然后生成光芒。一旦光线生成后,它将每个顶点都放在它自己的Vector3中,然后测试光线是否与任何点相交。该方法表示射线在屏幕上的某些点与"SQUARE2"相交,无论是否存在对象。为什么?这可能是什么原因造成的?我如何解决它?

编辑:

它击中if语句“SQUARE2”每一个它认为它“发现”时间object.It只发现一个路口时,我打在屏幕的“中间”(这是可能的对象被绘制)但它只显示第一个if语句在屏幕中间的左侧和第二个在屏幕中间的右侧的交点

因此,例如它只认为它是在矩形是电话屏幕的标记为X的点处触摸了方形2。

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

我打电话来,用于光线跟踪的其他方法位于另一个项目.. http://code.google.com/p/libgdx/source/browse/#svn/trunk/gdx/src/com/badlogic/gdx/math(文件夹图形具有透视相机包含getPickRay();Intersector包含其他)。

编辑2: 它似乎正在选择正确的位置,对象可能是,但他们目前可能不是由于世界的旋转,所以它似乎只是与世界旋转的问题..这是我如何旋转世界......

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

我该如何调整我的代码,以便它可以识别对象在屏幕上的实际时间?

回答

1

旋转的摄像头 - 这是你的相机类犯规支持 - 然后用其setMatrices方法,而不是

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

- >你需要一个更好的摄像头类