Opengl 如何使用ModelViewProjection矩阵从屏幕空间到对象空间?

Opengl 如何使用ModelViewProjection矩阵从屏幕空间到对象空间?,opengl,matrix,Opengl,Matrix,所以我有一个正方形,我渲染每一帧。不是一个立方体,两个三角形。 我通过一个modelviewprojection P*V*M矩阵向着色器绘制这个正方形。 投影矩阵可以是透视投影或正交投影。 我一直在尝试传递屏幕坐标,将它们带到剪辑空间,然后与逆MVP矩阵相乘,但我没有得到结果。 基本上我需要计算出光标在正方形中的位置 以下是我迄今为止的代码: Matrix4 inverse = myMVP; inverse.invert(); Vector2 clippos((aGlobalPos.x / w

所以我有一个正方形,我渲染每一帧。不是一个立方体,两个三角形。 我通过一个modelviewprojection P*V*M矩阵向着色器绘制这个正方形。 投影矩阵可以是透视投影或正交投影。 我一直在尝试传递屏幕坐标,将它们带到剪辑空间,然后与逆MVP矩阵相乘,但我没有得到结果。 基本上我需要计算出光标在正方形中的位置

以下是我迄今为止的代码:

Matrix4 inverse = myMVP;
inverse.invert();

Vector2 clippos((aGlobalPos.x / width) * 2 - 1.0f, ((1.0f - (aGlobalPos.y / height)) * 2) - 1.0f);
Vector4 wspace = inverse * Vector4(clippos.x, clippos.y, 0, 1);
wspace.x /= wspace.w;
wspace.y /= wspace.w;
return Vector2(wspace.x, wspace.y);
我希望如果返回值在0->squareSize的范围内,它将被包含

有人能花点时间解释一下我做错了什么,为什么


谢谢

将反向MVP矩阵应用于屏幕位置将生成3D矢量,但您仅使用x和y坐标。为什么?还要注意的是,由于您没有来自鼠标光标的深度信息,因此此转换将仅为您提供对象空间中的方向向量,而不是单个位置。它将描述一条从相机位置发射到光标指向的方向的光线。因为正方形的原点是角,向量在对象空间中,我想我只需要检查X和Y值,因为在对象中Z与正方形的法线无关。不过我可能错了。再说一次:这个操作的结果不会是物体空间中的一个点;它将是一个从相机位置指向视图方向的矢量。因此,您需要计算转换到对象空间的摄影机位置,然后将光线摄影机->viewdir与您的对象相交。这可能只是吹毛求疵,但是:严格来说,此操作的结果将是对象空间中的一个点。它只是clip-sapce中x,y,0,1的非投影。在一般情况下,这当然不是特别有意义的一点。因此,我同意@cfh的观点:要么构造一条光线,要么将相机位置转换为对象空间,要么将两个具有不同z坐标的点取消投影并与其相交,要么尝试获取感兴趣点的剪辑空间z值,例如,从深度缓冲区读取窗口空间z并撤消深度范围转换。