본문 바로가기
Graphics

Homogeneous Coordinates (동차좌표)

by HMangoo 2022. 4. 1.

OpenGL을 다루다 보면, Shader 프로그램의 Vertex Shader에서 Homogeneous Coordinates를 사용하는 것을 볼 수 있다. 컴퓨터 그래픽 분야에서 동차좌표가 사용되는 이유를 동차좌표에 대해 자세히 공부하며 알아본다. 

 

동차좌표?

Homogeneous는 "균일한" 이라는 뜻을 가지고 있다. 그렇다면 Homogeneous coordinates, 균일한 좌표라는 것이 무엇일까.

 

2D의 xy평면에서 직선의 방정식은 \( Ax + By + c = 0 \) 이다.

방정식의 x와 y 대신 각각 x/w, y/w로 치환하면, \( A(x/w) + B(y/w) + c = 0 \)으로 표현되며,

이 식의 양변에 w를 곱해주면 \( Ax + By + Cw = 0 \)이 된다.

 

2차 다항식에도 적용하면 (이 경우는 \( w^{2} \)을 곱해준다)

\(Ax^{2} + 2Bxy + Cy^{2} + 2Dx + 2Ey + F = 0 \)

\(Ax^{2} + 2Bxy + Cy^{2} + 2Dwx + 2Ewy + Fw^{2} = 0 \)

 

직선의 경우 \( x, y, w \) 항의 차수가 1이고

2차 다항식의 경우도 역시 모든 항 \( x^{2}, xy, y^{2}, xw, yw, w^{2} \)의 차수가 2이다.

두 다항식의 각 항의 차수가 모두 같아졌다. 이를 균일하다! Homogeneous하다! -> 동차좌표계이다.

또한, 3차원에도 동일하게 적용된다.

 

Why?

왜 굳이 치환하고, 곱해서 복잡하게 사용하느냐? 다 이유가 있겠죠.

동차 좌표계를 사용하는 이유 중 하나는 무한대의 개념을 활용할 수 있다는 것이다. 일단, 보통 사용하는 좌표계인 유클리드 좌표에서 무한대는 존재하지 않는다! 그러면 동차 좌표계에서는 어떻게 적용되나.

 

위에서 했던 방법을 보며 생각해보자. 어떤 두 실수 x, w가 있을 때 x/w에서 x를 고정시키고 w를 변화시킨다면,

이때, w를 계속 작게만들어주어 "0"에 가까워지면 a/w는 무한에 가까워진다.  

 

그러므로 유클리드 좌표에서 무한대의 개념을 사용하기 위해서는 두 수가 필요하며 (x, 0)를 무한대라고 정의할 수 있다.

이를 일반화하여 무한대의 개념을 (x, w)로 표현할 수 있는 것이다.

 

이 정의를 xy평면에 대입해보자. 한 점 (x, y)에 대한 동차좌표는 (x, y, 1)로 표현할 수 있다. 이때의 w=1이 되는 것이다.

즉 동차 좌표계에서 이 (x, y)를 일반화한 동차좌표는 (xw, yw, w)가 된다. (이때 w는 0이 아니다) -> 동차좌표의 단 한점으로 변환되지 않는 것을 확인할 수 있다(무한히 많이 존재한다).

 

그림으로 표현하면 아래와 같이 나타낼 수 있다. 동차좌표 (2,3,w)가 존재할 때, xyw좌표계에 표시한 것으로 w의 값을 점점 작게하여 0에 접근하는 것을 나타낸 것이다. 결국 동차좌표 (x, y, 0)은 (x,y)방향의 무한대라고 할 수 있다.

 

 

In Graphics

그래픽스에서 Homogeneous 좌표는 affine 변환과 perspective(projective) 변환을 위해 사용된다. 

정확히는 일반 좌표에서 복잡한 변환을 동차좌표에서는 단일 행렬로 표현할 수 있기 때문이다.

이떄문에 homogeneous좌표를 projective좌표라고도 부른다.

 

우리가 보는 카메라 영상(3D)는 3차원 공간의 점들을 이미지 평면(2D)에 투영(projection)시킨 것이다.

