컴퓨터 그래픽스

2024.7.20(토) - 12장 스크린 물체 조작

새우급여기 2024. 7. 21. 17:59

물체 선택

PC 스크린에서는 위 그림과 같이 마우스를 클릭하여 물체를 선택할 수 있다.

이를 피킹이라고 한다.

스크린 공간 광선

스크린에서 선택된 점의 위치가 주어지면 광선을 만들 수 있다.

카메라 공간 광선

카메라 공간 광선도 그 자신의 시작점, 방향 벡터로 정의된다.

위 그림은 카메라 공간에서 스크린 공간까지의 변환을 보여준다. 뷰포트의 앞면은 뷰 프러스텀의 전방 평면에 해당되므로, 뷰포트 앞면에 놓인 시작점은 카메라 공간의 전방 평면으로 변환된다.

위 식의 결과는 뷰포트 행렬에 의해 스크린 공간으로 변환된다.

스크린 공간 광선의 시작점은 카메라 공간의 (xc, yc, -n)으로 변환되는데, xc와 yc는 투영 변환과 뷰포트 변환을 사용하여 계산할 수 있다. 한편 카메라 공간의 원점과 광선의 시작점을 잇는 벡터를 카메라 공간 광선의 방향 벡터로 설정할 수 있다.

수식의 x좌표는 xs와 같고, y좌표는 ys와 같다는 사실을 이용하면 xc와 yc를 계산할 수 있다.

카메라 공간 광선의 시작점은 위와 같이 얻어지고,

방향 벡터를 계산하면 다음과 같다.

이것이 바로 스크린 공간 광선의 방향 벡터이다.

 

오브젝트 공간 광선

카메라 공간 광선을 이제 월드 공간으로, 그 다음에 오브젝트 공간으로 변환할 것이다.

먼저 월드 공간으로의 변환을 위해서는 뷰 변환의 역이 필요하다.

위 행렬은 카메라 공간 광선을 월드 공간으로 변환하는데, 아래 그림의 첫 단계가 이에 해당한다.

뷰 변환의 역을 이용해 카메라 공간 광선이 월드 공간으로 변환된다.

그 다음, 월드 공간 광선은 월드 변환의 역을 이용해 오브젝트 공간으로 변환된다.

위 그림의 두 번째 단계는 월드 변환의 역이 월드 공간 광선에 적용되므로, 구와 주전자는 각기 다른 오브젝트 공간 광선을 가지게 되는 것을 보여준다.

광선을 매개변수 방정식으로 표현하면 다음과 같다.

 s는 시작점을, d는 방향 벡터를 의미하는데, 매개변수 t는 [0, ∞] 범위에 있다.

 3차원 광선은 매개변수 방정식으로 표현된다. 구와 주전자 오브젝트 공간에서 s의 좌표는 다르다. 마찬가지로 d도 다르다.

이러한 오브젝트 광선을 통해 구와 주전자 중 어떤 것을 선택해야 할까?

광선과 바운딩 볼륨 간 교차 검사

삼각형마다 교차 검사를 수행하는 것은 많은 시간을 필요로 한다.

이보다는 부정확하지만 훨씬 빠른 방법이 있는데, 바로 각 메시를 완벽히 감싸는 바운딩 볼륨을 구한 뒤 이를 광선과의 교차 검사에 이용하는 것이다.

가장 많이 사용되는 바운딩 볼륨 - AABB, 바운딩 구

AABB와 바운딩 구 계산법이다.

바운딩 구를 얻는 가장 단순한 방법은 AABB를 이용하는 것인데, AABB의 중점을 바운딩 구의 중심으로 취하고, AABB의 대각선 길이의 반을 바운딩 구의 반지름으로 취하면 된다. 이는 (c)에 그려진 바와 같다. (d)는 최적화된 가장 작은 바운딩 구를 보여준다.

위 두 예시에서 교차점의 위치가 다른 것을 확인하고 넘어가자. 광선과 바운딩 볼륨 간 교차 검사 방법은 수행 속도는 빠르지만 부정확한 결과가 나올 수 있다.

3차원 광선은 위와 같은 3개의 매개변수 방정식으로 정의된다.

바운딩 구는 아래와 같은 함수로 정의되며,

첫 번째 수식을 보고 두 번째 식 x,y,z에 각각 대입하면 아래와 같은 형태의 2차 방정식을 얻는다.

근의 공식을 사용해 근을 계산하면, 그 것이 광선과 바운딩 구 간 교차점에서의 매개변수가 된다.

판별식이 양수라면 서로 다른 두 실근을 얻을 것이고, 그 것을 t1, t2라고 하자.

(a)는 이를 기하적으로 해석한것이다. t1은 t2보다 작은데, 이것이 바로 광선과 바운딩 구 교차점이다.

(b)는 t1이 중근이므로 광선은 구에 접하는 모습, (c)는 광선이 구와 부딪히지 않으므로 실근이 없음을 보여준다.

오브젝트 공간에서의 광선-물체 교차 검사.

주전자가 광선과 처음으로 교차하는 물체로 선택된다.

광선과 바운딩 구 간 교차 검사가 전처리 단계에서 수행된다.

(a)는 광선이 바운딩 볼륨과 교차하므로 광선-삼각형 교차 검사를 수행한다. 하지만 실제로 교차는 일어나지 않는다.

(b)는 광선-삼각형 교차 검사를 생략한다.

(c)는 검사를 수행한다. 또한, 실제로 교차가 일어남.

광선과 삼각형 간 교차 검사

광선-삼각형 교차 검사.

(a)에서 광선과 삼각형 <a, b, c> 는 p점에서 교차하는데, 이 삼각형은 p에 의해 세 개 작은 삼각형 <p,a,b>, <p,b,c>, <p,c,a>로 나눠진다. 이중 정점 a의 건너편에 있는 삼각형 <p,b,c>가 원래 삼각형 <a,b,c>에서 차지하는 면적의 비중을 u라고 하자. 이는 p가 a에 얼마나 가까이 있는지를 말해준다.

정점 b 건너편 삼각형이 <a,b,c>에서 차지하는 면적 비중을 v, 정점 c 건너편 삼각형이 <a,b,c>에서 차지하는 면적 비중을 w라고 하면, p는 위와 같이 세 정점의 가중치 합으로 정의된다.

여기서 (u,v,w)를 삼각형 <a,b,c>에 대한 p의 무게중심 좌표라고 부른다.

아래처럼 식을 다시 쓸 수 있다.

광선은 매개변수 방정식 s+td로 표현된다.

이를 다시 쓰면 다음과 같다.

d, A, B, S 모두 3차원 좌표이므로 다음과 같은 선형 시스템으로 정리된다.

이는 크레이머 법칙으로 풀 수 있다.

광선이 주전자와 여러 번 부딪힌다. 이 경우 가장 작은 매개변수 t1이 선택된다.

 

물체 회전

아크볼을 이용한 물체 회전이다.

(c)에 보인 바와 같이 정사작형 스크린 뒤에는 아크볼이라는 가상의 구가 존재한다.

이는 222 크기의 정육면체 안에 놓여 있는데, 그 중심 좌표는 (0, 0, 0)이고 반지름은 1이다. 스크린 위에서 움직이는 손가락은 이 아크볼을 정육면체 안에서 돌릴 것이고 그만큼 주전자가 회전할 것이다.

 


이미지 출처: [OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]

위 서적을 보고 공부한 내용을 정리함