Math 如何从二维坐标计算三维点?

Math 如何从二维坐标计算三维点?,math,3d,directx,directx-11,reverseprojection,Math,3d,Directx,Directx 11,Reverseprojection,我最近遇到了一个困境,涉及DirectX11和3D坐标的计算。我希望将鼠标坐标转换为此三维坐标。我希望在将多边形模型默认立方体等或网格对象插入空白空间时,它的行为类似于Maya或Unity。计算此坐标需要哪些步骤和数学?这与光线跟踪中用于将屏幕坐标转换回三维空间中的光线的数学相同 下面是来自传统DirectX SDK示例Pick10的D3DXMath代码 const D3DXMATRIX* pmatProj = g_Camera.GetProjMatrix(); POINT ptCursor;

我最近遇到了一个困境,涉及DirectX11和3D坐标的计算。我希望将鼠标坐标转换为此三维坐标。我希望在将多边形模型默认立方体等或网格对象插入空白空间时,它的行为类似于Maya或Unity。计算此坐标需要哪些步骤和数学?

这与光线跟踪中用于将屏幕坐标转换回三维空间中的光线的数学相同

下面是来自传统DirectX SDK示例Pick10的D3DXMath代码

const D3DXMATRIX* pmatProj = g_Camera.GetProjMatrix();

POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );

// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / pd3dsdBackBuffer->Width ) - 1 ) / pmatProj->_11;
v.y = -( ( ( 2.0f * ptCursor.y ) / pd3dsdBackBuffer->Height ) - 1 ) / pmatProj->_22;
v.z = 1.0f;

// Get the inverse view matrix
const D3DXMATRIX matView = *g_Camera.GetViewMatrix();
const D3DXMATRIX matWorld = *g_Camera.GetWorldMatrix();
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMATRIX m;
D3DXMatrixInverse( &m, NULL, &mWorldView );

// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
vPickRayDir.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
vPickRayDir.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
一段时间以来,我一直想将它转换为DirectXMath并将其重新发布到MSDN代码库,但它还没有到达堆栈的顶端。上面的代码采用左手坐标

请记住,2D屏幕位置加上变换矩阵仅提供3个自由度中的2个,因此必须对深度进行一些假设


也可以在3D中搜索术语拾取。

我不是您提到的任何软件的专家,但立方体是一个3D对象,当电脑鼠标在2D中移动时,在电脑键盘中,第三个维度始终是一个常量。我建议你澄清你的问题。因此,从那里我只做三角学来确定最终位置,对吗?是的,基于你认为用户实际上想要的关于射线上的3D点的任何假设。然后我有最后一个问题。方向向量的单位是多少?不管你的世界坐标是多少,它是一条射线。它作为世界空间中的一个位置和方向向量。这将在3个空间中为您提供一行点,用户用鼠标“结束”。对于拾取,您将使用传统的光线三角形(通常带有光线边界体积早期检出测试)来找出“命中”的对象。