2010-08-02 29 views
7

tôi đã có những phương pháp sau đây được gọi khi người dùng nhấp vào một vị trí trên màn hình:đối tượng chọn không hoạt động?

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

Về cơ bản lớp mất trong màn hình đồng ords được nhấn vào, thiết lập các khung nhìn và tất cả các ma trận nó sau đó tạo ra Ray. Một khi tia được tạo ra, nó lấy mỗi đỉnh và đặt nó vào Vector3 riêng của nó, sau đó các phép thử làm tia cắt nhau bất kỳ điểm nào. Phương pháp nói rằng tia cắt giao nhau "SQUARE2" tại một số điểm trên màn hình bất kể nếu có một đối tượng ở đó hay không .. tại sao? Điều gì có thể gây ra điều này? Làm thế nào để tôi sửa chữa nó?

chỉnh sửa:

Nó đánh câu lệnh if "SQUARE2" mỗi khi nó nghĩ rằng nó "thấy" một object.It chỉ tìm thấy một ngã tư khi tôi nhấn phím "giữa" của màn hình (đây là nơi các đối tượng có thể được vẽ) nhưng nó chỉ hiển thị một giao lộ cho câu lệnh if đầu tiên ở bên trái của giữa màn hình và phần thứ hai cho phía bên tay phải ở giữa màn hình

Vì vậy, ví dụ như nó chỉ nghĩ rằng đó là chạm vào hình vuông 2 tại các điểm được đánh dấu X, nơi hình chữ nhật là màn hình điện thoại.

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

Các phương pháp khác Tôi gọi để cho ray tracing được đặt tại một dự án khác .. http://code.google.com/p/libgdx/source/browse/#svn/trunk/gdx/src/com/badlogic/gdx/math (The Graphics thư mục có Perspective Máy ảnh, trong đó có getPickRay();Intersector chứa khác).

edit2: Dường như nó đang chọn đúng vị trí nơi các đối tượng CÓ THỂ nhưng chúng có thể không phải do thế giới quay nên dường như chỉ gặp vấn đề với thế giới đang quay .. thế giới ...

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

Làm cách nào để điều chỉnh mã của tôi để nó nhận ra khi vật thể thực sự trên màn hình?

Trả lời

1

xoay camera - cái gì mà camera hỗ trợ lớp doesnt của bạn - và sau đó sử dụng phương pháp setMatrices của nó thay vì

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

-> Bạn cần một lớp camera tốt hơn

Các vấn đề liên quan