Opengl es 旋转场景后如何平移摄影机?

Opengl es 旋转场景后如何平移摄影机?,opengl-es,opengl-es-2.0,rotational-matrices,Opengl Es,Opengl Es 2.0,Rotational Matrices,我目前正在尝试在Android中用OpenGL ES 2可视化一个建筑。 当我向左滑动时,整个场景应该向左移动(与右、下和上相同)。现在,当我将模型旋转90°时,轴被交换。向右滑动时,模型将移动到顶部而不是右侧(与另一个轴相同) 如何平移摄影机而不出现场景当前旋转的问题?当我使用手机时,我总是想将对象移动到我要滑动的方向。当我调用translate first时,平移工作正常,但旋转有一些错误 更新:我创建了大部分相机类(答案中建议): 如何将一个向量围绕另一个向量旋转一个角度?如果定义摄影机基

我目前正在尝试在Android中用OpenGL ES 2可视化一个建筑。 当我向左滑动时,整个场景应该向左移动(与右、下和上相同)。现在,当我将模型旋转90°时,轴被交换。向右滑动时,模型将移动到顶部而不是右侧(与另一个轴相同)

如何平移摄影机而不出现场景当前旋转的问题?当我使用手机时,我总是想将对象移动到我要滑动的方向。当我调用translate first时,平移工作正常,但旋转有一些错误

更新:我创建了大部分相机类(答案中建议):


如何将一个向量围绕另一个向量旋转一个角度?

如果定义摄影机基本向量
C
-中心,
L
-看,
U
-向上,使
C
是摄影机中心,
L
是从中心到所看点的标准化向量,
U
是向上标准化的。现在,您可以将
L
向量左右旋转
U
任意角度

至于向左和向右移动,你必须重建边向量
S
:L和U(S=LxU)之间的叉积。现在只需移动中心:
C=C+S*inputFactor

要重建
lookAt
向量:

eye = C
center = C+L
up = U
请注意:如果您还需要上下查看(旋转),您需要将
L
U
围绕
S
旋转,要向左和向右倾斜,您需要将
U
围绕
L
旋转。向前或向后移动
C=C+L*输入因子
和上下移动
C=C+U*输入因子


这应该可以解决所有逻辑摄像机的移动和旋转问题。

我认为你混合了移动摄像机和旋转物体的概念。首先,您需要将旋转对象的动作与与相机的任何交互分开。您应该能够在不更改相机的情况下对对象执行任何操作。为此,只需使用模型矩阵来描述对象的平移/旋转/缩放。然后,通过使用Matrix.setLookAtM和独立于模型位置的eyeX、eyeY、eyeZ分别处理相机。在你的例子中,要看的一点取决于eyeX,eyeY,eyeZ,因为你想一直看同一个方向

例如,如果要将对象绕Y轴旋转90度,请使用:

Matrix.rotateM(mModelMatrix, 0, 90, 0.0f, 1.0f, 0.0f);
还要记住,matrix.setIdentityM之后的所有矩阵操作都将按向后顺序进行,即如果在代码中执行第一件事情时先旋转然后平移,则首先将对象从原点位置平移,然后围绕原点旋转,使对象围绕第一个原点旋转,而不是围绕对象的中心旋转

然后假设您已将相机向左平移了100个单位,并从-Z方向看,使用:

Matrix.setLookAtM(mViewMatrix, offset, -100.0f+camX, camY, camZ, -100.0f+camX, camY, -1.0f+camZ, upX, upY, upZ);

非常感谢你的回答!不幸的是,我有点困惑。我不必平移/旋转模型本身?改变眼睛和相机的上方向向量似乎非常合乎逻辑。但你所说的输入因子是什么意思?我如何组合每个动作/旋转?我基本上需要在x,y,z方向旋转,然后在x,y,z方向移动相机此外:你所说的“看向量”是什么意思?这是我想我的眼向量?再次非常感谢!我已经更新了我的答案。请看一看!如果这个问题能解决我的问题的话,我会给它加一笔赏金,“看向量”是三个向量(眼睛,中心,向上)。您不需要移动模型本身,但如果您移动了模型本身,并且希望根据摄影机进行移动,则应再次使用摄影机参数:使用“S”向量将其左右平移。如果要旋转和平移对象,则需要先平移对象,以便保存这些参数(角度和平移)。在这种情况下,“输入因子”是翻译的长度,通常是从用户处获得的一些参数(例如刷卡的长度)。注意它也可以是否定的。谢谢你的回答。我已经使用了你推荐的旋转函数。我的MatrixHelper类正在旋转X、Y和Z(首先平移到中心,然后旋转,然后平移回原点->因此模型围绕自己的中心旋转)。我的问题是旋转模型时平移错误。当我将模型旋转90°时,平移轴将被交换。我建议您编写一个类来保存我的答案(C、L、U)中描述的相机参数。如前所述,在类上实现移动和旋转的方法。请注意,L和U的长度始终为1。inputFactor是一个标量(要横向移动5个点,请使用centerVector.add(sVector*5))。在你的第一次发帖中放置相等的起始参数:C=眼睛,L=标准化(中心眼睛),U=标准化(向上)。要将其转换为setLookAtM,请使用“重建lookAt向量”下的方程式:“很高兴你再次回答了!我已经用相机课上的大部分内容更新了我的问题。你能告诉我如何将一个向量绕另一个向量旋转一个角度吗?我在谷歌上找到的唯一答案是“使用四元数”。谢谢围绕某个点旋转向量与旋转场景(每个顶点都旋转)相同。如果有库,可以使用矩阵或四元数。或者你可以找到其中的一些。您还可以使用openGL矩阵(设置为identity,然后旋转它),将其检索为4x4数组并手动执行乘法。使用一些四元数库应该像这样简单:Vector3 rotatedVector=四元数。AngleAxis(angle,vector)*originalVector;
Matrix.setLookAtM(mViewMatrix, offset, -100.0f+camX, camY, camZ, -100.0f+camX, camY, -1.0f+camZ, upX, upY, upZ);