normalized image plane 상의 한 점 (x, y)의 homogeneous 좌표는 (x, y, 1)이다. 이때, 카메라 좌표계 역시 (u, v, 1)이다.

즉 카메라 좌표계와 homogeneous 좌표 표현과 정확히 일치한다.

 

homogeneous좌표 (x, y, w)에서 (x/w, y/w)를 구하는 것은 projection

반대로 (x,y)에서 homogeneous 좌표 (xw, yw, w)로 표현하는 것은 inverse projection 과정으로 볼 수 있다.

 

Reference)

https://blog.daum.net/shksjy/229 

https://darkpgmr.tistory.com/78  

 


Requirement 

Basis & Coordinates

Edward Angel, Interactive Computer Graphics: A Top-down Approach with WebGL, 7th edition, Pearson, 2014.

3D상의 벡터는 coordinate system을 정의하는 linearly independent vectors(basis)와 3D 유클리드 공간에서 정의된 좌표로 나타낼 수 있다.

  • Linearly Independent vectors(basis) : \( v_{1}, v_{2}, v_{3} \)
  • 3D coordinates : \( a_{1}, a_{2}, a_{3} \)
  • 3D vector : \( w = a_{1}v_{1} + a_{2}v_{2} + a_{3}v_{3} \)

이는 아래와 같이 matrix로 나타낼 수 있다.

 

frame과 homogeneous coordinates 

Beta는 Alpha로 설명함.

 basis와 coordinates에 더하여 원점을 나타낼 수 있는 한 점을 추가한다면 frame을 정의할 수 있다.

frame은 원점 \( P_{0} \)이 주어진 basis vetors이며 (\( v_{1}, v_{2}, v_{3}, P_{0} \)) = (\( \textbf{v}, P_{0} \))로 표현 하고 coordinate \( a_{1}, a_{2}, a_{3} \)가 주어졌을 때 한 점 P를 아래와 같이 쓸 수 있다.

\( P = P_{0} + a_{1}v_{1} + a_{2}v_{2} + a_{3}v_{3} = P_{0} + \alpha^{\tau }\textbf{v} \)

 

point P가 frame (\( v_{1}, v_{2}, v_{3}, P_{0} \))에서 정의 될 때 다음과 같이 표현되고,

\( P = P_{0} + a_{1}v_{1} + a_{2}v_{2} + a_{3}v_{3} \) = \( \begin{bmatrix}
 a_{1}&  a_{2}&  a_{3}& 1 \\
\end{bmatrix}
\begin{bmatrix}
 v_{1}\\
 v_{2}\\
 v_{3}\\
 P_{0}
\end{bmatrix} \) 

 

(\( a_{1}, a_{2}, a_{3} \))를 Homogeneous Coordinates에서 (\( a_{1}, a_{2}, a_{3}, 1 \))로 나타낼 수 있다.

 

Transformation

3D Transformation은 단일 \( 4\times4 matrix \)를 통해 나타낼 수 있다.

  • 왼쪽 위의 \( 3\times3 sub-matrix \)는 rotation, scaling, shearing(찌그러뜨림)을 포함
  • 오른쪽 위의 \( 3\times1 sub-matrix \)는 translation을 표현

