2015-01-28 2 views
0

저는 최근에 DirectX11과 3D 좌표 계산과 관련한 곤경에 처했습니다. 마우스 좌표를이 3D 좌표로 변환하고 싶습니다. 다각형 모델 (기본 큐브 등)이나 메쉬 개체를 빈 공간에 삽입 할 때 Maya 나 Unity와 비슷한 기능을 수행하고 싶습니다. 이 좌표를 계산하는 데 필요한 단계와 수학은 무엇입니까?2D 좌표에서 3D 점을 계산하는 방법?

+0

내가 언급 한 소프트웨어에 익숙하지 않지만 큐브는 컴퓨터 마우스가 2-d로 움직이는 3-d 오브젝트입니다. 컴퓨터 패드에서 세 번째 diminesion은 항상 상수 값입니다 . 나는 당신이 당신의 질문을 명확하게 제안합니다. – NoChance

답변

0

이것은 광선 추적에서 화면 좌표를 다시 3D 공간의 광선으로 변환하는 데 사용하는 수학과 같습니다. 여기

내가 몇 시간 동안 MSDN 코드 갤러리에 DirectXMath로 변환하고 다시 게시하는 의미했던 기존의 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; 

에서 D3DXMath 코드이지만, 'hasn 스택의 맨 위에 올려 놓았습니다. 위의 코드는 왼손 좌표를 가정합니다.

2D 화면 위치와 변환 행렬이 3 자유도 중 2 가지만 제공하므로 깊이에 대해 몇 가지 가정을해야한다는 것을 기억하십시오.

"3D로 선택"이라는 용어를 검색하십시오.

+0

그래서 거기에서부터 최종 위치를 결정하기 위해 삼각법을 사용합니다. 맞습니까? –

+0

예, 사용자가 실제로 원하는 광선을 따라 3D 점을 만들려는 가정을 기반으로합니다. –

+0

그럼 마지막 질문이 하나 있습니다. 방향 벡터는 어떤 단위입니까? –