2015-01-29 5 views
0

Я недавно пытался вычислить точку 3D из положения мыши. До сих пор у меня есть это:Расчет 3D-координаты

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; 

Однако, как мои математические навыки тусклые, я не уверен, как использовать направление и начало производить позицию. Какие вычисления/формулы мне нужно выполнить для получения желаемых результатов?

ответ

0

Это как a * x + b, за исключением трех раз.

Для любого расстояния d (положительного или отрицательного) от vPickRayOrig:

newPos.x = d * vPickRayDir.x + vPickRayOrig.x; 
newPos.y = d * vPickRayDir.y + vPickRayOrig.y; 
newPos.z = d * vPickRayDir.z + vPickRayOrig.z;