강의/컴퓨터 그래픽스

Viewing Transformation

SniKuz 2024. 1. 25. 16:47

목차

 

투영 (Projection)

● 3D 물체를 어떻게 2D 화면에 그릴까?

3D 물체 → Image Plane

3D 물체를 image plane에 투영합니다. Object Space → View, Screen Space로 직선이 직선으로 투영됩니다.
투영은 x, y, z값을 무시해서 투영되거나 전단(Shear)되는 등이 있습니다.

x, y, z, 대각선

 

  투영의 종류

(a)평행 Orthographic vs (b)원근 Perspective

1. 평행 투영(Parallel projection)
투영 직선이 모두 평행인 경우입니다. 정사 투영과 경사 투영 2가지가 있습니다.

    ■ 정사 투영(Orthographic projection) : 투영 직선들이 이미지에 수직으로 만나는 경우입니다.
    ■ 경사 투영(Oblique projection) : 투영 직선들이 이미지에 비스듬하게 만나는 경우입니다.

2. 원근 투영(Perspective projection)
투영 직선이 한점(viewpoint)를 지납니다. 3D 물체에서 viewpoint를 잇는 투영 직선들과 image plane의 교점들로 2D 이미지가 생성됩니다.

Perspective Projection

 

 

뷰잉 변환 (Viewing Transformation)

 

● Viewing Transformation?

eye에서 view volume

■ 뷰잉변환 
물체 공간(Object Space)에서 여러 변환을 거치며 실제 사용자에 화면 공간(Screen Space)에 물체를 표현하는 과정으로 3D Scene의 뷰잉 변환은 사진을 찍는 과정과 비슷합니다.
카메라 위치, 카메라 방향(orientation), Viewing window(zooming)

View Transformation 과정

■ 그래픽스에서의 뷰잉변환
정준좌표계(canonical / global coordinate system)에서 (x, y, z)로 표현하는 3D 점들의 이미지 위에서의 위치를 pixel 단위로 계산합니다. 아래 변환들의 결합입니다.
1. Camera transformation (eye tranformation)
    - 카메라를 원점에 위치시키는 강체변환(rigid body transformation = 이동 + 회전)
    - 카메라의 위치와 방향에 따라 달라집니다.
2. Projection transformation
    - 카메라 좌표계의 모든 점들의 x, y를 [-1,1] x [-1,1]에 위치시킵니다.
    - 투영의 종류에 따라 달라집니다.
3. Viewport transformation(windowing transformation)
    - 이미지를 screen coordinate (pixel 좌표계)로 맵핑시킵니다.
    - 출력 이미지(screen)의 크기와 위치에 따라 달라집니다.

 

● 1. Modeling transformation (Object space → World space)

Object Space에서 World Space로 변환되는 과정입니다. 임의의 view volume을 생성합니다.
*view volume : 3차원 그래픽에서 2차원 공간으로 전단되고 투영될 실제적 공간

■ Modeling(Object/Local) Coordinate 
3D 물체들을 각각의 지역 좌표계에서 표현하며, 각각의 물체가 다른 원점과 축을 가지고 있습니다.
Modeling : 3D 물체들을 점들의 집합으로 표현하고, 면을 mesh로 정의합니다.

■ World(Canonical/Reference) Coordinate
모든 물체를 하나의 좌표계에서 표현합니다. 3차원 상의 임의의 원점과 축을 가집니다.

 

 

● 2. Camera transformation (World space → Camera space) M_cam

임의의 위치에 있는 카메라를 가지고 카메라 좌표계를 찾아,  카메라 좌표계를 이용해 임의의 view volume을  orthographic view volume으로 변환할 준비를 합니다. 즉 카메라 위치가 임의인 Scene을 그릴 준비를 합니다.

e : 카메라 위치
g : 카메라가 바라보는 방향 (viewing direction = gazing direction)
t : 카메라의 위쪽 방향 (view-up vector)
3가지를 가지고 카메라 좌표계를 표현하는 직교좌표계 uvw를 외적을 이용해서 다음과 같이 찾습니다.

uvw 좌표계 구하기
이후 uvw 좌표로 view volume 조작

 

 

● 3. Projection transformation (Camera space → Canonical view volume) 

