Matrix Android:GLES 20的摄像头旋转问题

Matrix Android:GLES 20的摄像头旋转问题,matrix,view,opengl-es,rotation,gles20,Matrix,View,Opengl Es,Rotation,Gles20,我已经在3D空间中移动了我的相机(mViewMatrix),每个角度为x、y、z各15°(所有角度为0°时,我对相机旋转没有问题!) 3D空间中的所有对象都很好(显示在屏幕的右下方) 好,现在我想绕X轴旋转相机。右下角的对象应在右侧从下向上移动 但是。。。因为改变了15°的摄像机角度。。。这些物体不仅在右侧由下向上移动。。。它们也从右向左移动了一点 我想我必须把向量从: Matrix.setRotateM(mViewMatrix, 0, 15, 0, 1, 0); 致: 。。。或者别的什么 这

我已经在3D空间中移动了我的相机(mViewMatrix),每个角度为x、y、z各15°(所有角度为0°时,我对相机旋转没有问题!)

3D空间中的所有对象都很好(显示在屏幕的右下方)

好,现在我想绕X轴旋转相机。右下角的对象应在右侧从下向上移动

但是。。。因为改变了15°的摄像机角度。。。这些物体不仅在右侧由下向上移动。。。它们也从右向左移动了一点

我想我必须把向量从:

Matrix.setRotateM(mViewMatrix, 0, 15, 0, 1, 0);
致:

。。。或者别的什么

这就是我所做的(我知道我必须使用旋转矩阵,但这里我发布了简单的代码,只是为了便于阅读):


如果有人能发布一个简单的演示代码就好了,因为我已经试了5天了,但我不知道如何修复它(我已经测试了很多)。

实际上,你不能在OpenGL中旋转相机。相反,您应该移动/旋转对象。您需要将模型/视图/投影矩阵应用于正在渲染的每个对象。 你不必自己计算它们,你可以使用android.graphics.matrix。您在代码中使用了它,但使用了错误的方法。若要旋转相机,应使用方法

Matrix.setLookAtM(float rm[], int rmOffset, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
但是,您需要提供相机应该居中的点的坐标。 幸运的是,找到这样一个点的坐标很容易,您只需要一点三角和3行代码:

centerX = eyeX + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.cos( Math.toRadians( yaw ) );  
centerY = eyeY - ( float ) Math.sin( Math.toRadians( pitch ) );  
centerZ =eyeZ + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.sin( Math.toRadians( yaw ) );  

Math.cos(双角度)和Math.sin(双角度)接受弧度的角度,因此您应该使用Math.toRadians(双角度)将它们转换为弧度。这些函数返回double类型的值,因此需要将它们转换为float,因为矩阵类函数接受float作为坐标。

以下是完整的工作代码:

float pitch = 0;
float yaw   = 90;
float roll  = -90;

lookX   = eyeX + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.cos( Math.toRadians( yaw ) );
lookY   = eyeY - ( float ) Math.sin( Math.toRadians( pitch ) );
lookZ   = eyeZ + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.sin( Math.toRadians( yaw ) );

upX = (float) Math.cos(Math.toRadians( roll ));
upY = (float) -Math.sin(Math.toRadians( roll )); 

Matrix.setIdentityM(mViewMatrix, 0);
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);

非常感谢你的工作。但是我如何旋转“滚动”角度呢?我只见过“俯仰”和“偏航”@Kyle你需要指定Matrix.setLookAtM的上方向向量(upX,upY,upZ)来让你的相机滚动。该向量指定摄影机的“向上”侧点的位置,即。E如果你举起手,那就是你的上方向。@Reaper:很好的提示让方向(upX,upY,upZ)滚动相机。你是否有一些代码截取来将滚动角度转换成有用的滚动向量?@Kyle Umm。。。不,我没有用卷。虽然我想用一张纸和一点时间我就能得到它。这是可行的:upX=(float)Math.cos(Math.toRadians(roll));upY=(float)-Math.sin(Math.toRadians(roll));
centerX = eyeX + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.cos( Math.toRadians( yaw ) );  
centerY = eyeY - ( float ) Math.sin( Math.toRadians( pitch ) );  
centerZ =eyeZ + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.sin( Math.toRadians( yaw ) );  
float pitch = 0;
float yaw   = 90;
float roll  = -90;

lookX   = eyeX + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.cos( Math.toRadians( yaw ) );
lookY   = eyeY - ( float ) Math.sin( Math.toRadians( pitch ) );
lookZ   = eyeZ + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.sin( Math.toRadians( yaw ) );

upX = (float) Math.cos(Math.toRadians( roll ));
upY = (float) -Math.sin(Math.toRadians( roll )); 

Matrix.setIdentityM(mViewMatrix, 0);
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);