이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

Homogeneous Coordinates를 왜 쓸까?

  • 2020.04.28 17:36
  • Mathematics
글 작성자: Coding Groot

Homogeneous Coordinates에 대한 정리

수학적으로 $Homogeneous \ Coordinates$를 왜 쓰는지 이해는 못했다. 하지만 실용적으로 어떤 편의를 위해서 쓰는지는 알겠다. 검색하면서 정리한 여러 사용법에 대해서 적어보고자 한다.ㅠㅠ 

Homogeneous Coordinate란 무엇인가?

n차원의 좌표를 n+1개의 좌표로 나타내는 것이다. 3차원의 좌표는 $(X, Y, Z)$로 나타내지만 $Homogegeous \ Coordinate$는 한 차원($W$)을 더 추가해서 좌표를 표현한다. 여기서 기하학적으로는 $W$는 원근감을 조절하는 역할을 하게 된다. $W = 1$ 이면 아무런 크기의 변화가 없게 된다.

$ (1, 2, 3) $의 $Homogeneous \ Coordinate$ 표현은 $(1h, 2h, 3h, h)$이다.
$(1w, 2w, 3w, w) = (1, 2, 3, 1) = (2, 4, 6, 2)$ 전부 3차원의 $(1, 2, 3)$ 좌표와 동치이다. 


Matrix의 곱셈으로는 모든 Transfromation을 표현할 수 없다.

$Translation$은 보통 $Vector$의 덧셈으로 표현한다. 회전 변환처럼 하나의 $Matrix$만으로 표현할 수는 없을까?

$Affine \ Matrix$ $(Transformation + Translation)$은 다음과 같이 표현할 수 있다.
$X' = MX + T$ ($T$는 $Vector$, $M$은 $Matrix$) 
Translation을 하나의 $Matrix$로 표현하지 못해서 $Vector \ T$로의 $Vector$ 덧셈으로 표현했다.

$Homogeneous \ Coordinate$를 사용하면 Translation을 위한 $Vector$ 덧셈을 대신 아래와 같이 하나의 $Matrix$ 곱셈으로 Translation을 표현할 수 있다.

$ TranslationMatrix = \begin{bmatrix} 1 & 0 & 0 & a \\ 0 & 1 & 0 & b \\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{bmatrix} $

그래서 $Homogeneous \ Coordinate$를 사용하면 모든 $Transformtaion$을 하나의 $Matrix$ 곱셈으로 표현할 수 있다.

$Affine \ Matrix$를 $Homogeneous \ Coordinate$로 표현해보자. 

$ X = \begin{bmatrix} M & 0 \\ 0 & 1 \end{bmatrix} $

$ T = \begin{bmatrix} I & T \\ 0 & 1 \end{bmatrix} $

$ AffineMatrix = TX = \begin{bmatrix} M & T \\ 0 & 1 \end{bmatrix} $


W의 용도

Translate 하지 않을 용도일 때는 (W = 0)

$W$가 $0$인 $(1, 2, 3, 0)$인 $Vector \ A$에 Translate하는 $Matrix \ T$를 곱해보자.

$ T = \begin{bmatrix} 1 & 0 & 0 & a \\ 0 & 1 & 0 & b \\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{bmatrix} $

$ A = \begin{bmatrix} 1 \\ 2 \\ 3 \\ 0 \end{bmatrix} $

$ TA = \begin{bmatrix} 1+a\times0 \\ 2+b\times0 \\ 3+c\times0 \\ 1\times0 \end{bmatrix} $

$W$가 0이기 때문에 $(a, b, c)$로 이동하는 $Translate \ Matrix$를 무시하게 됐다.

그리고 어떤 좌표의 $W$를 $0$으로 가까이 가게하면 모든 좌표가 무한대로 발산한다. 그래서 이동하지 않는 Direction과 같은 것을 나타내는 벡터는 $W = 0$이다.

Translate할 용도일 때는 (W = 1)

$W$가 1인 $(1, 2, 3, 1)$인 $Vector \ B$에 Translate하는 $Matrix \ T$를 곱해보자.

$ T = \begin{bmatrix} 1 & 0 & 0 & a \\ 0 & 1 & 0 & b \\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{bmatrix} $

$ B = \begin{bmatrix} 1 \\ 2 \\ 3 \\ 1 \end{bmatrix} $

$ TB = \begin{bmatrix} 1+a\times1 \\ 2+b\times1 \\ 3+c\times1 \\ 1\times1 \end{bmatrix} $

$W$가 1이기 때문에 $1\times(a, b, c)$만큼 Translate했다.

이와 같이 $W$가 $1$이면 같은 비율을 유지하는 것을 확인할 수 있다. 그래서 주로 $W$를 $1$로 사용하는 것이다.

$Position$은 이동을 할 수 있다. 그래서 $Position$으로는 주로 $W = 1$을 사용한다. $W$ 요소를 크게 바꾸면 이동시키는 영향을 크게 줄 수 있다.

원근감을 적용할 용도일 때는 (W=z)

$Homogeneous \ Coordinate$를 사용하면 원근감을 표현하기 쉽다.

$Pure \ Perspective \ Project$에 대해서 설명해보겠다. 아래의 $Matrix \ M$를 살펴보자. 이 $Matrix$의 3번째 $Vector$의 $W$요소는 $1$이다. 

$ M = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} $

$ P = \begin{bmatrix} x \\ y \\ z \\ 0 \end{bmatrix} $

$ MP = \begin{bmatrix} x \\ y \\ z \\ z \end{bmatrix} $

3번째 $Vector$의 $W$요소의 값을 $1$로 설정하면, 곱해주는 $Vector$의 $W$요소를 z로 만들어준다. 그렇기 때문에 위의 연산처럼 $Vector \ P$에 $Matrix \ M$을 곱해주면 원래 $0$이있던 $P$의 $W$요소가 $z$가 된다. ($MP$처럼 $W$요소가 $1$이 아닐 때 $Clip \ Space$에 있다고 말한다.)

$Clip \ Space$에 있는 $MP$를 우리가 사용하는 평면인 $W = 1$인 곳으로 가져와서 어떤 좌표인지 해석해보자. $W$요소를 $1$로 만들어 보자.

$ MP/z = \begin{bmatrix} x/z \\ y/z \\ z/z \\ z/z \end{bmatrix} = \begin{bmatrix} x/z \\ y/z \\ 1 \\ 1 \end{bmatrix} $

이 된다. 결과를 보면 $z$가 $1$보다 크면 $x$와 $y$가 $z$만큼 나눠져서 z가 클수록 값이 더 작아진다는 사실을 알 수 있다. 위의 사실을 이용하면 $W$요소의 값을 조정해서 원금감과 표현할 수 있다.

반응형
저작자표시 비영리 동일조건 (새창열림)

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (183)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (49)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • javascript
  • 한빛미디어
  • git
  • aws
  • 회고
  • 서평
  • Github
  • tutorial
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바