Android : OpenGL 2. 0 第一人称相机

标签 android opengl-es opengl-es-2.0

所以我正在尝试在 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(通常是归一化的)。另一方面,如果你必须计算角度,你有很多工作,直接 asinacos 和一些 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/

相关文章:

javascript - 将 FBO 值投影到屏幕空间以从深度纹理中读取

android-widget - 在Android中的图像按钮上设置前景图像

java - Java 中的闭包或类似的东西

javascript - 使用 ShaderMaterial 复制 MeshLambertMaterial 忽略纹理

opengl-es - 将 WebGL 编译成 C 库

IOS:OpenGL ES 2.0 与 3.0 中具有动态分支的着色器的性能

android - Android:免费提供应用内购买商品

java - 如何在 parse.com 中编写 orderBy 查询

iPhone Opengl 游戏有广告== fps 问题?

安卓 OpenGL ES 2 : How to use an OpenGL activity as a fragment in the main activity