我为android编写了第一人称相机类。
该类非常简单,相机对象有三个轴 X,y和Z
并且有创建ModelView矩阵的函数(即calculateModelViewMatrix()), 沿X和Y轴旋转相机 并沿Z轴平移相机。
我认为我的ModelViewMatrix校准是正确的,我也可以沿Z轴平移相机。
沿x轴的旋转似乎有效,但沿着Y轴它会产生奇怪的结果。 旋转的另一个问题似乎是,不是相机被旋转,我的3D模型开始沿其轴旋转。
我已经根据看点编写了另一个实现,并使用openGL ES的GLU.gluLookAt()函数来获取ModelView矩阵,但是它似乎也遇到了完全相同的问题。
修改
首先感谢您的回复。
我实际上已经实现了Camera类的第二个实现,这次使用了android.opengl.Matrix类中提供的旋转函数。 我提供了下面的代码,这更简单。
令我惊讶的是,结果“完全”相同。 这意味着我的旋转函数和Android的旋转函数产生相同的结果。
我做了一个简单的测试并查看了我的数据。 我只是围绕Y轴旋转LookAt点1-dgree并查看坐标。似乎我的LookAt点落后于精确的旋转角度,例如在20度,它只有10到12度的驯化。 在45度之后它开始反转
答案 0 :(得分:2)
有一个类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);
}
}