perspective*lookAt 转换在 qt openGL 中表现出意外甚至不保持 w==1

perspective*lookAt transformation in qt openGL behaving unexpectedly not even keeping w==1

我正在尝试在 openGL window 中识别 鼠标指针位于渲染场景中可见的给定 3D 矩形内。

到目前为止的故事

我已经将矩形的坐标作为世界坐标。 我也有矩阵

QMatrix4x4 camera = perspective(..) * lookAt(..)

而且在我的顶点着色器中看起来还不错。毕竟用

gl_Position = camera * v_vertices;

屏幕上显示了我想要的矩形。

问题

我真正想要的是矩形角的屏幕坐标 (xj,yj)[-1,1]^2 上 CPU.

我第一次使用顶点着色器的经验让我放心

QVector4D w = (world coordinates of such a visible vertex) = (xw,yw,zw,1)

w 中的值在调试器 gdb 中看起来不错。接下来我尝试使用

直接获取屏幕坐标
QVector4D s = camera * w

因为矩形实际上是通过同样的变换在屏幕上呈现的,而且我坚信所有可见的 openGL 点都位于 [-1,1]^3我真的很想

s in ([-1,1],[-1,1],[-1,1], 1)

然而,我得到了像

这样的东西
w == {xp = 0.5, yp = 1.5, zp = 2, wp = 1}
s == {xp = 1.53, yp = -6.43, zp = 1.81, wp = 2.60}

甚至 s.wp 值都没有保持在 1。

我想这个问题可以归结为:一个可见的东西怎么可能 屏幕上的顶点导致 s NOT in ([-1,1],[-1,1],[-1,1], 1) 使用我的 CPU 单面重建工作流程?

详情

纯产品相机*w 是正确的。鉴于相机是行主要的 我可以八度复现:

camera = [1.54,  -0.31, -0.29, -0.28;
          0.51,   0.95,  0.87,  0.87;
          0.00,   2.20, -0.41, -0.41;
          0.00, -12.09,  1.48,  2.27]';

w=[.5,1.5,2,1]';

(camera*w)' == 1.5350  -6.4200   1.8200   2.6150

观看者数据:

site = [0, 0, 5.5]
direction_of_view = [-0.28, 0.87, -0.41]
dir_up = [0,0,1]
near = 0.40
far = 200
fov_v = 45 degrees
fov_h = approx. 65 degrees

您需要将每个向量除以其 w 分量。

这是在 openGL 的重新定位步骤中自动完成的,但如果您手动计算位置,则需要自己完成。