【发布时间】:2014-01-23 13:15:19
【问题描述】:
我正在尝试处理一些 OpenGL 的东西。我现在得到的是一个视口,我在其中使用 GL_LINES 绘制了一些假想的“边界”。看起来是这样的,setLookAt 设置如下:
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0);
我的截锥体已设置:Matrix.frustumM(mProjectionMatrix, 0, -2, 2, -2, 2, 1, 11);,所以我位于“立方体”内的某个位置。
现在我想要实现的是让用户环顾四周。我正在捕获 onTouchEvents,将 x/y 方向的任何运动传递给渲染器。我接下来要做的是旋转从触摸侦听器接收到的特定角度绘制的所有线条。
然后看起来像这样:
所以立方体不是围绕观察者或眼睛中心旋转,而是围绕某个我不知道它来自哪里的点旋转。
我的问题是:如何围绕查看者的中心/位置旋转对象?我是否必须旋转来自 setLookAtM 的mViewMatrix?如果是,只需使用Matrix.setRotateM(mViewMatrix, ...)?
Line的绘制方法如下:
public void draw(float[] mViewMatrix, float[] mProjectionMatrix) {
Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
GLES20.glUseProgram(iProgId);
lineBuffer.position(0);
GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 0, lineBuffer);
GLES20.glEnableVertexAttribArray(iPosition);
colorBuffer.position(0);
GLES20.glVertexAttribPointer(iColor, 3, GLES20.GL_FLOAT, false, 0, colorBuffer);
GLES20.glEnableVertexAttribArray(iColor);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, rotX, 1, 0, 0);
Matrix.rotateM(mModelMatrix, 0, -rotY, 0, 1, 0);
Matrix.setIdentityM(mViewProjectionMatrix, 0);
Matrix.multiplyMM(mViewProjectionMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
//GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewProjectionMatrix, 0);
GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0);
//GLES20.glDrawElements(GLES20.GL_LINES, mVertices.length/2, GLES20.GL_UNSIGNED_SHORT, indexBuffer);
GLES20.glDrawArrays(GLES20.GL_LINES, 0, mVertices.length / 2);
}
【问题讨论】:
-
如果你想“环顾四周”,你应该旋转你的视图矩阵。
标签: android opengl-es rotation