원래의 좌표를 (\(x, y, z\)), 변환된 좌표를 (\(x', y', z'\))라 할때, homogeneous 좌표에서

각각 (\(x, y, z, 1\)), (\(x', y', z', 1\))로 표현할 수 있으며, 이때의 transformation은 위 그림과 같다.

 

Transformation은 Rigid Transformation(Rigid-body Transformation), Non-grid transformation으로 나뉜다.

 

왼쪽 : Rigid Transformation(Rigid-body Transformation) / 오른쪽 : Non-grid transformation

 

Rigid Transformation (Rigid-Body Transformation)

  •   어떤 순서로 얼마나 반복하는지에 상관 없이 transformed object의 모양이나 크기를 바꾸지 않는다.
  •  object의 location과 orientation을 바꾸는 transformation

Translation (평행이동) 

하나의 3D object를 translation 시킨다는 것은 object를 이루는 모든 vertex가 d만큼 translation한다는 것이다.

P = (\(x, y, z, 1\)), P' = (\(x', y', z', 1\)),

translation d = \( \begin{bmatrix}
 \alpha_{x}\\
 \alpha_{y}\\
 \alpha_{z}\\
 0
\end{bmatrix} \) 를 적용하면 아래와 같이 나타낼 수 있다.

Inverse translation의 경우에 아래와 같이 나타낼 수 있다.

벌써부터 homogeneous 좌표를 왜 쓰는지 알 것같다.

 

Rotation

회전에 대해서는 2D에서 먼저 살펴본다.

위와 같이 (x, y)에서 (x', y')로 회전하는 상황이다. 원점에서 (x, y)까지의 거리를 p라하자.

  • \( x = pcos\phi\)
  • \( y = psin\phi \)
  • \( x' = pcos(\theta + \phi) \)
  • \( y' = pcos(\theta + \phi) \)

와 같이 나타낼 수 있으며 x'와 y'를 x, y에 대한 matrix로 나타내면 다음과 같다.

  • \( x' = pcos\phi cos\theta - psin\phi sin\theta = xcos\theta - ysin\theta \)
  • \( y' = pcos\phi sin\theta + psin\phi cos\theta = xsin\theta + ycos\theta \)

\( \rightarrow \begin{bmatrix}
 x'\\
 y'
\end{bmatrix}
\begin{bmatrix}
 cos\theta& -sin\theta  \\
 sin\theta& cos\theta \\
\end{bmatrix} 
\begin{bmatrix}
 x\\
 y
\end{bmatrix} \)

이를 기반으로 3D rotation을 나타내면 다움과 같다. 각각 x, y, z axis에 대한 rotation transformation matrix이다.

Rotation \( R(\theta) \)에 대한 Inverse는 \( R^{-1}(\theta) = R(-\theta) = R^{T}(\theta) \)이다.

\( cos(-\theta) = cos(\theta), \,\, sin(-\theta) = - sin(\theta) \)로 나타내면 된다. 

 

Non-Rigid Transformations

Scaling

  • uniform caling : 모든 축에 따라 일정하게 object의 크기를 바꿈
  • non-uniform scaling : object를 축 방향에 따라 통일되지 않은 크기로 바꿈

간단하게 matrix만 알면 직관적으로 이해가 된다.

http://www.c-jump.com/bcc/common/Talk3/Math/Matrices/W01_0140_scaling_matrix.htm

  • \( x' = s_{x} \)
  • \( y' = s_{y} \)
  • \( z' = s_{z} \)
  • scaling factor : \( S = ( s_{x}, s_{y}, s_{z}) \)
  • \( S^{-1}( s_{x}, s_{y}, s_{z}) = (\frac{1}{s_{x}},\frac{1}{s_{y}},\frac{1}{s_{z}}) \)

Shearing

www.stackoverflow.com

 

하나의 예로 정 x방향으로의 shearing을 생각해보자. 편의를 위해 2D에서 식을 유도한다.

  • 사각형의 높이를 y라고 할 때, transformation된 y' = y이다.
  • \( tan\theta = \frac{x'-x}{y} \) 로 나타낼 수 있다.
  • 이때, \( cot\theta =  \frac{y}{x'-x} \)
  • \( x' = x +ycot\theta \) 이다.

x방향 shearing matrix in homogeneous coordinate

 

homogeneous coordinate와 기본적인 transformation을 알아보았다.

다음 글에서는 이를 활용하여 조금 더 발전된 transformation과 심화된 frame에 대해 살펴본다.

 

 

Reference)

https://medium.com/all-math-before-college/transformations-geometry-86643a5cb33b

https://www.brainvoyager.com/bv/doc/UsersGuide/CoordsAndTransforms/SpatialTransformationMatrices.html 

Edward Angel, Interactive Computer Graphics: A Top-down Approach with WebGL,7th edition, Pearson, 2014

'Graphics' 카테고리의 다른 글

OpenGL - Viewing & Camera -2  (0) 2022.04.07
Viewing & Camera -1 이론  (0) 2022.04.06
Transformation in homogeneous coordinates  (0) 2022.04.02
OpenGL?  (0) 2022.02.28
API ?  (0) 2022.02.28

댓글