opengl - 右手系统中的 Lookat 函数的结果应该是什么?

标签 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,因此使用着色器。

最佳答案

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

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

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

关于opengl - 右手系统中的 Lookat 函数的结果应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18881805/

相关文章:

c++ - GLSL 和 glBegin(GL_TRIANGLES) 不工作

c++ - 变量改变它的值

c++ - GLUT 中的平滑运动

c++ - OpenGL-从外部文件绘制点

java - mongodb (java) 包括按名称排列的 id 字段

c# - 使用 AutoMapper 对字符串的枚举描述

r - 在 R 中初始化矩阵列表

r - 从矩阵列表中获取元素

c - C中的自由动态二维矩阵

projection - Kitti Velodyne 点到像素坐标