[이득우 게임수학] 6. 아핀공간 : 움직이는 가상 세계의 구축

    이동이 가능한 부분 공간을 아핀 공간(Affine space)이라고 부른다.

    6.1 이동 변환을 위한 아핀 공간

    임의의 벡터 (x,y)를 지정한 크기(a,b)만큼 이동시키는 기능은 행렬의 덧셈으로 구할 수 있다.

    
     ┌ x ┐ + ┌ a ┐ = ┌ x + a ┐
     └ y ┘   └ b ┘   └ y + b ┘
    
     A · ┌ x ┐ = ┌ x + a ┐
         └ y ┘   └ y + b ┘
    
    
    ┌ 1 0 a ┐   ┌ x ┐   ┌ x + a ┐
    │ 0 1 b │ · │ y │ = │ y + b │
    └ 0 0 1 ┘   └ 1 ┘   └   1   ┘
    
    
    //이동 변환행렬(Translate transformation matrix)
        ┌ 1 0 a ┐
    T = │ 0 1 b │
        └ 0 0 1 ┘

    벡터 공간에서 이동을 위해 마지막 차원의 값을 1로 한정한 부분 공간을 아핀 공간(Affine space)이라고 부른다. 한 차원을 높여 설계한 선형 변환을 아핀 변환 이라고 한다.

    3차원의 크기 변환행렬 S와 회전 변환행렬 R은 다음과 같다

        ┌ a 0 0 ┐
    S = │ 0 b 0 │
        └ 0 0 1 ┘
    
        ┌ cosθ -sinθ 0 ┐
    R = │ sinθ  cosθ 0 │
        └  0     0   1 ┘

    6-1 실습

    행렬 곱셈으로 이동 구현하기

    6.2 아핀 공간의 구성 요소

    마지막 차원 값이 1인 아핀 공간의 원소를 점(point)이라고 부른다.
    2차원 공간에서 점은 항상 (x,y,1) 형태여야 한다. 3차원 공간의 점이라면 (x,y,z,1) 형태를 띤다.

    이동 벡터

    벡터는 아핀 공간 내의 이동을 지정하기 위해 사용되는데 벡터 공간의 원소로 정한 벡터와 구분하기 위해 이동 벡터 또는 변위 벡터(Displacement vector)라고 부른다.
    아핀 공간의 점 P!에 이동벡터 v를 더한 결과는 P2에 대응되는데 이 수식을 이항하면 이동 벡터를 구할수 있다.

     P1 + v = P2
     v = P2 - P1
     P1 - P2 = -v

    아핀 공간의 성질

    아핀 공간의 중심을 원점 O라고 한다면 O는 (0,0,1)이 된다. 임의의 점 P의 값을(x,y,1)로 지정한다면 원점 O에서 점 P로 향하는 이동벡터 v는

    v = P - O = (x,y,1) - (0,0,1) = (x,y,0)

    물리적인 관점에서 바라본 현실 세계의 3차원 공간을 유클리드 공간(Euclidean space)이라고 하고, 유클리드 공간에서 작용하는 힘을 유클리드 벡터(Euclidean vector)라고 하는데, 이에 대응되는 개념이 아핀 공간과 이동 벡터인 것이다.

    6.3 아핀 결합

    2차원 평면상의 임의의 두 점 P1(x1, y1, 1)과 P2(x2, y2, 1)에 각각 스칼라 a,b를 곱한 선형 결합의 식은

    a · P1 + b · P2 = (ax1 + ax2, ay1 + by2, a + b)

    위 식에서 두 점의 선형 결합 결과가 언제나 점이 되려면 마지막 차원 값 a + b가 1이 되어야 한다. x,y 값과 무관하게 a + b = 1의 조건을 유지한다면 점과 점을 결합해 새로운 점을 만들 수 있다. 이렇게 여러 개의 점을 결합해 새로운 점을 생성하는 수식을 아핀 결합(Affine combination)이라고 한다.

    두 점의 결합

    a · P1 + (1 - a) · P2 = P`
    
    1 · P1 + 0 · (x2, y2, 1) = P1       //a에 1을 대입하여 P1을 생성
    
    0 · (x1, y1, 1) + P2 = P2           //a에 0을 대입하여 P2를 생성
    
    1/2 · (x1, y1, 1)  + 1/2 · (x2, y2, 1) = ((x1 + x2) / 2,  (y1 + y2) / 2, 1) //a에 0.5를 대입하여 중점을 생성

    a의 범위가 좌우로 무한하면 직선(Line), 한쪽으로만 무한하면 반직선(Ray), 양쪽다 유한하면 선분(Line segment)라고 부른다. 게임 제작에서 전방에 물체가 있는지 탐지하기 위해 사용하는 기능에 레이캐스팅(Raycasting)이 있다. 레이트레이싱(Raytracing)기술도 반직선(Ray)개념이 사용된다.

    6.4 선그리기 알고리즘

    벡터를 모니터의 점으로 표현

    수학에서 벡터를 표현할 때에는 y축이 위쪽을 향하는 데카르트 좌표계를 사용한다. 하지만 모니터 화면의 좌표계는 y축이 아래쪽을 향하는 방식을 사용한다. 이를 스크린 좌표계(Screen coordinate system)라고 한다. 스크린 좌표계는 실수가 아닌 정수를 사용한다. 데카르트 좌표계는 빈틈이 없는 연속된(Continuous)실수로 평면을 채우지만, 스크린 좌표계는 서로 독립된 영역을 가지는 이산적인(Discrete) 정수를 사용한다. 그래서 하나의 스크린 좌표는 네모난 영역에 대응된다.

    스크린 좌표와 색상에 대응하는 화면의 구성 요소를 픽셀(Pixel)이라고 한다. 벡터를 화면의 점으로 최종 표현하기 위해서는 실수로 표현된 벡터 좌표를 정수로 변환한 후 색상을 부여하는 과정을 거쳐야 한다. 이러한 변환 과정을 픽셀화(Rasterization)라고 한다.

    선 그리기 알고리즘

    정수만 사용해 효율적으로 화면에 선분을 그리는 브레젠험 알고리즘(Bresenham's algorithm)이 있다. 중점 알고리즘(Midpoint algorithm)이라고도 한다.

    y0 = (h/w)x0 + b
    y = (h/w)x + y0 - (h/w)x0
    
    (h/w)x + y0 - (h/w)x0 < y0 + 0.5
            hx + wy0 -hx0 < wy0 + 0.5w
         h(x - x0) - 0.5w < 0
           2h(x - x0) - w < 0
      2h(x0 + 1 - x0) - w < 0
                   2h - w < 0

    라인 클리핑 알고리즘

    선분이 가진 성질은 유지하면서 지정된 영역에 맞는 데이터로 재설정하는 작업을 클리핑(Clipping)이라고 한다. 이번에 소개할 기법은 1967년에 개발된 코헨-서덜랜드 라인 클리핑 알고리즘(Cohen-Sutherland line clipping algorithm)이다. 선분을 그릴 영역과 바깥 영역을 포함하여 총 9개로 설정한후 상하좌우를 나타대는 네 자리의 이진수 값으로 부여한다.

    1001 1000 1010
    0001 0000 0010
    0101 0100 0110

    시작점과 끝점을 입력 받아서 네 자리 이진수 값으로 계산하고 두 점의 테스트 값을 & 연산하여 0보다 큰값이 나오면 그리기를 건너뛰고 0이나오면 클리핑하여 화면 영역의 점으로 변경해야한다.

    정리

    • 아핀 공간의 개념과 주요요소, 효과적으로 선을 그리는 방법

    출처

    반응형

    댓글

    Designed by JB FACTORY