获取OpenGL LookAt位置

时间:2012-08-06 16:22:00

标签: android opengl-es matrix

在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

example

2 个答案:

答案 0 :(得分:2)

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

然而,一般来说,如果你有一个视图矩阵,并且想要看到它面向哪个方向,你想要通过视图矩阵的逆转换眼睛空间前向量(0,0,1)。 / p>

当视图矩阵将世界空间中的矢量转换为眼睛空间时,逆视图矩阵将矢量从眼睛空间转换为世界空间。

所以你可以:

  1. 将任意操作应用于当前视图矩阵
  2. 采取反向
  3. 将逆矩阵乘以(0,0,1,0)。 (注意这与拔出逆矩阵的第三列相同)。
  4. 在#3之后,您将拥有世界空间中相机眼的方向。将它添加到眼睛的位置,你应该知道它指向的位置。

答案 1 :(得分: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];