繁体   English   中英

OpenGL ES平移和旋转

[英]OpenGL ES translation and rotation

不知道是在这里还是在GameDev中发布,但是由于它并不是真正的游戏开发,所以我决定在这里询问。

我正在Android上尝试OpenGL ES 2,现在我有了一个简单的设置。 我从.obj文件加载一个对象,然后将其显示在屏幕上,然后可以使用触摸控件围绕该对象旋转相机。 我的viewMatrix设置如下:

double[] dist = {DISTANCE * Math.sin(yawAngle) * Math.abs(Math.cos(pitchRollAngle)),
        DISTANCE * Math.sin(pitchRollAngle),
        DISTANCE * Math.cos(yawAngle) * Math.abs(Math.cos(pitchRollAngle))};

Matrix.setLookAtM(viewMatrix, 0, (float) dist[0], (float) dist[1], (float) dist[2], 0f, 0f, 0f, 0f, 1.0f, 0.0f);

我的投影矩阵就是这样:

Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 100);

我通过触摸事件设置偏航角/ pitchRoll角度。 现在可以正常工作,当对象位于屏幕中央时,我可以像应该的那样旋转。 但是,如果我尝试移动对象,例如,在X轴上这样移动1个单位:

float[] modelMatrix = new float[16];
Matrix.setIdentityM(modelMatrix, 0);
Matrix.translateM(modelMatrix, 0, 1, 0, 0);

然后像这样将它们全部相乘:

float[] MVPMatrix = new float[16];
Matrix.multiplyMM(MVPMatrix, 0, modelMatrix, 0, viewMatrix, 0);
Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, MVPMatrix, 0);

该对象在其位置旋转,但是我希望它绕(0, 0, 0)点旋转。 我究竟做错了什么?

我记得在Delphi 2010中必须使用OpenGL时遇到类似的问题。 诀窍是将对象放回<0,0,0>,进行旋转,然后在绘制框架之前将其放回其原始位置。 我不记得我是怎么做的,也因为我的前任老板属于我而无法再访问该代码,但这就是我所记得的。

问题出在这一行:

Matrix.multiplyMM(MVPMatrix, 0, modelMatrix, 0, viewMatrix, 0);

我只是切换了模型和视图矩阵,以便它们以相反的方式相乘,并且可以正常工作! 像这样:

 Matrix.multiplyMM(MVPMatrix, 0, viewMatrix, 0, modelMatrix, 0);

感谢@Zubaja为我指出正确的方向!

这是关于矩阵乘法的最普遍的问题之一。 在您的情况下,您需要先旋转对象然后平移它。 因此,如果先平移到X然后旋转,该对象将出现在位置X,但绕其自身的轴旋转。 如果先旋转然后再按X平移,则该对象将不会出现在X处,而是在旋转X本身得到的点处。 这是预期的结果,并且它是如何工作的。

因此,了解发生了什么:矩阵实际上由3个基本向量和一个中心组成。 当相同时,基本向量是(1,0,0)(0,1,0)(0,0,1)(0,0,0) 现在,当将此矩阵乘以某种变换后,基本向量实际上就被变换了。 结果是矩阵包含其自己的坐标系,在该坐标系中转换似乎是“逻辑的”。 这导致旋转矩阵将永远不会改变对象的中心。

我知道这太复杂了,但实际上很难想象这种效果:就好像矩阵乘法实际上是从第一人称视角看向角色的命令一样。 因此,当您说“前进”(翻译)时,您向前走了一步,现在“转90度”,然后转90度并仍然在同一位置,现在“再次前进”,您又向前走了一步,但这是实际上与开始时的方向不同...

因此,您要做的就是说“前进1”,现在将ANGLE旋转。 这导致对象保持在相同位置并围绕其自身的轴旋转。 现在您应该做的是说“转向目标”(按ANGLE旋转),现在“按1前进”,甚至“按-ANGLE ”,这样您将面对与开始时相同的方向。

希望这种解释对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM