我有一个适用于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
触摸输入,将摄像机的旋转存储在给定的帧上。 mCurrentTranslation
和xrot
,yrot
相同。因此,当我在旋转后移动时,运动将根据世界坐标保持不变。我的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轴上的旋转。有人在更新功能中看到某处的错误吗?但大多数情况下有一种标准的方法吗?
答案 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));
}
像魅力一样工作