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