그래픽스/DirectX12

[Directx12][17장]3차원 물체의 선택

우향우@ 2023. 3. 21. 21:49

개요

화면의 한 점을 클릭하여 해당 위치의 물체를 선택하는 로직을 구현할 수 있다. 이는 해당 방향으로 시야 원점에서 반직선을 쏘고 충돌하는 물체를 찾음으로써 구현 할 수 있다.

선택 반직선

위에서 설명한 반빅선을 선택 반직선이라고 한다. 선택 반직선은 다음 과정을 통해 특정 오브젝트의 국소 공간 기준 반직선으로 계산될 수 있다.

1. 클릭된 뷰표트 좌표를 얻는다.

2. 뷰포트 좌표에 뷰포트 너비,높이 및 투영행렬의 00, 11번째 요소로 z값이 1인 투영창에서의 클릭 투영점을 얻는다.

3. 해당 투영점으로 시야공간에서의 반직선을 구할 수 있다.

4. 역 시야행렬을 곱해 월드 공간에서의 반직선을 구할 수 있다.

5. 각 오브젝트별로 역 월드행렬을 곱해 국소 공간의 반직선을 구할 수 있다.

위에서 2번의 과정을 좀더 자세히 이야기하면 다음과 같다.

1. 뷰표트 좌표를 NDC좌표로 변환한다.

2. NDC 좌표에서 x축에 종횡비로 곱하면 시야공간 상에서 y축이 -1 ~ 1 인 투영창 기준에서의 x,y좌표를 얻을 수 있다.

3. cot(수직시야각/2)로 투영창의 z축을 얻을 수 있다.

4. z 거리가 1인 투영창과 위 투영창의 관계식을 통해 투영행렬의 00, 11 번째 요소로 z값이 1인 투영창에서의 투영점을 얻을 수 있다.

물체 선택

각 물체별 로컬공간에서의 선택 반직선을 구했다면 다음과 같이 충돌을 검사한다.

물체의 경계 입체와 반직선의 충돌을 검사하고 충돌하지않으면 넘어간다.

충돌 했다면 물체의 모든 삼각형에 대해 충돌을 검사하고 하나도 충돌하지않으면 비충돌, 하나라도 충돌하면 충돌로 판정한다.

이렇게 판정하여 가장 가까운 삼각형이 충돌된 물체가 선택된 것으로 간주한다.

참고서적

DirectX 12를 이용한 3D 게임 프로그래밍 입문