0

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

4

1 回答 1

0

这与您在光线追踪中用于将屏幕坐标转换回 3D 空间中的光线的数学相同。

这是来自旧版 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 拾取”。

于 2015-01-28T06:58:15.693 回答