Opengl ES Android - 旋转相机本身

时间:2017-07-05 10:39:56

标签: java android opengl-es

我正在使用Opengl ES在Android上开发一个地形生成应用程序,我在绕着自身旋转相机时遇到问题(FPS效果使其清晰)。 我正在做的是用Matrix.setLookAtM移动视图,然后在将视图转换为原点后旋转视图。这是代码的片段:

    Matrix.setLookAtM(mViewMatrix, 0, xrot, eyeY, yrot, xrot, lookY, yrot,0.0f, 1.0f, 0.0f); 

    Matrix.translateM(mViewMatrix,0,-xrot,0f,-yrot);
    Matrix.rotateM(mViewMatrix, 0, mAngleX+mAngleY, 0.0f, 1.0f,0.0f);
    Matrix.translateM(mViewMatrix,0,xrot,0f,yrot);

从触摸屏输入xrotyrotmAngleX+mAngleY。 此代码仅适用于原点,但是当您移动时,它会围绕世界的y轴而不是相机旋转。我想我做得不对,但我找不到可以在任何地方工作的方法。

1 个答案:

答案 0 :(得分:0)

我找到了办法:

    Matrix.setIdentityM(mCurrentRotation, 0);
    Matrix.rotateM(mCurrentRotation, 0, mAngleY+mAngleX, 0.0f,1.0f, 0.0f);
    Matrix.rotateM(mCurrentRotation, 0, mAngleX, 0.0f,0.0f, 1.0f);
    mAngleX = 0.0f;
    mAngleY = 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);
    // multiply the rotation just for model*view
    Matrix.multiplyMM(mMVPMatrix, 0, mTemporaryMatrix, 0, mMVPMatrix, 0);
    //than add projection as usual
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

其中mTemporaryMatrix, mCurrentRotation,mAccumulatedRotation,是计算总旋转的矩阵,保持帧旋转并分别存储摄像机的整个旋转。此解决方案适用于旋转,但它不会使相机沿其指向的方向移动。