0

在 Android OpenGL 中

它有命令 setLookAtM 来指定相机视图的位置

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY,
            lookZ, upX, upY, upZ);

如果我旋转相机,使用命令 rotateM

Matrix.rotateM(mViewMatrix, 0 , angle , 0.0f, 1.0f, 0.0f);

那么,我怎样才能从 mViewMatrix 获得“LookAt”的确切相机视图?

相机视图位置,我想要的是相机看的 x,y,z

例子

4

2 回答 2

2

小心,因为从技术上讲,调用 rotateM 不会旋转相机,它会将旋转应用于任何未来绘制的对象。(这并不意味着同样的事情)。

但是一般来说,如果您有一个视图矩阵,并且您想查看它所面向的方向,您希望通过视图矩阵的逆来变换眼睛空间前向向量 (0,0,1)。

当视图矩阵将世界空间中的向量变换到眼睛空间时,逆视图矩阵将向量从眼睛空间变换到世界空间。

这样你就可以:

  1. 对当前视图矩阵应用任意操作
  2. 取反
  3. 将逆矩阵乘以 (0,0,1,0)。(请注意,这与仅拉出逆矩阵的第三列相同)。

在#3 之后,您将在世界空间中获得相机眼睛的方向。将此添加到眼睛的位置,您应该知道它指向的位置。

于 2012-08-06T17:58:52.423 回答
1

我已经完成了我的问题,这是我的解决方案

首先,我需要制作这 3 个矩阵以获得 x、y、z 位置的结果

private float[] mRotXMatrix = new float[] {
 1, 0, 0, 0, 
 0, 0, 1, 0,
 0, 1, 0, 0,
 0, 0, 0, 1 };
private float[] mRotYMatrix = new float[] {
 0, 0, 1, 0,
 0, 1, 0, 0,
 1, 0, 0, 0,
 0, 0, 0, 1 };
private float[] mRotZMatrix = new float[] { 
 0, 1, 0, 0,
 1, 0, 0, 0,
 0, 0, 1, 0,
 0, 0, 0, 1 };

然后在 onSensorChanged(SensorEvent e) 方法中,我像这样旋转所有这 3 个矩阵以及我的相机视图

Matrix.multiplyMM(mViewMatrix, 0, deltaRotationMatrix, 0, mViewMatrix, 0);
Matrix.multiplyMM(mRotXMatrix, 0, deltaRotationMatrix, 0, mRotXMatrix, 0);
Matrix.multiplyMM(mRotYMatrix, 0, deltaRotationMatrix, 0, mRotYMatrix, 0);
Matrix.multiplyMM(mRotZMatrix, 0, deltaRotationMatrix, 0, mRotZMatrix, 0);

要获取我的相机视图的 X、Y、Z,只需从这些矩阵中获取

viewX = mRotXMatrix[2];
viewY = -mRotYMatrix[6]; // +/- up to your initial camera view
viewZ = mRotZMatrix[10];
于 2012-08-10T18:25:10.690 回答