DirectX - 마우스 픽킹 (Picking) : 3D게임 제작

2020. 10. 20. 23:11코딩/게임 개발

목적

- 3D 공간의 물체를 2D 화면의 입력장치인 마우스로 선택한다.

 

개념

화면에서 3D공간으로 레이저를 쏴서 가장 먼저 맞는 오브젝트가 내가 고르고자 하는 오브젝트이다.

 

 

방법론

- 3D공간을 구성하기 위한 파이프라인을 떠올려보자.

LocalMatrix -> WorldMatrix -> Veiw -> Projection -> Veiwport의 과정을 통해

2D 디스플레이에 3D 화면을 보여줄 수 있었다.

그럼 이제 2D에서 3D로 되돌아가는 과정이다.

조립은 분해의 역순이다. 즉 역순으로 역행렬을 곱해나가면 3D 공간으로 돌아갈 수 있다.

하지만 하나하나 되돌아가는건 매우 귀찮은 작업이기에 directX에서는 이 과정을 함수로 지원한다

D3DXVec3Unproject

 

D3DXVec3Unproject function (D3dx9math.h) - Win32 apps

D3DXVec3Unproject function In this article --> Projects a vector from screen space into object space. Syntax D3DXVECTOR3* D3DXVec3Unproject( _Inout_       D3DXVECTOR3  *pOut, _In_    const D3DXVECTOR3  *pV, _In_    const D3DVIEWPORT9 *pVie

docs.microsoft.com

 

위 함수를 사용하면 하나하나 곱해주는 과정을 생략해준다.

viewport, projection, view는 디바이스에서 Get으로 가져올 수 있다.

 

자 다시 3D 공간으로 돌아왔다면 우리는 3D 세계를 바라보는 방향에서 마우스 클릭을 한 것이다.

즉 시작점은 카메라의 위치가 된다.

시작점에서 한 점을 클릭. 눈치 빠른 분들은 감이 왔을 것이다.

ray를 통해 클릭을 구현할 수 있다.

카메라의 위치에서 내가 클릭한 곳으로 레이저를 쏴서 맞는 오브젝트가 내가 클릭한 오브젝트가 된다.

 

ray의 필수 구성요소는

시작점 / 방향

으로 시작점은 카메라의 위치이기에 구할 필요 없고 방향을 구해보자

이 또한 DirecX에서 함수를 제공한다.

DirectX 너무 쉬운 거 아닌가?! 너무 편리하잖아!!

D3DXIntersectTri 

 

D3DXMatrixLookAtLH function (D3dx9math.h) - Win32 apps

D3DXMatrixLookAtLH function In this article --> Builds a left-handed, look-at matrix. Syntax D3DXMATRIX* D3DXMatrixLookAtLH( _Inout_       D3DXMATRIX  *pOut, _In_    const D3DXVECTOR3 *pEye, _In_    const D3DXVECTOR3 *pAt, _In_    const

docs.microsoft.com

자세한 설명은 마소의 천재들의 설명을 참고하자.

 

읽고 왔는가?

아마 고민이 해결된 사람도 있고 아닌 사람도 있을 것이다.

위 함수는 버텍스와 ray의 교차를 알려주는 함수이고 그저 오브젝트와 ray의 교차를 알려고 할 때는 버텍스 하나하나를 체크할 필요가 없다.

그때는 단순 수학으로 해결할 수 있다.

ray는 선. 일반적으로 collider는 구.

선과 원의 교점 / 선과 구의 교점이라고 검색하면 많은 자료가 나온다 참고하자.

 

이제 개념적인 파츠 + 꿀팁 함수는 모두 설명하였다.

코드를 제공해주고 싶지만 변명을 해보자면

DirectX는 코드가 워낙 여기저기 흩어져있어서 이 코드를 써라 하고 제공하기가 쉽지 않다.

스스로 해보면 실력이 더욱 늘지 않을까?라는 궤변을 주장하며 글을 마치겠다. 

 

'코딩 > 게임 개발' 카테고리의 다른 글