2

所以我正在尝试在 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

4

1 回答 1

1

这两种方法中的任何一种都可以,因为您可以获得相同的结果。一般的区别在于您希望如何存储对象状态。对于 3D 环境,我总是使用 3 个向量来确定对象状态(位置、向前、向上),并使用修改版本的 lookAt 和 modelMatrix 可以放置具有与 lookAt 相同参数的对象。这种方法的好处是您可以根据其他对象直接放置参数,例如:导弹跟随您,无论您身在何处或如何移动,它始终朝向您。然后它的前向向量是简单的taregetPosition-missilePosition(通常是标准化的)。另一方面,如果您必须直接计算角度,则需要做asin很多acos工作if2 个角度中的每一个的陈述。接下来,例如在房间内简单移动,继续前进:如果您使用基向量,那么position = position+forward*speedFactor在使用角度时,您必须再次计算您面对的方向,然后做同样的事情......(有很多情况是有用)

但也有缺点。您需要拥有自己的系统来移动和旋转这些矢量。例如,如果你想说向左转 45 度,它看起来像这样:

forward = (forward+cross(up,forward)*tan(45)).normalized

这仅适用于区间 (-90, 90) 中的角度。出现时它变得完全相同,但您还需要更正向上向量。

所以总结一下,如果你创建了所有使用基向量的方法(旋转、查看、模型矩阵......),它们是一种真正节省劳动力的方法。但这仅取决于您正在编写的项目来决定使用什么。

于 2013-04-15T13:08:50.783 回答