Opengl 反转投影矩阵和模型视图矩阵以将鼠标单击坐标转换为与z=0平面相交的世界坐标
背景 使用带有openGL和GLU风格函数的kivy,我已经使modelview和投影矩阵正常工作。没有使用模型矩阵,因此模型视图矩阵实际上只是基于摄影机位置的变换Opengl 反转投影矩阵和模型视图矩阵以将鼠标单击坐标转换为与z=0平面相交的世界坐标,opengl,linear-algebra,kivy,glu,reverseprojection,Opengl,Linear Algebra,Kivy,Glu,Reverseprojection,背景 使用带有openGL和GLU风格函数的kivy,我已经使modelview和投影矩阵正常工作。没有使用模型矩阵,因此模型视图矩阵实际上只是基于摄影机位置的变换 # cx,cy,cz are the location of the camera. cz is always positive modelview = Matrix().look_at(cx,cy,cz, # eye position coords cx,cy,0.
# cx,cy,cz are the location of the camera. cz is always positive
modelview = Matrix().look_at(cx,cy,cz, # eye position coords
cx,cy,0.0, # looking at this pt.
0.0,1.0,0.0) # a vector pointing up
投影矩阵也很简单,可以根据需要工作
aspect_ratio = float(Window.width)/Window.height
projection.perspective(90.0, aspect_ratio, 1.0, 400.0)
look_-at和perspective函数是用来模拟/封装一些同名或类似名称的GLU函数的
投影似乎工作正常,但是
问题
屏幕上的一个点可以被认为是定义了一条从相机眼睛到无穷远处的光线。我想知道光线与z=0定义的平面相交的x,y坐标
这是我为使这项工作正常进行的多次尝试之一
x,y # <--- mouse coords (I've tried range of [0..1], or [0..screenwidth])
z=0 # I have also tried z=cz
# create inverse proj. matrix with near set to the distance
# the camera is from z=0
proj = Matrix().identity()
proj.perspective(90.0, aspect_ratio, cz, cz+1.0)
proj_i = proj.inverse()
# create inverse modelview matrix
modelview_i = modelview_mat.inverse()
x,y,z = proj_i.transform_point(x,y,z)
x,y,z = modelview_i.transform_point(x,y,z)
这不管用。具体地说,当我的相机稳定地移开时,cz逐渐增加。鼠标单击的x、y不会随着相机的移动而改变
我做错了什么
我知道有很多类似的问题,但我一直无法找到我要查找的信息。在处理透视变换时,必须包含w组件。在变换之前将其设置为1,然后在变换之后将x,y,z除以w。虽然我无法实现这一点,但我将策略转换为几何方法来拾取光线。之后,我能够实现所需的功能。