Как рассчитать 3D-точку из 2D-координат?
Недавно я столкнулся с затруднительным положением, связанным с DirectX11 и вычислением трехмерной координаты. Я хочу преобразовать координату мыши в эту трехмерную координату. Я хочу, чтобы он действовал аналогично Maya или Unity при вставке модели многоугольника (куб по умолчанию и т. Д.) Или объекта сетки в пустое пространство. Какие шаги и математика мне нужны для расчета этой координаты?
1 ответ
Это та же математика, которую вы используете при трассировке лучей, чтобы преобразовать координаты экрана обратно в луч в трехмерном пространстве.
Вот код D3DXMath из старого образца DirectX SDK "Pick10"
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 Code Gallery в течение некоторого времени, но он еще не достиг вершины стека. Код выше предполагает левосторонние координаты.
Помните, что двухмерное положение экрана плюс матрица преобразования обеспечивают только 2 из 3 степеней свободы, поэтому вы должны сделать некоторое предположение о глубине.
Также ищите термины "комплектация в 3D".