Android:OpenGL如何移动对象?

时间:2017-08-07 09:37:10

标签: android opengl-es matrix-multiplication

我试图移动object输出不正确。 X向相反方向移动,Y比原始坐标更远。

这是我的代码,用于取出规范化的x和y

@Override
public boolean onTouch(View v, MotionEvent event) {
    requestRender();
    float normalisedX=(event.getX()/getWidth())*2.0f -1.0f;
    float normalisedY=(event.getY()/getHeight())*-2.0f+1.0f;
    mRender.setXY(normalisedX, normalisedY);
    return true;
}

Matrix用于渲染以移动对象。这是代码

@Override
public void onDrawFrame(GL10 gl) {
    glClear(GL_COLOR_BUFFER_BIT);

    float[] scratch = new float[16];

    setLookAtM(mViewMatrix, 0, 0, 0, -2, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);


    setIdentityM(mMoveMatrix, 0);
    translateM(mMoveMatrix, 0, x, y, 0);

    multiplyMM(scratch, 0, mMVPMatrix, 0, mMoveMatrix, 0);

    table.draw(mMVPMatrix, tableTextureObj);
    userMallet.draw(scratch, userMalletTextureObj);
  }

以下是要绘制的目标代码: -

public void draw(float[] matrix, int texture)
{
    if (ShaderProgram.validateProgram(mProgram))
    {
        glUseProgram(mProgram);

        aPositionHandle=glGetAttribLocation(mProgram, "a_Position");
        uMatrixHandle=glGetUniformLocation(mProgram, "u_Matrix");
        aTextureCoordinateHandle=glGetAttribLocation(mProgram, "a_TextureCoordinates");
        //shader
        vColorHandle=glGetUniformLocation(mProgram, "v_Color");

        vertexBuffer.position(0);
        glVertexAttribPointer(aPositionHandle, COORDS_PER_VERTEX, GL_FLOAT, false, STRIDE, vertexBuffer);
        glEnableVertexAttribArray(aPositionHandle);
        vertexBuffer.position(0);

        vertexBuffer.position(COORDS_PER_VERTEX);
        glVertexAttribPointer(aTextureCoordinateHandle, TEXTURE_COORDINATES_COMPONENT_COUNT, GL_FLOAT, false, STRIDE, vertexBuffer);
        glEnableVertexAttribArray(aTextureCoordinateHandle);
        vertexBuffer.position(0);

        uTexureUnitHandle=glGetUniformLocation(mProgram, "u_TextureUnit");

        glUniformMatrix4fv(uMatrixHandle, 1, false, matrix, 0);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texture);
        glUniform1i(uTexureUnitHandle, 0);


        glDrawArrays(GL_TRIANGLE_FAN, 0, outerVertexCount);
    }
}

请告诉我我做错了所以我可以解决这个问题。

0 个答案:

没有答案