2016-02-22 30 views
1

嗨,我是OpenGL的新手,我試圖找到一種方法來爲繪製對象(如三角形提供某種類型的ID)。通過這種方式,我可以調用Id併爲其提供動態以及廣告觸摸事件。OpenGL ES 3.0通過引用調用對象添加引力和OnCLick事件

我不確定這是否是正確的方式,或者有更好的方法來做到這一點。我有物品,但不知道如何打電話給他們,並給他們動議或onClick事件。然而,我環顧了很多方式似乎已經過時,並且不工作或者鏈接現在已經死了。

我有一個渲染這樣:

public class MyGLRenderer implements GLSurfaceView.Renderer { 
    private Triangle mTriangle; 

    // Called once to set up the view's opengl es environment 
    public void onSurfaceCreated(GL10 unused, EGLConfig config){ 

     //Set the background frame color 
     GLES30.glClearColor(255.0f,255.0f,255.0f,0.0f); 

     mTriangle = new Triangle(); 
    } 

    // Called for each redraw of the view 
    public void onDrawFrame(GL10 gl){ 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
     //Redraw background color 
     GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); 

     mTriangle.draw(); 
    } 

    // Called if the geometry of the view changes (example is when the screen orientation changes from landscape to portrait 
    public void onSurfaceChanged(GL10 unused, int width, int height){ 
     // Called if the geometry of the viewport changes 
     GLES30.glViewport(0, 0, width, height); 
    } 

    public static int loadShader(int type, String shaderCode){ 

     // create a vertex shader type (GLES30.GL_VERTEX_SHADER) 
     // or a fragment shader type (GLES30.GL_FRAGMENT_SHADER) 
     int shader = GLES30.glCreateShader(type); 

     // add the source code to the shader and compile it 
     GLES30.glShaderSource(shader, shaderCode); 
     GLES30.glCompileShader(shader); 

     return shader; 
    } 
} 

表面觀爲這樣的:

public class MyGLSurfaceView extends GLSurfaceView { 

    private final MyGLRenderer mRenderer; 

    public MyGLSurfaceView(Context context, AttributeSet attrs){ 
     super(context, attrs); 

     //Create an OpenGl 3.0 context 
     setEGLContextClientVersion(3); 

     mRenderer = new MyGLRenderer(); 

     //Set the Renderer for drawing on the GLSurfaceView 
     setRenderer(mRenderer); 

     //Render the view only when there is a change in the drawing data 
     setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    } 
} 

和三角形類這樣:

public class Triangle { 

    private FloatBuffer vertexBuffer; 

    private final String vertexShaderCode = 
      "attribute vec4 vPosition;" + 
        "void main() {" + 
        " gl_Position = vPosition;" + 
        "}"; 

    private final String fragmentShaderCode = 
      "precision mediump float;" + 
        "uniform vec4 vColor;" + 
        "void main() {" + 
        " gl_FragColor = vColor;" + 
        "}"; 

    private final int mProgram; 

    // number of coordinates per vertex in this array 
    static final int COORDS_PER_VERTEX = 3; 
    static float triangleCoords[] = { // in counterclockwise order: 
      0.0f, 0.622008459f, 0.0f, // top 
      -0.5f, -0.311004243f, 0.0f, // bottom left 
      0.5f, -0.311004243f, 0.0f // bottom right 
    }; 

