我尝试了解OpenGL中的View Matrix

时间:2017-01-07 01:12:46

标签: opengl matrix

我尝试在 OpenGL 中构建自己的 View Matrix

我关注此链接 https://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

从OpenGL文档中,我有以下内容。

眼睛位置= eye(xe, ye, ze) 中心位置= cen(0, 0, 0)

up = up(xu, yu, zu). (e.g. up = (0, 1, 0))

前向矢量

f' = cen - eye = (0, 0, 0) - (xe, ye, ze) = (-xe, -ye, -ze)

侧向量

s' = f' x up

我不明白为什么f' x up,为什么不上x f'

u' = s' x f'

我不明白你为什么会这样做。 = s' x f',为什么不是你' = f' x s'

我们将s',u',f'

标准化
s = norm(s'), u = norm(u'), f=norm(f')

我们用行主要构建旋转矩阵(我们在代数类中学到的东西)

R = 
s_x u_x f_x 0
s_y u_y f_y 0
s_z u_z f_z 0
0   0    0  1

翻译矩阵:

T = 
1 0 0 x
0 1 0 y
0 0 1 z
0 0 0 1

我们知道

M = T*R
View Matrix V = invert(M)
V = invert(T*R) = invert(R)invert(T)
V = transpose(R)invert(T) 

transpose(R) = 
s_x s_y s_z 0
u_x u_y u_z 0
f_x f_y f_z 0
0   0    0  1


invert(T) = 
1 0 0 -x
0 1 0 -y
0 0 1 -z
0 0 0 1

所以

View Matrix V = transpose(R)invert(T)

但是从OpenGL文档中, f更改为-f

轮换更改为以下

R = 
s_x u_x -f_x 0
s_y u_y -f_y 0
s_z u_z -f_z 0
0   0    0  1

我不明白为什么我们需要将前向矢量更改为负数。

1 个答案:

答案 0 :(得分:2)

交叉产品订单仅遵循其定义。就像它一样。您正在设置右手坐标系。因此,如果您将右手的拇指与第一个因子和食指与第二个因子对齐,那么中指将指向十字产品的方向(垂直于两者)。关于这一点真的没什么好说的。

由于您正在设置右手坐标系,因此摄像机的前进方向必须映射到负z方向。这就是旋转矩阵的第三列被反转的原因。如果你不这样做,你最终会得到一个左手坐标系,相机在正z轴方向看。