2013-08-13 4 views
0

열린 GL에는 picking이라는 용어가 있습니다. 화면의 어떤 객체가 선택되었는지 확인하는 데 사용됩니다. 누군가가 나에게 피킹 (picking)을 사용하고 개체의 모든 인스턴스에 터치 기반 청취자를 사용하는 것의 차이점을 설명 할 수 있습니까? 큐브 클래스.Android Open Gl 객체 선택

가설 적으로; 내가하고 싶은 것은 무작위로 화면에 여러 큐브를 보여줍니다. 큐브 클래스에 청취자를 지정하면 큐브를 만지면 청취자는 누를 때마다 큐브를 발사해야한다고 생각했습니다.

리스너를 추가 할 코드입니다. 이것이 가능한가요, 따기가 필요한가?

public class Cube extends Shapes { 
private FloatBuffer mVertexBuffer; 
private FloatBuffer mColorBuffer; 
private ByteBuffer mIndexBuffer; 
private Triangle[] normTris = new Triangle[12]; 
private Triangle[] transTris = new Triangle[12]; 

// every 3 entries represent the position of one vertex 
private float[] vertices = 
     { 
       -1.0f, -1.0f, -1.0f, 
       1.0f, -1.0f, -1.0f, 
       1.0f, 1.0f, -1.0f, 
       -1.0f, 1.0f, -1.0f, 
       -1.0f, -1.0f, 1.0f, 
       1.0f, -1.0f, 1.0f, 
       1.0f, 1.0f, 1.0f, 
       -1.0f, 1.0f, 1.0f 
     }; 

// every 4 entries represent the color (r,g,b,a) of the corresponding vertex in  vertices 
private float[] colors = 
     { 
       1.0f, 0.0f, 0.0f, 1.0f, 
       0.0f, 1.0f, 0.0f, 1.0f, 
       0.0f, 0.0f, 1.0f, 1.0f, 
       1.0f, 0.0f, 0.0f, 1.0f, 
       0.0f, 1.0f, 0.0f, 1.0f, 
       0.0f, 0.0f, 1.0f, 1.0f, 
       0.0f, 0.0f, 0.0f, 1.0f, 
       1.0f, 1.0f, 1.0f, 1.0f 
     }; 
// every 3 entries make up a triangle, every 6 entries make up a side 
private byte[] indices = 
     { 
       0, 4, 5, 0, 5, 1, 
       1, 5, 6, 1, 6, 2, 
       2, 6, 7, 2, 7, 3, 
       3, 7, 4, 3, 4, 0, 
       4, 7, 6, 4, 6, 5, 
       3, 0, 1, 3, 1, 2 
     }; 
private float[] createVertex(int Index) 
{ 
    float[] vertex = new float[3]; 
    int properIndex = Index * 3; 
    vertex[0] = vertices[properIndex]; 
    vertex[1] = vertices[properIndex + 1]; 
    vertex[2] = vertices[properIndex + 2]; 
    return vertex; 
} 

public Triangle getTriangle(int index){ 
    Triangle tri = null; 
    //if(index >= 0 && index < indices.length){ 
     float[] v1 = createVertex(indices[(index * 3) + 0]); 
     float[] v2 = createVertex(indices[(index * 3) + 1]); 
     float[] v3 = createVertex(indices[(index * 3) + 2]); 
     tri = new Triangle(v1, v2, v3); 
    // } 
     return tri; 

} 

public int getNumberOfTriangles(){ 
    return indices.length/3; 
} 

public boolean checkCollision(Ray r, OpenGLRenderer renderer){ 

    boolean isCollide = false; 

    int i = 0; 
    while(i < getNumberOfTriangles() && !isCollide){ 
     float[] I = new float[3]; 
     if(Shapes.intersectRayAndTriangle(r, transTris[i], I) > 0){ 
      isCollide = true; 
     } 

     i++; 
    } 


    return isCollide; 
} 

public void translate(float[] trans){ 
    for(int i = 0; i < getNumberOfTriangles(); i++){ 
     transTris[i].setV1(Vector.addition(transTris[i].getV1(), trans)); 
     transTris[i].setV2(Vector.addition(transTris[i].getV2(), trans)); 
     transTris[i].setV3(Vector.addition(transTris[i].getV3(), trans)); 
    } 
} 

public void scale(float[] scale){ 
    for(int i = 0; i < getNumberOfTriangles(); i++){ 
     transTris[i].setV1(Vector.scalePoint(transTris[i].getV1(), scale)); 
     transTris[i].setV2(Vector.scalePoint(transTris[i].getV2(), scale)); 
     transTris[i].setV3(Vector.scalePoint(transTris[i].getV3(), scale)); 
    } 
} 

public void resetTransfomations(){ 
    for(int i = 0; i < getNumberOfTriangles(); i++){ 
     transTris[i].setV1(normTris[i].getV1().clone()); 
     transTris[i].setV2(normTris[i].getV2().clone()); 
     transTris[i].setV3(normTris[i].getV3().clone()); 
    } 
} 

public Cube() 
{ 
    Buffer[] buffers = super.getBuffers(vertices, colors, indices); 
    mVertexBuffer = (FloatBuffer) buffers[0]; 
    mColorBuffer = (FloatBuffer) buffers[1]; 
    mIndexBuffer = (ByteBuffer) buffers[2]; 
} 

public Cube(float[] vertices, float[] colors, byte[] indices) 
{ 
    if(vertices != null) { 
     this.vertices = vertices; 
    } 
    if(colors != null) { 
     this.colors = colors; 
    } 
    if(indices != null) { 
     this.indices = indices; 
    } 
    Buffer[] buffers = getBuffers(this.vertices, this.colors, this.indices); 
    mVertexBuffer = (FloatBuffer) buffers[0]; 
    mColorBuffer = (FloatBuffer) buffers[1]; 
    mIndexBuffer = (ByteBuffer) buffers[2]; 

    for(int i = 0; i < getNumberOfTriangles(); i++){ 
     normTris[i] = getTriangle(i); 
     transTris[i] = getTriangle(i); 
    } 
} 

public void draw(GL10 gl) 
{ 
    gl.glFrontFace(GL10.GL_CW); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer); 
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 

    // draw all 36 triangles 
    gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, mIndexBuffer); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
} 
} 

답변

3

이 경우 Listener를 사용하면 작동하지 않습니다.

예를 들어 onTouchListener을 살펴 보겠습니다. 이것은 기본적으로 onTouch() 메소드 하나만을 제공하는 인터페이스입니다. 이제 안 드 로이드가 터치 입력을 처리하고 대상보기를 터치하면 청취자의 onTouch()를 호출하여 청취자가 터치에 대해 알 수 있음을 알게됩니다.

OpenGL을 사용할 때 아무도 OpenGL 표면 안의 터치 입력을 처리하지 못하는 문제가 있습니다. 너 혼자해야 해. 그래서 청취자에게 전화 할 사람이 없습니다.

왜? gl 표면 내부에서 렌더링하는 것은 당신에게 달린 것입니다. 실제 지오메트리가 무엇인지 알기 때문에 선택한 오브젝트를 결정할 수있는 유일한 사람이됩니다. - 뷰어 장면에 감동 지점의 눈을 통해 광선을 쏴 명중 된 개체를 확인

  • 레이 촬영 :

    당신은 기본적으로 선택을 할 수있는 두 가지 옵션이 있습니다.

  • 색상 피킹 - 개체에 ID를 지정하고 id를 색상으로 인코딩하고이 색상으로 장면을 렌더링합니다. 마침내 터치 위치에서 색상을 확인하고 색상을 디코딩하여 객체의 ID를 가져옵니다.

대부분의 응용 프로그램에서 두 번째 솔루션을 선호합니다.