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 的重新定位步骤中自动完成的,但如果您手动计算位置,则需要自己完成。
我正在尝试在 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 的重新定位步骤中自动完成的,但如果您手动计算位置,则需要自己完成。