android - 3D 第一人称相机旋转

标签 android opengl-es 3d

我已经为 android 编写了第一人称相机类。

这个类非常简单,相机对象有它的三个轴 X、Y 和 Z

还有创建 ModelView 矩阵的函数(即 calculateModelViewMatrix() ), 沿 X 轴和 Y 轴旋转相机 并沿 Z 轴平移相机。

我认为我的 ModelViewMatrix 计算是正确的,我还可以沿 Z 轴平移相机。

沿 x 轴旋转似乎可行,但沿 Y 轴旋转会产生奇怪的结果。 旋转的另一个问题似乎是,我的 3d 模型不是旋转相机,而是开始沿其轴旋转。

我已经编写了另一个基于观察点并使用 openGL ES 的 GLU.gluLookAt( ) 函数来获取 ModelView 矩阵的实现,但这似乎也遇到了完全相同的问题。

编辑

首先感谢您的回复。

我实际上已经对 Camera 类进行了第二次实现,这次使用了 android.opengl.Matrix 类中提供的旋转功能,如您所说。 我提供了下面的代码,它更简单。

令我惊讶的是,结果“完全”相同。 这意味着我的旋转函数和 Android 的旋转函数产生相同的结果。

我做了一个简单的测试并查看了我的数据。 我只是将 LookAt 点一次围绕 Y 轴旋转 1 度并查看坐标。看来我的 LookAt 点落后于精确的旋转角度,例如在 20 度时,它只旋转了 10 到 12 度。 在 45 度后开始反转

最佳答案

有一个 android.opengl.Matrix 类,它是静态方法的集合,可以在您传入的 float[16] 上完成您需要的一切。我强烈建议您使用这些函数,而不是自己滚动。您可能想要 setLookAtM 和根据您的摄像机角度计算出的观察点(使用 sin、cos,就像您在代码中所做的那样 - 我假设您知道如何执行此操作。)

-- 编辑以响应新答案--

(顺便说一下,您可能应该已经编辑了您的原始问题 - 您作为另一个问题的回答让我有些困惑)

好的,下面是一种方法。这是未编译和未经测试的。我决定改为手动构建矩阵;也许这会提供更多关于正在发生的事情的信息......

class TomCamera {
     // These are our inputs - eye position, and the orientation of the camera.
     public float mEyeX, mEyeY, mEyeZ; // position
     public float mYaw, mPitch, mRoll; // euler angles.

     // this is the outputted matrix to pass to OpenGL.
     public float mCameraMatrix[] = new float [16];

     // convert inputs to outputs.
     public void createMatrix() {
         // create a camera matrix (YXZ order is pretty standard)
         // you may want to negate some of these constant 1s to match expectations.
         Matrix.setRotateM(mCameraMatrix, 0, mYaw, 0, 1, 0);
         Matrix.rotateM(mCameraMatrix, 0, mPitch, 1, 0, 0);
         Matrix.rotateM(mCameraMatrix, 0, mRoll, 0, 0, 1);
         Matrix.translateM(mCameraMatrix, 0, -mEyeX, -mEyeY, -mEyeZ);
     }
}

关于android - 3D 第一人称相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613411/

相关文章:

java - 无法在 Android 上生成 RSA 私钥

android - 如何更改微调器中的下拉高度

iphone - 学习 OpenGL ES 1.x

c# - 3D Delaunay 三角剖分 C# 库?

android - 以暂停时的相同方向恢复 Activity ?

android - 卡在ArrayAdapter上

Android - 适用于 Android 的最新开源 3D 库

iphone - 什么是 DOT3 照明?

python - Matplotlib 参数化曲面图结果出乎意料,为什么?

c++ - 获取旋转顶点的当前顶点位置