게임엔진/DirectX

DX) 10. Picking

PJNull 2023. 6. 3. 14:04
728x90
반응형

Picking

Picking은 마우스 커서의 2차원화면 좌표가 주어졌을 때 그 좌표에서 투영된 3차원 물체를 알아내는 기법이다. 이를 위해서는 통상적인 그래픽 처리 과정을 뒤집어서 생각해야 한다. 지금까지 3차원 공간을 2차원의 화면 공간으로 변환해왔지만, Picking을 수행하기 위해서는 거꾸로 2차원에서 3차원공간으로 변환을 해야한다. 하지만 2차원 좌표에서 어떻게 3차원 좌표로 변환할수 있는 것일까? 이번 포스팅에서는 그것을 알아보고자 한다.

 

Picking의 원리

Picking에는 세가지 기법이 들어가는데, 첫번째는 앞서 말한 2차원 좌표를 3차원 좌표로 바꾸는 UnProjection이다.UnProjection으로 얻은 좌표를 이용하여 백터를 생성하는데 이것이 바로 RayCasting이라는 벡터이다. RayCasting를 이용하여 충돌하는 오브젝트를 찾고 충돌이 탐지 되었으면 해당 오브젝트의 정보들을 가져오는것이 바로 Picking의 원리이다.

  

1.UnProjection

반복해서 말했듯이 Picking을 하기 위해서는 그래픽 처리 과정을 뒤집어야된다. 이때 View좌표계와 World좌표계중에서 Picking을 수행할 곳을 정해주면 된다.

A. Screen->Projection

처음으로 해야될것은 우리가 임의의 좌표를 찍었다고 가정했을때, 그 좌료를 Screen단계에서 Projection단계로 역행시키는 것이다. 그렇기에 Screen단계로 가기 위해 곱했던 것들을 역으로 곱하면 Projection단계로 갈수있다.

 

게임수학) Chapter6. World,View,Projection,Screen 행렬 (3)

XMMATRIX XM_CALLCONV XMMatrixLookAtLH( FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection); //EyePosition:카메라의 월드 기준의 좌표 //FocusPosition:카메라가 주시하고 있는 점 //UpDirection:대략적인 Up벡터 통

pjnull.tistory.com

 

 

B. Projection->View

마찬가지로 Projection으로 가기 위해서 곱한 행렬을 역으로 곱하여 View Space를 구해준다.

 

 

 

 

 

 

게임수학) Chapter6. World,View,Projection,Screen 행렬 (2)

카메라 (Local Local Space ↔ World Space) 변환행렬 보통 게임을 제작할 경우 우리가 보고 있는 쪽을 +로 하는 왼손 좌표계를 사용한다. 위의 식은 Wolrd변환행렬의 일반식이다. S.x/S.y/S.z는 x,y,z의 스케일

pjnull.tistory.com

 

 

 

C.RayCast

 

 

2.충돌 판정

 

 

 

 

오브젝트의 특정 Mesh를 Picking해야될 경우

위의 충돌을 이용한 Picking의 경우 배치되어 있는 경우 프로그래머의 편의를 위해 World좌표계나 View좌표계에서 Picking을 처리할수 있었다. 하지만 오브젝트의 특정 Mesh를 Picking해야될때는  World좌표계나 View좌표계가 아닌 Local좌표계에서 Picking을 판단해야된다. 그 이유는 무엇인가?

 

Local좌표계에서 Picking이 일어나야되는 이유

특정 Mesh를 Picking할때는 어째서 Local좌표계에서 행해져야하는가에 대한 질문은 Picking이 CPU에서 수행하고 있다는 사실을 고려해보면된다.

 

CPU가 들고 있는 정보는 오브젝트들의 Local좌표이다. 만약 충돌판정처럼 View나 World좌표계에서 처리하게된다면, 저 수 많은 Mesh들의 좌표를 랜더링파이프라인을 거쳐서 얻어야된다는 소리다. 그렇기에 모든 Mesh들이 World좌표나 View좌표로 이동하는 것보다 Ray혼자 해당 오브젝트의 Local좌표로 이동하는것이 훨씬 성능면에서 이득이라는 것이다.

 

 

728x90
반응형