2016-02-22 29 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-教程/ –