【发布时间】:2013-04-15 21:08:50
【问题描述】:
所以我正在尝试在 Android 上学习 OpenGL 2.0,我确实在 iOS 上玩了很多 OpenGL 1,并且非常喜欢它。
我的简单问题是关于相机和制作一个可以移动的 3D 环境(第一人称)
我应该使用
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
控制相机和我在世界上的位置(在 onDrawFrame 上更新),或在 onSurfaceCreated 上设置(一次)并使用
Matrix.setIdentityM(mViewMatrix, 0);
Matrix.translateM(mViewMatrix, 0, mMoveY, 0.0f, mMoveX);
Matrix.rotateM(mViewMatrix, 0, mDeltaY, 1.0f, 0.0f, 0.0f);
Matrix.rotateM(mViewMatrix, 0, mDeltaX, 0.0f, 1.0f, 0.0f);
相反,这感觉就像我在旋转我周围的世界。
我曾经在 OpenGL 1 上看到过他们使用 GLLookAt 的示例
【问题讨论】:
-
显然,使用产生正确结果的那个。两者都可以使用,因为
setLookAt只是对平移和旋转的更高抽象。 -
使用最适合您和您的用例的那个。在 OpenGL 中,您所做的只是旋转周围的世界,没有实际的相机(在 ES 2 中更是如此,无论如何您都可以完全控制着色器中的转换)。最后,
setLookAt除了计算 “世界” 的旋转和平移之外,并没有做太多其他事情,就像一堆translate和rotate调用一样,它是只是某些用例的更好(或更高级别)的界面。如果您已经有了mMove和mDelta值,则第二种方法似乎更容易。 -
请向我解释一下lookAt与调用一堆翻译和旋转方法调用一样吗?翻译部分确实不是什么工作,但旋转必须执行正弦/余弦运算来创建旋转矩阵,然后将 2 个矩阵相乘。另一方面,LookAt 直接将 3 个基向量和平移插入到矩阵中。基本向量是:X 轴交叉(向前,向上),Y 轴向上,Z 轴向前 = 观察眼睛。它们中的每一个分别由一列表示。虽然我同意结果是否相同,但请使用最适合您的。
-
感谢大家的时间和回复,如果有人想将其作为答案发布,那么我会标记它,我感觉 LookAt 确实在引擎盖下做到了这一点,使用翻译和旋转对我来说似乎更容易理解。然而,我的视角出现了问题,所以当我在我面前直接转动一个立方体时,它在我周围旋转时变得相当宽。我会将此作为另一个问题发布
-
@MaticOblak 好吧,是的,旋转将使用一些三角函数。我没有说他们执行完全相同的算术(看评论),我只是在概念上说他们都只是创建一个刚体变换矩阵(旋转+平移)。并不是 setLookAt 做了一些非常神奇的事情(我不确定 OP 是否知道)。当然,实际的实现是完全未定义的(好吧,不是那么未定义),但结果是一样的(实际上,这堆三角函数对于每帧构造的矩阵并不重要)。
标签: android opengl-es opengl-es-2.0