0

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

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

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

但是我怎样才能在不重绘多边形的情况下左/右/上/下移动和旋转相机?

UPD

GLES1 有 gluLookAt()。但 GLES2 没有。

4

1 回答 1

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);

eye 是相机位置,center 是目标位置,up 是向上向量(通常 (0, 1, 0) 可以)。然后,您获取此矩阵并用它绘制场景。您可能希望将其与模型矩阵和投影相乘(如果不是正交的)。

于 2013-11-05T09:33:23.787 回答