C++ 如何从Openscenegraph中的二维鼠标单击屏幕坐标点计算三维点(世界坐标)?

C++ 如何从Openscenegraph中的二维鼠标单击屏幕坐标点计算三维点(世界坐标)?,c++,opengl,graphics,3d,openscenegraph,C++,Opengl,Graphics,3d,Openscenegraph,我试图从用户在2d屏幕空间上选择的点在3D空间上放置一个球体。为此,iam尝试使用以下技术从2d点计算3d点,但该技术未给出正确的解决方案 mousePosition.x = ((clickPos.clientX - window.left) / control.width) * 2 - 1; mousePosition.y = -((clickPos.clientY - window.top) / control.height) * 2 + 1; 然后,Iam将鼠标位置乘以MVP矩阵

我试图从用户在2d屏幕空间上选择的点在3D空间上放置一个球体。为此,iam尝试使用以下技术从2d点计算3d点,但该技术未给出正确的解决方案

mousePosition.x = ((clickPos.clientX - window.left) / control.width) * 2 - 1;
    mousePosition.y = -((clickPos.clientY - window.top) / control.height) * 2 + 1;
然后,Iam将
鼠标位置
乘以MVP矩阵的
倒数
。但得到的结果是随机数

用于计算MVP矩阵:

 osg::Matrix mvp =   _camera->getViewMatrix() * _camera->getProjectionMatrix();

我怎样才能继续?谢谢。

假设鼠标位置在x和y的[-1,1]范围内标准化,以下代码将为您提供从鼠标坐标投影的世界坐标中的2个点:
nearPoint
是位于相机平台近平面上的3D点,
farPoint
位于平台远平面上。
然后你可以计算一条经过这些点并与你的平面相交的线

  // compute the matrix to unproject the mouse coords (in homogeneous space)    
  osg::Matrix VP = _camera->getViewMatrix() * _camera->getProjectionMatrix();

  osg::Matrix inverseVP;
  inverseVP.invert(VP);

  // compute world near far
  osg::Vec3 nearPoint(mousePosition.x, mousePosition.x, -1.0f);
  osg::Vec3 farPoint(mousePosition.x, mousePosition.x, 1.0f);
  osg::Vec3 nearPointWorld = nearPoint * inverseVP;
  osg::Vec3 farPointWorld = farPoint * inverseVP;

如何通过鼠标点击来计算深度坐标?我现在在xz轴上放置了一个平面@文森特:在这种情况下,你在做一个剪切平面。通常,这种计算使用点积,而不是一种剪切位置。我限制用户将球体放置在该平面上。不能将2d向量与4x4矩阵相乘。请显示您尝试的确切代码,包括相关声明。