2

我正在使用 python 的 cgkit Mat44.lookat 方法,我想知道它是否正确实现。我写了作者,但到目前为止没有得到答复。我的问题可能很愚蠢,但我真的很想了解我的程序出了什么问题。

如果我做 :

camera_to_world_matrix = mat4.lookAt(eye=vec3(0,0,1), target=vec3(0,0,-3), up=vec3(0,1,0))
world_to_camera_matrix = camera_to_world_matrix.inverse()
pos_in_camera_space = world_to_camera_matrix * vec3(0,0,-10)

在我看来,pos_in_camera_space应该等于vec3(0,0,-11):两个位置之间的距离是 11 个单位,因为我们是在右手系统中,所以相机看向 z 轴的负部分。

但我明白vec3(0,0,11)了,我不明白为什么。

编辑:我使用 OpenGl3,因此使用着色器。

4

1 回答 1

2

手性实际上最终由您的投影矩阵解决。您只需将 (0,0) 设置为屏幕的左上角而不是左下角(例如glOrtho (0, width, 0, height, -1, 1)vs. glOrtho (0, width, height, 0, -1, 1)),就可以反转所有转换的手性。

gluLookAt (...)产生右手变换的原因是因为 GL 中用于建立投影矩阵的矩阵函数(例如glOrtho (...)glFrustum (...))反转了 Z 坐标。只有当您组合两个矩阵时,您才有右手视图空间。由于它们在固定功能的 OpenGL 中是不可分割的,这一点在很大程度上被忽视了。

有关图表的更全面解释,请参阅此相关问题:OpenGL 坐标系是左手还是右手?

于 2013-09-18T20:49:52.067 回答