右手系统中的外观功能应该是什么结果?

时间:2013-09-18 20:30:38

标签: opengl matrix projection

我正在使用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,因此使用着色器。

1 个答案:

答案 0 :(得分:2)

最终,你的投影矩阵实际上解决了手性问题。您可以通过将(0,0)设置为屏幕的左上角而不是左下角(glOrtho (0, width, 0, height, -1, 1)glOrtho (0, width, height, 0, -1, 1))来反转所有变换的灵活性。

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

有关图表的更全面说明,请参阅此相关问题:Is OpenGL coordinate system left-handed or right-handed?