2020년 7월 1일 수요일

Picking

1. 화면 좌표

x, y 가 화면의 해상도? 라고 하면 윈도우 좌표계는 다음과 같다.

좌상(0, 0) 우상(x, 0)

좌하(0, y) 우하(x, y)

상황에 따라서 API 함수를 써서 좌표를 가져오자.

2. Clipping Space

Clipping Space 좌표계는 다음과 같다.

좌상(-1, 1) 우상(1, 1)

좌하(-1, -1) 우하(1, -1)

y 좌표계가 뒤집어져 있음에 주의하자.

resolution 은 화면 해상도이다. 다음의 식으로 변환할 수 있다.

position_clip.x = + 2.0f * pos_window.x / resolution.x - 1.0f;

position_clip.y = - 2.0f * pos_window.y / resolution.y + 1.0f;

position_clip.z = 0.0f;

3. WorldRay

View, Projection 행렬로 지금까지 화면을 그렸을 거다.

View * Projection 행렬의 역행렬을 위에서 구한 clipping 좌표 에 곱해주면 된다.

이때 z 는 0 으로 하는게 편하다.

사실 크게 중요한건 아닌데 View 만들 때 사용한 zn 값으로 결과값의 z 값이 나오기 때문이다.

4. Intersect

이렇게 만든 ray 와 카메라 위치를 이용해서 위의 함수를 사용하면 picking을 할 수 있다.

D3DXIntersectTri(&p0, &p1, &p2, &org, &dir, &u, &v, &distance) 이런 모양인데,

p0, p1, p2 는 Primitive Triangle 을 이루는 세 정점을, org 는 카메라 위치, dir 은 worldRay 을 넣으면 된다.

worldRay 가 삼각형이 이루는 평면에 대해서 가지는 좌표가

position = p0 + (p1 - p0) * u + (p2 - p0) * v

이런 식으로 표현된다.

위 함수 관련은 아래가 정리가 잘되어있다.

댓글 없음:

댓글 쓰기

List