Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl gl_位置如何成为窗口中的(x,y)位置?_Opengl - Fatal编程技术网

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 ]