2016-02-22 5 views
1

Привет, я новичок в OpenGL, и я пытаюсь найти способ нарисовать объект, такой как треугольник, идентификатор какого-либо типа. Таким образом, я могу вызвать Id и дать ему движение, а также события ad touch.Объект вызова 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 (// Do Something, когда этот объект нажата)

Любая помощь очень ценится. Заранее спасибо :)

ответ

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 или может иметь начальную точку и вектор (направление линии) ... На каждом кадре вы должны проверить если этот луч создан, если это так, вам нужно использовать некоторую математику, чтобы проверить, пересекает ли эта линия ваш треугольник (не забудьте применить поворот и перевод треугольника в его вершины, прежде чем проверять пересечение с лучом). когда рамка была нарисована, не забудьте удалить лучи

+0

Любая вероятность того, что вы дадите пример для нажатия на массив? Прямо сейчас я нашел способ использовать подбор цветов, но даже когда вся трасса зеленая, как-то значения цвета не складываются.Не знаю, почему – L1ghtk3ira

+0

Если бы вы могли как-то помочь с этим или с выбором цвета id любить отмечать этот ответ правильно, так как ut отвечает на обе части вопроса :) – L1ghtk3ira

+0

@ L1ghtk3ira http://www.lighthouse3d.com/tutorials/opengl-selection- руководство/ –