我已经为 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/