5

作为 android 和 openGL 2.0 es 的初学者,我正在测试简单的东西,看看它是如何进行的。

我在http://developer.android.com/training/graphics/opengl/touch.html下载了示例。

我更改了代码以检查是否可以为相机围绕 (0,0,0) 点(正方形中心)的旋转设置动画。

所以我这样做了:

public void onDrawFrame(GL10 unused) {
    // Draw background color
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // Set the camera position (View matrix)
    long time = SystemClock.uptimeMillis() % 4000L;
    float angle = ((float) (2*Math.PI)/ (float) 4000) * ((int) time);
    Matrix.setLookAtM(mVMatrix, 0, (float) (3*Math.sin(angle)), 0, (float) (3.0f*Math.cos(angle)),     0 ,0, 0,     0f, 1.0f, 0.0f);

    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

    // Draw square
    mSquare.draw(mMVPMatrix);
}

我希望相机总是看向正方形的中心((0,0,0)点),但事实并非如此。相机确实在围绕正方形旋转,但正方形并没有停留在屏幕的中心......而是沿着 X 轴移动......: 在此处输入图像描述 在此处输入图像描述

我还期望如果我们给 eyeX 和 eyeY 赋予与 centerX 和 centerY 相同的值,就像这样:

Matrix.setLookAtM(mVMatrix, 0, 1, 1, -3,     1 ,1, 0,     0f, 1.0f, 0.0f);

正方形将保持其形状(我的意思是,您的视野将被拖动,但沿着与正方形平行的平面),但这也不是发生的情况:

在此处输入图像描述

这是我的投影矩阵:

float ratio = (float) width / height;

// this projection matrix is applied to object coordinates
// in the onDrawFrame() method
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7);

这里发生了什么?

4

1 回答 1

10

查看您下载的示例的源代码,我可以看到您遇到这个问题的原因,它与矩阵乘法的顺序有关。

通常在 OpenGL 源代码中,您会看到这样设置的矩阵

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex

但是,在您下载的源示例程序中,它们的着色器设置如下:

" gl_Position = vPosition * uMVPMatrix;"

与矩阵另一侧的位置。您可以通过这种方式使用 OpenGL,但它要求您反转矩阵乘法的 lhs/rhs。

长话短说,在您的情况下,您应该将着色器更改为:

" gl_Position = uMVPMatrix * vPosition;"

然后我相信你会得到预期的行为。

于 2012-08-12T20:11:48.657 回答