화면에 한 점을 클릭하면 시야 절두체 가까운 면의 정점 하나가 대응되고, 시점 위치와 그 정점을 잇는 반직선을 계산한 뒤에 각 물체와 반직선을 교차 판정하고, 여러 개의 물체가 반직선과 겹친다면 가장 가까운 물체를 선택하면 된다.

 

17.1 화면에서 투영 창으로의 변환

뷰포트 변환은 래스터화 단계에서 일어난다.

원점 (0, 0, 0)에서 시야 공간의 평면 z = 1에 투영된 정점으로 나아가는 반직선을 계산 할 수 있다.

 

17.2 세계 공간과 국소 공간의 선택 반직선

17.3 반직선 대 메시 교차 판정

1. 반직선이 메시의 경계 상자와 교차하는지 먼저 확인한다.

BoundingBox와 BoundingSphere 구조체에 Intersects 함수를 사용한다.

ㄴ 교차 여부를 반환하고, 출력 매개변수로 반직선의 원점에서 교차 지점까지의 거리를 반환한다.

 

2. 교차하는 경우에는 반직선과 메시 내의 삼각형 교차 판정을 진행한다.

ㄴTriangleTests::Intersects 함수를 사용한다.

ㄴ 메시에 존재하는 모든 정점이 이루는 삼각형에 교차 판정을 수행해가며 가장 짧은 거리를 반환하는 삼각형 정보를 저장한다.

 

17.4 선택 예제 프로그램

물체의 RenderItem과 하이라이팅 RenderItem이 따로 존재한다.

두 RenderItem은 같은 기하구조 (정점 리스트)를 사용하는데  하이라이팅 RenderItem의 indexcount는 3이다 (삼각형 하나만 그린다)

하이라이팅 RenderItem의 StartIndexLocation은 RenderItem초기화 시에 결정 되는 것이 아니라 커서 우클릭 위치(반직선)와 물체 renderitem의 boundingbox가 교차하여 RenderItem을 구성하는 정점들이 이루는 모든 삼각형과 교차 판정을 진행하다가 교차하는 경우에 결정된다. (교차점과의 거리가 더 짧은 삼각형이 있으면 새로 갱신)

 

RenderItem에 Visible 속성이 추가 되었는데 이는 하이라이팅 renderitem만을 위한 속성이다. 물체 renderitem에는 속성을 지정할 필요가 없다. 

 

반직선이 boundingbox와는 교차하는데 모든 삼각형과 교차하지 않는 경우는 하이라이팅 renderitem의 Visible 속성을 true로 갱신하지 않는다.

 

RenderItem들에 대한 DrawIndexedInstance 함수를 호출하기 전에 Visible인지 확인하는데 Visible이 false이면 함수가 호출되지 않는다.(물체 RenderItem의 Visible 속성은 항상 true)

 

연습문제 

1.

BoundingBox를 BoundingSphere로 바꿈

bounds.Radius = XMVectorGetX(XMVector3Length(0.5f*(vMax - vMin))); // BoudingSphere 구조체에는 반지름을 채워줘야 함

 

3. 

8진 트리는 3차원 공간을 재귀적으로 분할하는데 사용된다. 

트리의 노드 한개는 BoundingBox를 가진다.

 

노드 한개에 포함된 객체(물체)는 BoundingBox 안에 완전히 있어야 한다. (가정)

ㄴ 느슨한 옥트리 ( 노드의 경계 입체 자체를 조정 )

 

노드를 적절한 수로 분할한다면 여러개의 물체의 BoundingBox가 한 개의 노드에 들어가게 된다.

선택 함수를 수행할 때 모든 물체의 BoudingBox와 반직선 간의 교차 검증을 하지 않고 모든 노드들의 BoundingBox와 교차 검증을 먼저 실행하면 판정 횟수가 줄어들 여지가 있다.

 

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/17

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

 

 

+ Recent posts