Opengl ES 2.0 Android - 根据轮换

时间:2017-07-10 12:47:29

标签: android opengl-es rotation

我有一个适用于Android的岛屿随机生成应用程序,使用Opengl ES 2.0开发,我正在尝试实现类似FPS的相机。主要问题是根据相机旋转来转换视图。这就是我旋转和翻译视图的方式:

    Matrix.setIdentityM(mCurrentRotation, 0);
    Matrix.rotateM(mCurrentRotation, 0, mAngleX, 0.0f,1.0f, 0.0f);
    Matrix.setIdentityM(mCurrentTranslation, 0);
    Matrix.translateM(mCurrentTranslation,0,xrot,-7.0f,yrot);
    mAngleX = 0.0f;

    Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentRotation, 0, mAccumulatedRotation, 0);

    System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16);
          .
          .
          .
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mCurrentTranslation, 0, mMVPMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mTemporaryMatrix, 0, mMVPMatrix, 0);
    // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix
    // (which now contains model * view * projection).
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

mTemporaryMatrix根据旧的旋转和mAngleX触摸输入,将摄像机的旋转存储在给定的帧上。 mCurrentTranslationxrotyrot相同。因此,当我在旋转后移动时,运动将根据世界坐标保持不变。我的xrot,yrot更新等式如下:

  void setXYrot(float x, float y){
      Matrix.transposeM(temp,0,mTemporaryMatrix,0);
      Matrix.invertM(temp,0,temp,0);
      xrot-=(x*Math.sin(Math.acos(temp[5])));
      yrot+=(y*Math.cos(Math.acos(temp[5])));
  }

我很确定问题依赖于他们。我转置并反转旋转矩阵然后我将反余弦作为矩阵的第六个元素,它应该是Y轴上的旋转。有人在更新功能中看到某处的错误吗?但大多数情况下有一种标准的方法吗?

1 个答案:

答案 0 :(得分:0)

发现错误。首先,我将mAngleX的累积量保持在一个名为angle的浮点变量中旋转,然后简单地说:

void setXYrot(float x, float y){

    xrot-=(y*Math.sin((angle*Math.PI)/180f))+(x*Math.cos((angle*Math.PI)/180f));
    yrot+=(y*Math.cos((a*Math.PI)/180f))-(x*Math.sin((angle*Math.PI)/180f));
}

像魅力一样工作