【发布时间】:2017-01-07 01:12:45
【问题描述】:
我尝试在 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,为什么不 up x f'
u' = s' x f'
我不明白为什么 u' = s' x f',为什么不 u' = 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
我不明白为什么我们需要将前向向量改为负数。
【问题讨论】: