gluLookAt规范

时间:2017-03-23 13:28:46

标签: opengl glut

我在理解gluLookAt的规范时遇到了一些问题。 例如,z轴定义为:

F =(centerX - eyeX,centerY - eyeY,centerZ - eyeZ)

中心是相机看到的点,眼睛是相机所处的位置。

f = F / | F |

,View-Matrix M定义为:

( x[0]   x[1]   x[2]  0 )
( y[0]   y[1]   y[2]  0 )
(-f[0]  -f[1]  -f[2]  0 )
( 0        0      0   1 )

x和y是x,y轴,f是z轴

如果我的相机位于(0,0,5)并且相机看着中心。然后f将沿着负z轴看,因为第一个方程(中心 - 眼睛)f向量将是:(0,0,0) - (0,0,5)=(0,0,-5) )

到目前为止,一切对我都有意义,但是f-vector在上面的M-Matrix中乘以-1。 这样,f向量沿着正z轴并远离中心。

我发现透视矩阵gluPerspective也会将camrea的z轴乘以-1,再次转动z轴并使其看向世界的负z轴。

那么将它乘以-1会有什么意义呢?

1 个答案:

答案 0 :(得分:1)

因为gluLookAt是右手系统的View Matrix。在此空间中,Z坐标在离开屏幕或在摄像机后面时递增。因此,相机可以看到的所有对象在视图空间中都具有负Z.

修改

你应该检查你的数学。您曝光的矩阵缺少转换到相机位置。

关注这个notation让我们这样做:

获得 f 标准化,向上标准化, s 标准化, u = sn x F。请注意, s 必须标准化,因为 f 向上可能不是垂直的,然后它们的叉积不是长度为1的向量。上面的链接中没有提到这一点。

形成矩阵并通过平移到摄像机位置预乘,L = M·T

生成的lookAt矩阵是:

 s.x   s.y   s.z  -dot(s, eye)
 u.x   u.y   u.z  -dot(u, eye)
-f.x  -f.y  -f.z  dot(up, eye)
  0     0     0      1

使用您的数据:camera =(0,0,5),target =(0,0,0),up =(0,1,0)矩阵为:

1  0  0  0
0 -1  0  0
0  0  1 -5
0  0  0  1

让我们将这个转换应用于A =(0,0,4)点。我们得到A'=(0,0,-1)。 再次对于B =(0,0,20),B'=(0,0,15)。
'A'具有负Z,因此相机可以看到它。 B'具有正值,相机无法看到它。