我尝试在 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
我不明白为什么我们需要将前向矢量更改为负数。
答案 0 :(得分:2)
交叉产品订单仅遵循其定义。就像它一样。您正在设置右手坐标系。因此,如果您将右手的拇指与第一个因子和食指与第二个因子对齐,那么中指将指向十字产品的方向(垂直于两者)。关于这一点真的没什么好说的。
由于您正在设置右手坐标系,因此摄像机的前进方向必须映射到负z方向。这就是旋转矩阵的第三列被反转的原因。如果你不这样做,你最终会得到一个左手坐标系,相机在正z轴方向看。