    // Set color with red, green, blue and alpha (opacity) values 
    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f }; 

    public Triangle() { 
     // initialize vertex byte buffer for shape coordinates 
     ByteBuffer bb = ByteBuffer.allocateDirect(
       // (number of coordinate values * 4 bytes per float) 
       triangleCoords.length * 4); 
     // use the device hardware's native byte order 
     bb.order(ByteOrder.nativeOrder()); 

     // create a floating point buffer from the ByteBuffer 
     vertexBuffer = bb.asFloatBuffer(); 
     // add the coordinates to the FloatBuffer 
     vertexBuffer.put(triangleCoords); 
     // set the buffer to read the first coordinate 
     vertexBuffer.position(0); 

     int vertexShader = MyGLRenderer.loadShader(GLES30.GL_VERTEX_SHADER, 
       vertexShaderCode); 
     int fragmentShader = MyGLRenderer.loadShader(GLES30.GL_FRAGMENT_SHADER, 
       fragmentShaderCode); 

     // create empty OpenGL ES Program 
     mProgram = GLES30.glCreateProgram(); 

     // add the vertex shader to program 
     GLES30.glAttachShader(mProgram, vertexShader); 

     // add the fragment shader to program 
     GLES30.glAttachShader(mProgram, fragmentShader); 

     // creates OpenGL ES program executables 
     GLES30.glLinkProgram(mProgram); 
    } 

    private int mPositionHandle; 
    private int mColorHandle; 

    private final int vertexCount = triangleCoords.length/COORDS_PER_VERTEX; 
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex 

    public void draw() { 
     // Add program to OpenGL ES environment 
     GLES30.glUseProgram(mProgram); 

     // get handle to vertex shader's vPosition member 
     mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition"); 

     // Enable a handle to the triangle vertices 
     GLES30.glEnableVertexAttribArray(mPositionHandle); 

     // Prepare the triangle coordinate data 
     GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, 
       GLES30.GL_FLOAT, false, 
       vertexStride, vertexBuffer); 

     // get handle to fragment shader's vColor member 
     mColorHandle = GLES30.glGetUniformLocation(mProgram, "vColor"); 

     // Set color for drawing the triangle 
     GLES30.glUniform4fv(mColorHandle, 1, color, 0); 

     // Draw the triangle 
     GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vertexCount); 

     // Disable vertex array 
     GLES30.glDisableVertexAttribArray(mPositionHandle); 
    } 

我想事做如下:

drawnTriangleObject_ID.Add重心下移或向上

drawnTriangleObject_ID.OnClick(//做一些點擊該對象時)

任何幫助是極大的讚賞。預先感謝您:)

回答

0

在你的三角形類,添加定位數據

float x = 0.0f; 
float y = 0.0f; 
float z = 0.0f; 

,並繪製三角形時,你必須申請翻譯

Matrix.setIdentityM(modelmatrix, 0); 
Matrix.translateM(modelmatrix, 0, x, y, z); 

然後乘模型矩陣查看矩陣

Matrix.multiplyMM(resultmodelview, 0, viewmatrix, 0, modelmatrix, 0); 

然後將結果乘以投影矩陣

Matrix.multiplyMM(resultresultprojection, 0, ProjectionMatrix, 0, resultmodelview, 0); 

併發布

World.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, resultresultprojection, 0); 

這一切都假設你已經建立了視錐和投影和視圖矩陣(其中,如果你看到的三角形,可已經完成)..

祝你好運,玩得開心!

至於「OnClick」,它有點棘手: - 點擊屏幕後,從XY空間(屏幕)投射一個光線到3D世界。射線(線)將有2個座標,一個以X,Y,Z形式出現的起點和終點,或者可能有一個起點和一個矢量(線的方向)......在每一幀你必須檢查如果創建了該射線,那麼需要使用一些Math來檢查該線是否與三角形相交(不要忘記在檢查與Ray的交點之前將三角形的旋轉和平移應用到它的頂點)。當框架被繪製時,不要忘記刪除光線

+0

你有沒有可能給出一個使用數組單擊的例子?現在我找到了一種使用顏色選擇的方法,但即使整個traingle是綠色,顏色值也不會相加。不知道爲什麼 – L1ghtk3ira

+0

如果你能以某種方式幫助那個或顏色選擇id愛標記這個答案正確的,因爲ut回答這個問題的兩個部分:) – L1ghtk3ira

+0

@ L1ghtk3ira http://www.lighthouse3d.com/tutorials/opengl-selection-教程/ –