■ Orthographic Projection Transformation (직교/평행 투영 변환) M_orth

임의의 view volume(view direction : -z axis, up direction : +y axis, (x,y) 임의의 직사각형)을 Canonical view volume으로 변환하는 과정입니다. Canonical view volume은 (-1,-1,-1), (1,1,1)을 범위로 가진 view volume입니다.

임의의 view volume에서 2개의 점을 쓰는데 (left, bottom, near) 점과 (right, top, far)점 2개로 view volume에 범위를 알 수 있습니다.

M_orth

직교투영변환 M_orth 행렬은 임의의 view volume [left, right] x [bottom, top] x [near, far]을 [-1,1] x [-1,1] x [-1,1]로 변환하는 과정이며 이는
1) 원점을 맞추고 (Translate(-left, -bottom, -near))
2) 크기 조절을 하고 (Scale(2/r-l, 2/t-b, 2/f-n)) 
3) 다시 위치를 조정(Translate(-1, -1, -1)
하는 과정이며 그 식은 위와 같습니다.

Perspective Projection Transformation (원근 투영 변환) M_per = M_orth P

eye → view plane  → view volume

평행 투영 변환은 그냥 그대로 view volume을 view plane으로 가져오면 되지만 원근 투영 변환은 한 점에서 소실되야 합니다. 그렇다면 위와 같이 카메라 위치(e), 바라보는 방향과 view plane에 위치, 물체에 위치가 주어질텐데 이를 비율에 맞춰 변형해줘야 하고 이 변환을 P라고 하겠습니다.

먼저 2D 투영을 보면 위와 같은 형태를 띄고 있습니다. 3D도 이와 동일하게 작용하는데 차이점이 있다면 z축이 있다는 점입니다. 

$$ P = \begin{bmatrix}
n &0  &0  &0  \\
0 &n  &  0&  0\\
0 &0  &  f+n&-fn  \\
0 &0  &  1& 0 \\
\end{bmatrix} $$

P변환 행렬은 다음과 같으며 변환 이후에도 z값의 ordering을 유지하지 위해 z축에도 값이 들어가 있습니다. z 값을 유지하는 이유는 z값이 hidden surface removal(가려져서 안보이는 부분)에 유용하기 때문이라고 합니다.
자연스럽게 P의 역행렬이 원근 투영 전으로의 변환이 됩니다. 
조금더 자세한 식은 여기서... https://www.songho.ca/opengl/gl_projectionmatrix.html

원근 변환 이후 평행 투영으로 화면 표시

원근 투영을 위한 변환 P를 한 후에는 다시 평행 투영으로 화면에 보여주면 끝납니다. 즉 원근 투영을 위한 변환 M_per이 원근투영을 위한 비율 변환 P와 평행 투영 변환 M_orth에 결합입니다.

■ FOV (Field Of View)

화면상의 시야각 θ로 화면의 zoom을 결정합니다.
각도가 감소하면 카메라(눈)의 위치를 멀리 이동하는 것과 같은 효과가 나며 zoom in 효과가 됩니다.
각도가 증가하면 카메라(눈)의 위치를 view plane 쪽으로 이동하는 것과 같은 효과가 나며 zoom out 효과가 됩니다.

 

● 4.Viewport transformation (Canonical view volume → Screen space) M_vp

Canonical view volume에 있는 모든 3D 좌표를 스크린 위의 pixel좌표로 변환시키는 작업입니다.
*Canonical view volume : (x,y,z)좌표가 [-1,1] x [-1,1] x [-1,1]인 3D 큐브
*Pixel 좌표계 : [-0.5, n_x - 0.5] x [-0.5, n_y - 0.5] (n_x, n_y : x, y방향 pixel 개수)

z값 무시, 유지 시에는 z축 1로 추가

2D window 변환의 일종으로 z값을 무시하거나 유지하고 x,y 의 사이즈를 화면 크기에 맞게 변동시키는 과정입니다.

 

● Viewing Transformation M

뷰잉 변환 총과정

뷰잉변환은 결국 위 변환들을 계산해서 물체에 적용해 화면에 띄울 수 있게 세팅하는 과정입니다.

*참고 : https://www.songho.ca/opengl/