본문 바로가기
Computer Graphics

컴퓨터 그래픽스 - Object Picking

by eigen96 2024. 3. 1.
728x90

 

Picking 했을때 우리가 얻을 수 있는 것은 스크린에서의 2차원 Pixel좌표 (x,y)밖에 없었다.

어떻게 주전자가 하이라이트되어 색이 바뀔까?

각 픽셀은 어떤 영역에 속하는지 정보가 없다.

3차원으로 넘어가서 기하적인 추론을 해야할 것이다.

 

 

그림에 보이는 박스는 View Port 영역이다.

2차원 Screen 공간에서는 커서가 (X_s, Y_s) 2차원 좌표로 주어지지만,

클릭한 점이 3차원 공간에서는(X_s, Y_s, 0)일 것이다.

여기서 뻗어나가는 ray를 생각해보자.

ray란 시작점이 있고 한쪽으로 무한하게 뻗어나가는 직선이다.

3차원 뷰포트에서 모든 Ray는 z축 방향으로 뻗어나간다고 생각하면된다.

이때 direction Vector는 (0,0,1)이다.

3차원 Ray가 뻗어나가면서 누구와 부딪치는지 판정하면 된다.

3차원 ViewPort는 개별 삼각형이 하나씩 들어오면 Scan Conversion 후 프래그먼트를 만들었던 곳이다.

하지만 이곳에 오브젝트에 대한 정보는 없었다.

그동안 배운 공간으로 Screen Space 전에 Clip Space, Camera Space, World Space, Object Space 등이 있었다.

WoldSpace → ClipSpace 까지 과정에서 오브젝트간 구별이 없었다.

결국 Picking을 위해서 마우스를 클릭한 곳인 Screen Space에서 Object Space까지 가야한다.

 

 

 

View Frustum 을 설정할때 네개의 파라미터를 썼었다(fovy,aspect,n,f)

n은 near plane까지의 거리였으며 양수값이었다. 따라서 View Frustum 전면의 실제 z좌표는 -n이었다.

카메라 좌표계에서는 View Frustum이 -z축을 바라보고 있기 때문이다.

 

 

  1. 카메라 공간에서의 레이: 카메라 공간에서 레이는 음의 Z축 방향으로 향하고 있으며, 이 공간에서 레이를 월드 공간으로 변환하는 것이 목표다.
  2. 월드 공간으로의 변환: 카메라 공간에서 월드 공간으로의 변환을 수행하기 위해, 월드 공간에서 카메라 공간으로 변환할 때 사용한 뷰 변환(View Transform)의 역변환을 적용한다. 뷰 변환은 주로 원점으로의 이동(Translation)과 uvn 시스템을 XYZ 축과 일치시키기 위한 회전(Rotation)으로 구성된다.
  3. 뷰 변환의 역변환: 뷰 변환의 역변환을 수행하기 위해, 회전(Rotation)과 이동(Translation)의 순서를 역으로 적용해야 합니다. 즉, 뷰 변환에서는 회전을 먼저하고 이동을 수행했지만, 역변환에서는 이동의 역변환을 먼저하고 회전의 역변환을 나중에 적용한다.
  4. 회전 변환의 역변환: 뷰 변환에서 사용된 회전 행렬은 uvn 벡터를 행으로 사용했다. 그 역변환은 uvn 벡터를 열로 사용하여 구성된다.
  5. 이동 변환의 역변환: 뷰 변환에서 원점으로 이동시키기 위해 사용된 이동 벡터가 -i였다면, 역변환에서는 i를 사용하여 원점에서 원래 위치로 되돌립니다. 이는 변환 행렬의 네 번째 열에 적용된다.
  6. 월드 공간의 레이 정의: 이렇게 구한 회전과 이동의 역변환 행렬을 곱하여 단일한 변환 행렬을 생성하고, 이를 카메라 공간의 시작점과 방향 벡터에 적용함으로써, 월드 공간에서 레이를 정의할 수 있다.
  7. 오브젝트 공간으로의 변환: 각 오브젝트는 월드 공간에서의 위치와 방향을 결정하는 고유한 월드 변환을 가진다. 오브젝트 공간으로 레이를 변환하기 위해서는, 각 오브젝트에 대해 이 월드 변환의 역변환을 적용해야 한다.
  8. 오브젝트별 레이 생성: 이 과정을 통해, 원래의 카메라 공간 레이는 각 오브젝트 공간에서 정의된 레이로 변환된다. 이는 월드 공간에서의 하나의 레이가 각 오브젝트에 대해 개별적으로 계산되어야 함을 의미.
  9. 전처리 과정: 실제 응용에서는 효율성을 위해, 가능한 한 많은 오브젝트를 사전에 걸러내는 전처리 과정을 수행할 수 있다.

 

 

 

Object Space Ray를 얻었다.

마우스 클릭이 수행될 때마다 이제 이 Ray를 이어서 실제 Object와 부딪치는지 알아내야한다.

어떠한 물체가 해상도가 높다고 가정하면, 삼각형이 10000개 있다고 하면

Ray와 삼각형 충돌 테스트를 10000번 해야한다.

가능하지만 부담되는 연산일 수도 있다.

정확하지 않더라도 빠른방법은… Polygon mesh의 삼각형을 직접 테스트하는 것이 아닌 mesh를 감싸는 bounding volume을 만들어서 이것과 부딪치는지 보는 것이다.

결과는 정확하진 않지만 적당한 타협점인 것이다.

 

이 방법은 다음 포스팅에서 정리해보도록 하겠습니다.

 

 

728x90

댓글