我正在使用 GLES20 创建一个 android 应用程序。
我需要绘制一些二维多边形,然后我需要使用 VOB 旋转和移动场景。
我使用GLES20.glDrawArrays()编写多边形,没关系。
但是我怎样才能在不重绘多边形的情况下左/右/上/下移动和旋转相机?
UPD
GLES1 有 gluLookAt()。但 GLES2 没有。
我正在使用 GLES20 创建一个 android 应用程序。
我需要绘制一些二维多边形,然后我需要使用 VOB 旋转和移动场景。
我使用GLES20.glDrawArrays()编写多边形,没关系。
但是我怎样才能在不重绘多边形的情况下左/右/上/下移动和旋转相机?
UPD
GLES1 有 gluLookAt()。但 GLES2 没有。
实现自己看是很简单的。您可以使用以下伪代码作为起点:
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) 可以)。然后,您获取此矩阵并用它绘制场景。您可能希望将其与模型矩阵和投影相乘(如果不是正交的)。