Opengl gl_位置如何成为窗口中的(x,y)位置?
我试图了解Opengl gl_位置如何成为窗口中的(x,y)位置?,opengl,Opengl,我试图了解gl\u位置如何在屏幕中变成(x,y)位置,以及如何将其转换回(例如,获取鼠标单击的位置) 例如,假设我有以下3D向量: V = [ -70.0, 0.27, -30.0, 1.0 ] 我的MVP(模型视图投影)是根据透视图计算的 M = [[-1.34, 0.0 , 0.0 , 0.0 ], [ 0.0, 1.26, 1.28, 0.40 ], [ 0.0, -0.72, 0.71, 141.54 ], [ 0.0, -0.7
gl\u位置如何在屏幕中变成(x,y)位置,以及如何将其转换回(例如,获取鼠标单击的位置)
例如,假设我有以下3D向量:
V = [ -70.0, 0.27, -30.0, 1.0 ]
我的MVP(模型视图投影)是根据透视图计算的
M = [[-1.34, 0.0 , 0.0 , 0.0 ],
[ 0.0, 1.26, 1.28, 0.40 ],
[ 0.0, -0.72, 0.71, 141.54 ],
[ 0.0, -0.71, 0.70, 142.13 ]]
如果将两者相乘,则得到:
M * V = [ 94.11, -37.53, 120.079, 120.86 ]
在gl_Position
中设置此值后,将在窗口中的以下位置绘制矢量(我的窗口为800x600):
我不明白的是:M*V
如何变成p
?我知道这与V
中的w
有关,但我找不到与P
相同的计算结果
第二个问题是,如何在
V
中变换p
,以捕捉鼠标单击的三维位置。例如,从M*V到p,需要将M*V除以最后一个(w)分量,称为透视分割,然后应用视口变换以获得实际像素。看看
如果没有更多的深度信息,从2d到3d在数学上是不可能的,这些信息可以通过gluUnproject获得。有关如何使用的信息。然而,请注意,根据您的用例,每秒频繁使用这种方法可能会非常慢。不过,这可能会让您了解这一切是如何运作的。非常感谢您的文章。通过使用
M*V
的结果执行N=(x,y,z)/w
,我能够使用win_x=(Tw/2.0)*Nx+(Tx+Tw/2.0)
和win_y=Th-((Th/2.0)*Ny+(Ty+Th/2.0)获得最终的窗口位置(考虑视口T=(x,y,w,h)
)
。所以我假设只需要win\u x和win\u y来描述顶点映射到屏幕的位置。win_z(公式类似于win_x和win_y,但基于远近截头体剪辑值)将是额外的信息,可用于获取2D窗口图像并撤消投影以获取3D模型。
P = [ 702, 374 ]