Android OpenGL lookAt 函数

Android OpenGL 3D中的LookAt的理解

在opengl中的坐标空间有几种, 物体坐标,世界坐标系,相机坐标系,裁剪空间坐标系。

其他的几种坐标系相对好理解,这个相机坐标系反复试验才明白其中含义。

先来看一下安卓中GLES20中的lookatM函数。

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

在文档中给出的注释如下

Defines a viewing transformation in terms of an eye point, a center of view, and an up vector.

看着这个注释还是没理解。

函数中的的参数前两个可以忽略,后面的九个参数分为三组

第一组是眼睛在空间的坐标

这个就是相机在一个空间直角坐标系中的绝对位置

第二组是物体在空间中的坐标

这个坐标就是我们看的物体在空间坐标系中的位置。

第三组坐标实际上是相机顶部的的指向

这里第三组参数决定了📷顶部方向,大家使用这个参数的时候可以想象一下我们自己的眼睛看东西的时候,实际上这个参数的值是(0, 1, 0),因为把我们自己的头想象称为一个相机,那么这个相机顶部实际上永远指向的天空(假设天空是正轴方向),现在假设我们看屏幕的时候,想把屏幕倒着看,除了不旋转屏幕,我们还有一个选项就是让自己的头顶朝地,这样我们看屏幕的时候就可以实现倒着看了,那么这个时候向量的值应该是(0, -1, 0)。

具体的话大家可以看下面的例子,下面的实例中我们的物体始终都在(0, 0, 0)这个位置不变。

第一组数据是我们眼睛的位置,目前参数值在(-2,-2,2),也就是从立方体的一个顶点的正上方看过去的,现在(upX, upY, upZ)这组参数设定的值是(0, 1, 0), 紫红色是在图形下面的位置,按照上面的解释,如果把upY的值改为-1,表示相机顶部是向下了,那么这个时候最终看到的图形,紫红色是在图像的上部。

注意

  1. 这个参数的设定不能和视线平行,在这个例子当中我们的向量是(-2,-2,-2),如果设定这个up值是x * (-2, -2, -2), 那么将看不到任何图像。
  2. 这个值得含义是表示顶点指向的方向,所以最终含义是在方向这个意思上面,所以(0, -1, 0)和 (0, -x, 0) (x 的取值大于0) 的含义是一样的,最终看到的图像也就没有区别了。