2016-12-23 5 views
1

私は、三角形と円で三角形を透明にし、円をy軸上で動かす必要があるプログラムを作成しようとしています。私は円と三角を作ることができますが、円を動かす方法はわかりません。そこで私は正方形を作って、それをy軸上で動かすように設定しました。私の質問は、動きのあるサークルを作る最良の方法は何ですか、サークルのように四角形にテクスチャを追加することを考えましたが、三角形にもテクスチャが適用されます。どんな助けでもそんなに意味があります。ありがとう!ここでy軸上を移動する単純な円

は私のコードです:

public class MyGLRender implements GLSurfaceView.Renderer{ 
    Context con; 
    private float[] mModelMatrix = new float[16]; 

private float[] mViewMatrix = new float[16]; 

private float[] projectionMatrix = new float[16]; 

private float[] mVPMatrix = new float[16]; 





private final FloatBuffer squareVert; 
private final FloatBuffer mColor; 
private FloatBuffer triangleVert; 
private final FloatBuffer tColor; 

private int mvpMatrixHandle; 


private int positionHandle; 


private int colorHandle; 




ShortBuffer indexBuffer = null; 

short[] indeces={ 
     0,1,2, 
     0,3,2 

}; 

float i; 
public int smer; 

public MyGLRender(Context con) 
{ 
    this.con=con; 
    i=0; 
    smer=1; 




    final float[] square={ 
      0.0f, 1.0f, 0.0f, 
      0.0f,0.0f,0.0f, 
      1.0f,0.0f,0.0f, 
      1.0f,1.0f,0.0f, 


    }; 

    final float[] triangle={ 
      0.0f, 0.5f, 0.0f, 
      -0.5f, -0.5f, 0.0f, 
      0.5f, -0.5f, 0.0f 
    }; 


    final float[] colors = {1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1 
    }; 

    final float[] colorsTr = {1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1, 
      1,1,1 

    }; 

    squareVert = ByteBuffer.allocateDirect(square.length * 4) 
      .order(ByteOrder.nativeOrder()).asFloatBuffer(); 

    squareVert.put(square).position(0); 
    indexBuffer = ByteBuffer.allocateDirect(indeces.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer(); 
    indexBuffer.put(indeces).position(0); 

    mColor = ByteBuffer.allocateDirect(colors.length * 4) 
      .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    mColor.put(colors).position(0); 


    triangleVert = ByteBuffer.allocateDirect(square.length * 4) 
      .order(ByteOrder.nativeOrder()).asFloatBuffer(); 

    triangleVert.put(triangle).position(0); 
    indexBuffer = ByteBuffer.allocateDirect(indeces.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer(); 
    indexBuffer.put(indeces).position(0); 

    tColor = ByteBuffer.allocateDirect(colors.length * 4) 
      .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    tColor.put(colorsTr).position(0); 
} 

@Override 
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
{ 

    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 


    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5, 0, 0, 0, 0, 1, 0); 


    final String vertexShader = 
      "uniform mat4 un_MVPMatrix;  \n" 
        + "attribute vec4 attribute_Position;  \n" 
        + "attribute vec4 attribute_Color;  \n" 

        + "varying vec4 var_Color;   \n" 



        + "void main()      \n" 
        + "{         \n" 
        + " var_Color = attribute_Color;   \n" 


        + " gl_Position = un_MVPMatrix  \n" 
        + "    * attribute_Position; \n" 

        + "}         \n"; 



    final String fragmentShader = 
      "precision mediump float;  \n" 

        + "varying vec4 var_Color;   \n" 



        + "void main()     \n" 
        + "{        \n" 

        + 
        "  gl_FragColor = (length(gl_FragCoord.xy) < 0.5) \n" + 
        "   ? vec4(1.0, 1.0, 1.0, 1.0)\n" + 
        "   : vec4(0.5, 0.5, 0.5, 0.5); \n" 

        + "}        \n"; 


    int vertexS = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); 

    if (vertexS != 0) 
    { 

     GLES20.glShaderSource(vertexS, vertexShader); 


     GLES20.glCompileShader(vertexS); 


     final int[] compile_Status = new int[1]; 
     GLES20.glGetShaderiv(vertexS, GLES20.GL_COMPILE_STATUS, compile_Status, 0); 


    } 


    if (vertexS == 0) 
    { 
     try { 
      throw new Exception("Vertex shader is not created."); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    int fragmentS = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); 
    if (fragmentS != 0) 
    { 

     GLES20.glShaderSource(fragmentS, fragmentShader); 


     GLES20.glCompileShader(fragmentS); 


     final int[] compileStatus = new int[1]; 
     GLES20.glGetShaderiv(fragmentS, GLES20.GL_COMPILE_STATUS, compileStatus, 0); 


    } 


    if (fragmentS == 0) 
    { 
     try { 
      throw new Exception("Fragment shader is not created."); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    int program = GLES20.glCreateProgram(); 

    if (program != 0) 
    { 

     GLES20.glAttachShader(program, vertexS); 


     GLES20.glAttachShader(program, fragmentS); 


     GLES20.glBindAttribLocation(program, 0, "attribute_Position"); 
     GLES20.glBindAttribLocation(program, 1, "attribute_Color"); 


     GLES20.glLinkProgram(program); 


     final int[] linkStatus = new int[1]; 
     GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); 

    } 

    if (program == 0) 
    { 
     try { 
      throw new Exception("Program error"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    mvpMatrixHandle = GLES20.glGetUniformLocation(program, "un_MVPMatrix"); 
    positionHandle = GLES20.glGetAttribLocation(program, "attribute_Position"); 
    colorHandle = GLES20.glGetAttribLocation(program, "attribute_Color"); 


    GLES20.glUseProgram(program); 
} 


public void onSurfaceChanged(GL10 glUnused, int width, int height) 
{ 

    GLES20.glViewport(0, 0, width, height); 



    final float ratio = (float) width/height; 
    final float left = -ratio; 
    final float right = ratio; 
    final float bottom = -1.0f; 
    final float top = 1.0f; 
    final float near = 1.0f; 
    final float far = 10.0f; 


    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far); 

} 
@Override 
public void onDrawFrame(GL10 glUnused) { 
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

    if (i > 1) { 
     smer = -1; 
    } 
    if (i < -1) { 
     smer = 1; 

    } 
    i += 0.05 * smer; 

    Matrix.setIdentityM(mModelMatrix, 0); 
    Matrix.translateM(mModelMatrix, 0, 0, i, 0.0f); 

    drawSqare(squareVert, indexBuffer); 

    Matrix.setIdentityM(mModelMatrix, 0); 


    Matrix.translateM(mModelMatrix,0, -1.5f, 0.0f, 0.0f); 
    drawSTriangle(triangleVert, indexBuffer); 

    GLES20.glDisable(GLES20.GL_CULL_FACE); 


    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 



    GLES20.glEnable(GLES20.GL_BLEND); 


    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE); 


    Matrix.setIdentityM(mModelMatrix, 0); 


    Matrix.translateM(mModelMatrix, 0, -1.0f, 0.0f, -0.0f); 


    drawSTriangle(triangleVert, indexBuffer); 


    GLES20.glDisable(GLES20.GL_BLEND); 

} 


private void drawSqare(final FloatBuffer aTriangleBuffer,ShortBuffer sb) 
{ 


    aTriangleBuffer.position(0); 
    GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, aTriangleBuffer); 

    GLES20.glEnableVertexAttribArray(positionHandle); 


    mColor.position(0); 
    GLES20.glVertexAttribPointer(colorHandle, 3, GLES20.GL_FLOAT, false, 0, mColor); 

    GLES20.glEnableVertexAttribArray(colorHandle); 


    Matrix.multiplyMM(mVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 


    Matrix.multiplyMM(mVPMatrix, 0, projectionMatrix, 0, mVPMatrix, 0); 

    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mVPMatrix, 0); 

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indeces.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer); 

} 

private void drawSTriangle(final FloatBuffer fbb,ShortBuffer sbb) 
{ 


    fbb.position(0); 


    GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, fbb); 
    GLES20.glEnableVertexAttribArray(positionHandle); 


    tColor.position(0); 
    GLES20.glVertexAttribPointer(colorHandle, 3, GLES20.GL_FLOAT, false, 
      0, tColor); 

    GLES20.glEnableVertexAttribArray(colorHandle); 



    Matrix.multiplyMM(mVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 



    Matrix.multiplyMM(mVPMatrix, 0, projectionMatrix, 0, mVPMatrix, 0); 

    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mVPMatrix, 0); 
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indeces.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer); 
} 

} 

答えて

0

あなたがここにadding Rotation or motion to view.

ためのチェックこれは、Android http://developer.android.com/shareables/training/OpenGLES.zip

+0

何からのサンプルであるOpenGL

のためのAndroidが提供するドキュメントに従うことができますあなたは円のためにarを取得していますか? –

+0

私は三角形のファンを使って円を描いていますが、その上にどのように動きを実装するかはわかりません。動いている広場からコードを修正しようとすると、円を動かす代わりに大きな正方形が1つしかありません。 –

関連する問題