2016-05-02 55 views
1

我似乎無法讓我的對象在y軸上移動,它只停留在當前位置。y軸上的OpenGL Android翻譯對象2D

以我目前的知識,我知道用

Matrix.translateM() 

但是似乎它不工作,我不知道我錯過了什麼步驟。任何幫助是極大的讚賞。

在我的渲染器的OnDrawFrame方法如下:

@Override 
public void onDrawFrame(GL10 glUnused) { 
    // Clear the rendering surface. 
    glClear(GL_COLOR_BUFFER_BIT); 
    // Apply transformation, start with translation 

    Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
    // Calculate the projection and view transformation 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 
    // Create a rotation transformation for the triangle 
    long time = SystemClock.uptimeMillis() % 4000L; 
    float mAngle = 0.090f * ((int) time); 
    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); 



    Matrix.orthoM(mMatrix, 0, -1, 1, -1, 1, -1, 1); 

    // Combine Rotation and Translation matrices 
    mTempMatrix = mModelMatrix.clone(); 
    Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0); 

    // Combine the model matrix with the projection and camera view 
    mTempMatrix = mMVPMatrix.clone(); 
    Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0); 
    Matrix.orthoM(mMatrix, 0, -1, 1, -1, 1, -1, 1); 
    mCircle.draw(mMatrix); 

    Matrix.setIdentityM(mCircle.mModelMatrix, 0); 
    Matrix.translateM(mCircle.mModelMatrix, 0, 50.5f, 5.7f, 5.7f); 

    //mTriangle.draw(mMatrix); 

} 

我Circle類是如下

public class Circle{ 
public float[] mModelMatrix = new float[16]; 
public FloatBuffer mVertexBuffer; 
public float vertices[] = new float[364 * 3]; 
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f }; 
public float ofset = 0; 
private final String vertexShaderCode = 
     // This matrix member variable provides a hook to manipulate 
     // the coordinates of the objects that use this vertex shader 
     "uniform mat4 uMVPMatrix;" + 
       "attribute vec4 vPosition;" + 
       "void main() {" + 
       // the matrix must be included as a modifier of gl_Position 
       // Note that the uMVPMatrix factor *must be first* in order 
       // for the matrix multiplication product to be correct. 
       " gl_Position = uMVPMatrix * vPosition;" + 
       "}"; 

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

private final FloatBuffer vertexBuffer; 
private final int mProgram; 
private int mPositionHandle; 
private int mColorHandle; 
private int mMVPMatrixHandle; 

// 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 
}; 
private final int vertexCount = triangleCoords.length/COORDS_PER_VERTEX; 
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex 

    public Circle(){ 
     vertices[0] = 0; 
     vertices[1] = 0; 
     vertices[2] = 0; 

     for(int i =1; i < 364; i++){ 
      vertices[(i * 3)+ 0] = (float) (0.1 * Math.cos((3.14/180) * (float)i)+ofset); 

      vertices[(i * 3)+ 1] = (float) (0.059 * Math.sin((3.14/180) * (float)i)+ofset); 
      vertices[(i * 3)+ 2] = 0; 
     } 
     // initialize vertex byte buffer for shape coordinates 
     ByteBuffer bb = ByteBuffer.allocateDirect(
       // (number of coordinate values * 4 bytes per float) 
       vertices.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(vertices); 
     // set the buffer to read the first coordinate 
     vertexBuffer.position(0); 

     // prepare shaders and OpenGL program 
     int vertexShader = ImpulseRushRenderer.loadShader(
       GLES20.GL_VERTEX_SHADER, vertexShaderCode); 
     int fragmentShader = ImpulseRushRenderer.loadShader(
       GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); 

     mProgram = GLES20.glCreateProgram();    // create empty OpenGL Program 
     GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program 
     GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program 
     GLES20.glLinkProgram(mProgram);     // create OpenGL program executables 
    } 

public void draw(float[] mvpMatrix) { 
    // Add program to OpenGL environment 
    GLES20.glUseProgram(mProgram); 

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

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

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

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

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

    // get handle to shape's transformation matrix 
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 


    // Apply the projection and view transformation 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 

    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_FAN, 0, 364); 

    // Disable vertex array 
    GLES20.glDisableVertexAttribArray(mPositionHandle); 

} 

}

我似乎無法找到我一步一步爲了讓翻譯工作,所以我假設我錯過了一些重要的東西。我已經得到了旋轉工作,但我沒有運氣試圖讓翻譯工作。

+0

您正在使用根本未使用的矩陣上的翻譯。或者在繪製方法中mCircle.mModelMatrix和mModelMatrix之間有一些關係嗎? –

+0

不,我在兩者中都創建了1,我對使用mModelMatrix進行翻譯有點朦朧。 – L1ghtk3ira

+0

所以,如果你正在翻譯的矩陣沒有被使用,你不能期望在翻譯它時看到任何改變。 –

回答

1

您需要與您的矩陣保持一致,並知道何時使用哪個。在你發佈的代碼中,你實際上翻譯了根本沒有使用的矩陣,所以沒有做任何改變。

通常使用MVP矩陣系統,其意味着3個矩陣的產物,它們是模型,視圖和投影。其中每個代表繪製對象轉換的一部分,直到您進行一些優化,您最好在應用程序和着色器中全部使用它們中的三個。對於某些系統(如照明),無論如何您都需要將它們分開以供着色器使用。

所以模型矩陣就是表示場景中模型的矩陣。應該使用一個身份,因此它被放置在沒有旋轉或縮放的中心。然後修改它以更改場景中的模型位置,如翻譯它。每個模型都有自己的模型矩陣(而不是投影和視圖)是有意義的。

視圖矩陣表示場景中的用戶或相機位置。在大多數情況下,您將使用查看過程來給出位置,您正在尋找的位置和向上向量。在大多數情況下,您只能使用其中一種,但在分屏等情況下可能會更多。

投影矩陣用於定義場景的座標系和投影。這裏最常見的是使用orthofrustum。它們看起來非常相似,基本上一個用於2D,另一個用於3D。該矩陣與「視圖」矩陣緊密結合使用。

所以,如果你使用它們全部3個,那麼它變得非常簡單。一旦生成視圖或視圖框架更改,您將需要設置投影矩陣。當您想要環視或圍繞場景移動時,視矩陣必須改變。模型矩陣應該爲每個繪圖調用設置。確保所有這些操作都至少設置爲從一開始就進行身份驗證,否則這些操作都不會對它們起作用。

我希望這會清除一些東西。

+0

我還是有點困惑。我在圈子類中使用了mmatrix。所以當我使用mcircle.mModelMatrix是不是使用它?在渲染器類的方法繪製我使用它們,並告訴它到x和y座標。所以我有點困惑,它的實施方式仍然有什麼問題?從你的解釋我知道需要有對象的位置座標。 – L1ghtk3ira

+0

不,這行:「GLES20.glUniformMatrix4fv(mMVPMatrixHandle,1,false,mvpMatrix,0);」是設置矩陣並使用接收到的mvpMatrix作爲方法參數並且不被圓所保持的實際矩陣修改的矩陣。 –

+0

好的。所以我會使用mCirvle.mModelMatrix。所以現在是這個圈子。所以現在要移動它,我需要在應用翻譯之前將mModelMatrix設置爲圓圈當前位置?再次感謝 – L1ghtk3ira