OpenGL - 旋转自己的视觉?

时间:2014-01-23 13:15:19

标签: android opengl-es rotation

我正在尝试处理一些OpenGL的东西。我现在所做的是一个视口,我在其中使用GL_LINES绘制了一些想象中的“边界”。它看起来像这样,setLookAt设置如下:

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0);

enter image description here

我的视锥体设置为:Matrix.frustumM(mProjectionMatrix, 0, -2, 2, -2, 2, 1, 11);所以我位于“立方体”内的某个位置。

现在我想要实现的是让用户环顾四周。我正在捕获onTouchEvents,将x / y方向的任何移动传递给渲染器。我接下来要做的是旋转从触摸监听器收到的特定角度绘制的所有线条。

然后看起来像这样:

enter image description here

因此,立方体不会围绕观察者或眼睛中心旋转,而是围绕某些点我不知道它来自何处。

我的问题是:如何围绕观众的中心/位置旋转物体?我是否必须轮换来自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);
}

1 个答案:

答案 0 :(得分:1)

看函数需要3个顶点,眼睛位置,目标位置和向上矢量。基本上它会生成一个矩阵,可以移动场景来渲染场景,就像从眼睛位置到目标位置一样。在你的例子中,你是0,0,0,看着5,0,0(所以你看+ x方向,向上定义为0,1,0(更高的y值意味着对象将在窗口的顶部) 。)

首先定义相机位置,而不是使用这些常量。

float cameraX, cameraY, cameraY;

使用目标矢量更难,因此请使用一个角度来定义您正在查看的方向

float angle;

并计算targetVector使用此角度。

float targetX = cameraX + cos(angle);
float targetY = cameraY;
float targetZ = cameraZ + sin(angle);

现在要移动相机,你必须修改cameraX-Y-Z。如果你想向前移动,你应该将相机移向目标矢量。例如,向前移动10个单位。

targetX += cos(angle)*10;
targetY += sin(angle)*10;

您还需要重新计算目标矢量,因为目标位置也应该移动。

如果要向后移动,请改用 - =运算符。如果要移动边,则必须在这些计算中添加或删除角度PI / 2.

围绕增大/减小角度旋转相机并重新计算目标矢量。

这是一款非常基本的相机,你无法向上或向下看。你必须使用俯仰/偏航相机才能上下移动。