使用GLES20旋转/移动相机

时间:2013-11-05 09:14:47

标签: android opengl-es opengl-es-2.0

我正在使用GLES20创建一个Android应用程序。

我需要绘制一些2d多边形,然后我需要使用VOB旋转和移动场景。

我使用 GLES20.glDrawArrays()写多边形,没关系。

但是如何在不重绘多边形的情况下向左/向右/向上/向下移动并旋转相机?

UPD

GLES1有gluLookAt()。但GLES2没有它。

1 个答案:

答案 0 :(得分:0)

实现自己看起来很简单。您可以使用以下伪代码作为起点:

void LookAt(float r_t_matrix[4][4], Vector3f v_eye, Vector3f v_target, Vector3f v_up)
{
    Vector3f v_dir(v_target - v_eye);
    v_dir.Normalize();
    Vector3f v_right(v_dir.v_Cross(v_up));
    v_right.Normalize();
    v_up = v_right.v_Cross(v_dir);
    // calculate complete perpendicular coordinate frame

    for(int i = 0; i < 3; ++ i)
        r_t_matrix[i][0] = v_right[i];
    for(int i = 0; i < 3; ++ i)
        r_t_matrix[i][1] = v_up[i];
    for(int i = 0; i < 3; ++ i)
    r_t_matrix[i][2] = -v_dir[i];
    for(int i = 0; i < 3; ++ i) {
    r_t_matrix[i][3] = 0;
    r_t_matrix[3][i] = 0;
    }
    r_t_matrix[3][3] = 1;
    // copy it to matrix

    r_t_matrix.Translate(-v_eye.x, -v_eye.y, -v_eye.z);
    // apply translation
}

或者,您可以使用实现此功能的库,例如glm。

在Java中,您可以使用android.opengl.matrix.setLookAtM。这将使用如下:

float[] matrix = new float[16];
setLookAtM(matrix, 0, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);

在眼睛是摄像机位置的情况下,中心是目标位置,向上是向上矢量(通常(0,1,0)会这样做)。然后,您可以使用此矩阵并使用它绘制场景。您可能希望将其与模型矩阵和投影相乘(如果不是正交)。