kwan's note

물체 선택과 회전 (screen object manipulation) 본문

graphics VR AR/Computer Graphics -Korea Univ

물체 선택과 회전 (screen object manipulation)

kwan's note 2021. 6. 28. 11:34
반응형

본 학습노트는 2021년 1학기 고려대학교 한정현 교수님의 컴퓨터 그래픽스 강의를 수강하고 이 내용을 기반으로작성하였습니다.

 

이전시간: https://reminder-by-kwan.tistory.com/139

 

이제 스크린에서 물체를 선택하는 방식과 회전하는것에 대해 알아보고자 합니다.

우리가 스크린을 조작하여 물체를 선택할 때 어떤 물체가 선택되는지, 손가락으로 물체를 슬라이드하면 어떻게 돌아가는지등에 대해 알아봅시다.

 

먼저 물체를 선택하는것은 간단하게 본다면 screen 에서 z값이 가장 작은 ( 카메라와 가장 가까운) 물체를 선택하게 됩니다. 이는 매우 간단한 작업처럼 보이지만 여기에는 생각보다 고려해야할 점들이 많습니다.

 

가장 가까운 물체를 선택하는 방식은 레이저를 쏴서 가장 먼저 맞는 물체를 선택하는것과 동일합니다.

우리가 스크린의 x,y 좌표를 클릭한다면 스크린에서는 (x,y,0)에서 (x,y, MAX(z)) 으로 향하는 레이저를 쏘게 됩니다.

하지만 우리의 스크린에는 물체의 구분이 없습니다. 물체에 대한 정보가 없으므로 우리는 이 레이저를 object 공간까지 이전하여 레이저가 물체에 닿는지 검사해야합니다.

 

따라서 우리는 이 레이저의 스크린공간에서 카메라 공간까지의 변환을 다루고, 카메라 공간에서 오브젝트 공간까지의 변환을 진행해야 합니다.

카메라 공간에서 clip space까지 그리고 NDC에서 screen space까지 변형을 다시 살펴봅시다.

 

우리는 이 변환과정의 역변환을 통해 레이저를 camera space로 보내고자 합니다.

 

screen space에서 x,y로 선택된 좌표로 부터 출발한 레이저인 x,y,-n은 다음과 같은 변형을 거쳐 카메라 스페이스에서 정의된다.

 

 

 

 

 

 

이렇게 카메라 공간에서 정의된 레이저를 이제 월드공간으로, 오브젝트 공간으로 이동시켜 물체와의 교차여부를 판단하고 이때 n값을 이용해 가장 먼저 교차된 물체를 선택할 것입니다.

이제 우리는 screen 공간에서 선택된 x,y 좌표로 부터 minz to maxz 로 향하는 레이저를 정의하고

이를 카메라 공간까지, 다시 object space에서 정의하였다. 이제 object space에서 정의된 레이저를 이용해

물체와 교차하는지 알아보도록 하자.

 

레이저와 하나의 삼각형이 이루는 평면이 만나는 점을 p라고 하자. 이때 교차점은 새로운 면적 index u,v,w 를만들 수 있다. p와 a,b,c가 이루는 세개의 면적을 각각 u,v,w라고 하자

 

당연히 u+v+w =1 이다. (합이 삼각형의 면적이므로)

우리가 알고 있는 레이저와 삼각형의 vertex 좌표를 이용해 위 u,v,n값을 구할 수 있다.

이때 w 는 1-u-v이다.

이렇게 구한 u,v,w를 이용해 p점이 삼각형의 내부에 있는지 외부에 있는지 알 수 있게 된다.

삼각형의 외부에서 교차하게 된다면 u,v,w의 값중 하나의 값이 0보다 작은값을 가지게 될 것이다.

반대로 모든 값이 양수라면 삼각형과 레이저가 교차한 것이다.

 

이렇게 물체의 모든 삼각형에 대해 검사를 하면 물체가 교차하는지 여부와 해당 교차삼각형을 알 수 있게된다.

또한 t값을 알게되므로 어떤 물체가, 어떤 삼각형이 가장 먼저 교차하는지 알 수 있게된다.

 

하지만 여기에는 한가지 단점이 있다. 연산량이 너무많다는것이다.

하나의 폴리곤 메시는 수천개, 수만개 혹은 수백만개의 삼각형으로 이루어져있다. 따라서 이런 방식의 교차여부 판별법은 하나의 object와의 교차만해도 매우 많은 연산이 필요하고 또 너무 많은 물체와의 검사를 해야한다.

 

따라서 이러한 문제를 해결하기 위해 근사적인 방법을 생각해볼 수 있다.

가장 간단하면서 rough 한 방식이 simple bounding volumn 교차 검사이다.

 

물체를 감싸는 바운딩볼륨을 정의하고 이 광선과 볼륨의 교차여부를 검사하는 것이다.

이는 모든 삼각형에 대해 검사하는것 보다 매우 cost가 낮다. 구에대해서 교차여부를 판단하자면

이차식 하나로 해결이 되기 때문이다. 하지만 정확도도 매우 떨어지게 된다.

이에따라 실제로는 이 둘을 혼합한 형태나 중간형태를 사용한다.

 

물체를 몇개 파트로 나누어서 각각의 파트에 대해 bounding volume을 설정하거나(연산량은 적으면서도 bounding volume의 부피합은 줄임으로서 오차를 최소화 하는 방식이 있다.

 

만약 오차가 없어야 하는 경우에는 bounding volume 여러개로 나누고 해당 bounding volume과 교차 검사를 진행 한 후 만약 교차한다면 그 bounding voulme에 속한 모든 삼각형과 교차연산하는 방식도 가능하다.

 

 

이제 물체의 회전에 대해서 보도록 하자.

스크린을 슬라이드 했을때 물체가 돌아가는 경험을 한 적이 있을것이다.

여기서는 p1에서 p2까지 하나의 단계에서 물체가 어떻게 회전하는지 보도록 하자.

 

arcball이라는 구체를 정의하고 이를 이용해 회전을 하는데 먼저 스크린의 w x h 크기를 2x2의 정사각형으로 normalize한다. 이 스크린을 2x2x2공간으로 확장하고 여기에 가상의구인 arcball을 만들자 구의 지름은2이다.

 

만약 우리가 p1을 선택하면 그 점을 p1x,p1y라고 하자.

이때 구와 해당 점이 만나는 점은 (p1x,p1y,sqrt(1-p1x**2, p1y**2))가 된다.

 

다음으로 p2에 대해서 동일한 방식으로 구와 교차점을 구한다.

이제 p1과 p2의 구 위에서의 점을 v1,v2라고 하면 v1이 v2로 회전하기 위한 각도(회전각)를 계산한다.

이제 이 회전각을 이용해 물체를 회전시키면 된다.

회전각은 v1과 v2의 내적을 이용하면 구할 수 있다. 즉, 회전각 theta는 arccose(v1 dot v2)가 된다.

 

다만 물체의 회전은 screen space에서 이루어 질 수 없다. 이는 물체 선택에서 보았던 이유와 동일하다.

따라서 물체를 object space로 이동시킨 후 회전을 구현해야 한다.

 

이번 노트에서는 스크린에 랜더링된 물체중 일부를 선택하고 회전하는것에대해 알아보았다.

반응형