所以我正在尝试在 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
最佳答案
这两种方法中的任何一种都可以,因为您可以获得相同的结果。一般区别在于您希望如何存储对象状态。对于 3D 环境,我将始终使用 3 个向量来确定对象状态(位置、向前、向上),并使用修改版本的 lookAt 和 modelMatrix 可以放置具有与 lookAt 相同参数的对象。这种方法的好处是您可以根据其他对象直接放置参数,例如:导弹正在跟随您,并且无论您身在何处或如何移动,它总是转向您。那么它的前向向量就是 taregetPosition-missilePosition
(通常是归一化的)。另一方面,如果你必须计算角度,你有很多工作,直接 asin
,acos
和一些 if
语句2个角度。接下来例如简单地在房间里移动,向前:如果你使用基本向量,那么 position = position+forward*speedFactor
而对于角度你必须再次计算你面对的方向然后做相同...(在很多情况下这很有用)
但也有缺点。您需要有自己的系统来移动和旋转这些矢量。例如,如果你想说向左转 45 度,它看起来像这样:
forward = (forward+cross(up,forward)*tan(45)).normalized
这仅适用于区间 (-90, 90) 内的角度。它在向上时变得完全相同,但您还需要更正向上矢量。
总而言之,如果您创建所有方法来处理基本向量(旋转、观察、模型矩阵...),它们是真正的省力方法。但这仅取决于您正在编写的项目来决定使用什么。
关于Android : OpenGL 2. 0 第一人称相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16012975/