我正在使用GLES20创建一个Android应用程序。
我需要绘制一些2d多边形,然后我需要使用VOB旋转和移动场景。
我使用 GLES20.glDrawArrays()写多边形,没关系。
但是如何在不重绘多边形的情况下向左/向右/向上/向下移动并旋转相机?
UPD
GLES1有gluLookAt()。但GLES2没有它。
答案 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)会这样做)。然后,您可以使用此矩阵并使用它绘制场景。您可能希望将其与模型矩阵和投影相乘(如果不是正交)。