Mathematics of Rendering

12 분 소요

Vectors and MatricesPermalink

Basic Vector OperationsPermalink

Vector Magnitude(백터의 크기)Permalink

  • 백터의 크기를 구하는 공식은 다음과 같다.
V=n1i=0v2i
  • 3-Dimensions(3차원 공간)에서 위 공식을 적용해 보면 |V|=V2x+V2y+V2z 으로 된다.
  • 벡터의 각각의 성분을 제곱해서 연산을 하면 우리는 벡터의 크기를 구할 수 있다.

unit VectorPermalink

  • unit vector는 크기가 1인 벡터를 의미한다.
  • 방향성만 가진 벡터를 구하기 위한 방법이다. 벡터의 크기로 벡터를 나누어 주면 된다.
  • 우리는 이것을 Vector를 Normalize 했다고 한다. 공식은 아래와 같다.
ˆV=VV

Vector의 덧셈 및 곱셈에 관한 성질Permalink

속성 설명
(a+b)+c=a+(b+c) 덧셈에 관한 결합법칙
a+b=b+a 덧셈 교환법칙
(st)a=s(ta) 스칼라 곱에 관한 결합 법칙
ta=at 스칼라 곱에 관한 교환 법칙
t(a+b)=ta+tb 스칼라 곱에 대한 분배법칙
(s+t)a=sa+ta 스칼라 곱에 대한 분배법칙

벡터 끼리의 곱셈에서 교환 법칙은 성립하지 않으며, 스칼라 곱에 대한 교환법칙만 존재 한다.

Matrix(행렬) 의 기초Permalink

  • A 행력과 B 행렬이 다음과 같다.
    A는 n×p 행렬 이고 B는 p×m 인 경우, i 와 j 번째 요소를 구하는 식은 다음과 같다.
(AB)ij=p1k=0AikBkj

Matrix Multiplication TransposePermalink

  • 행렬에서 곱셈을 Transpose 하는 공식은 다음과 같다.
(AB)Tij=p1k=0BTikATkj

antisymmetic matrix OR skew-symmetric matrixPermalink

  • 반대칭 혹은 비대칭 행렬이라고 한다.
  • 공식은 MTij=Mij 이다.
[014107470]

벡터의 표기법Permalink

Column Vector

v=(v0,v1,,vn1)=[v0v1vn1]

Row Vector

vT=[v0v1vn1]

Vector MultiplicationPermalink

Dot Product (내적)Permalink

ab=n1i=0aibi

위 공식을 3차원 에서 적용해 보면 아래와 같다.
각 성분끼리 곱해서 더한다.

ab=axbx+ayby+azbz

아래와 같이 표현 하기도 한다.

ab=[a0a1an1][b0b1bn1]

벡터의 기하학적 의미 공식은

ab=abcosθ

여기서 우리가 알 수 있는 사실은 θ90인 경우 내적의 값은 0이 되며,
a 벡터와 b벡터가 직교하는 경우 내적의 값은 0이 된다는 것을 알수 있다.

여기서 특별한 케이스인 자기 자신과 dot product는 아래와 같은 특징이 있다.

v2=VV=V2

참고로 |V| 는 아래와 같다.

V=n1i=0v2i

내적의 속성

속성 설명
ab=ba 교환 법칙
a(b+c)=ab+ac 분배 법칙
(ta)b=a(tb)=t(ab) 인수분해

Cross Product (외적)Permalink

2개의 3차원 Vector에서 다음과 같은 공식

a×b=(aybzazby,azbxaxbz,axbyaybx)

외적(Cross Product)는 특수한 3X3 비대칭 행렬을 정의해서 나타낼 수도 있다.

[a]X=[0azayaz0axayax0] a×b=[a]Xb=[0azayaz0axayax0][bxbybz]=[azby+aybzazbxaxbzaybx+axby]

외적의 크기 공식

a×b=absinθ

또한 외적의 크기는 기하학적 의미로는 평행사변형의 넓이에 해당 한다.

image

외적은 a×b=b×a 비가환성 특징을 가진다.

외적의 속성

속성 설명
a×b=b×a 외적의 비가환성
a×(b+c)=a×b+a×c 외적의 분배법칙
(ta)×b=a×(tb)=t(a×b) 스칼라 인수분해
a×(b×c)=b(ac)c(ab) Vector triple product
(a×b)2=a2b2(ab)2 라그랑주 항등식

Scalar Triple ProductPermalink

순서에 상관없이 동일한 결과를 나타 냅니다.

[a,b,c]=(a×b)c=(b×c)a=(c×a)b

Scalar Triple Product의 기하학적 의미는 (parallelepiped)평행육면체의 부피와 같습니다.

image

위 그림으로 부터 아래와 같은 공식을 유도할 수 있습니다. (θ=90φ)

(a×b)c=a×bccosθ=a×b|csinφ

Vector ProjectionPermalink

x, y, z Axis에 일직선이 되도록 아래의 unit Vector를 정의 한다. i, j ,k 를 아래와 같이 정의 한다.

i=(1,0,0)j=(0,1,0)k=(0,0,1)

3D Vector를 다음과 같이 표기 할 수 있다.

v=vxi+vyj+vzk(vi=vicosθ)iisunitvector(vx=vi,vy=vj,vz=vk)v=(vi)i+(vj)j+(vk)k

일반적으로 abProjection(사영) 시킬때 공식은 아래와 같다.

ab=abb2b

rejectionafromb 의 공식은 다음과 같다.

ab=aab=aabb2b

image

위 그림을 보면 ab의 Projection과 Rejection이
직각삼각형의 밑변과 높이에 해당하는 것을 볼 수 있으며, 삼각함수에 따라서 아래와 같은 공식이 된다.

ab=acosθab=asinθ

Gram-Schmidt processPermalink

Gram-Schmidt process 특정 벡터의 정규직교기저를 구하는 방법이다.
공식은 아래와 같다.

Ui=Vii1k=1(Vi)Uk=Vii1k=1ViUkU2kUk

Matrix InversionPermalink

우리는 종종 A좌표계 에서 B좌표계로 변환하는 일을 수행하게 됩니다.
이떄 A -> B로 혹은 B -> A로 좌표계를 변환하게 되는데 이때 우리는 변환 행렬인
M,M1 을 찾아야 하며, M1 을 Inverse Matrix라고 합니다.

Identity Matrices (단위행렬)Permalink

Matrix의 곱에 대한 항등원 이라고 생각하면 됩니다.
항등원이란 : 어떤수에 연산을 했을때 자기자신이 나오게 만드는 값

I 는 다음과 같이 정의 됩니다.

In=[100010001]AIn=AInB=B(IB)ij=n1k=0IikBkj=Bij

Inverse Matrix(역행렬)의 특징

  • n by n 정방행렬(정사각행렬) 에서만 존재 합니다.
  • MM1=In 또는 M1M=I 입니다.
  • 역행렬은 항상 존재하지는 않습니다.
  • Determinant(행렬식)을 이용해서 존재 유무를 알 수 있습니다.

Determinants (행렬식)Permalink

행렬식의 공식은 다음과 같습니다.

det(M)=n1j=0Mkj(1)k+j|M¯kj|det(M)=n1i=0Mik(1)i+k|M¯ik|det(MT)=det(M)(|M¯kj|:kjMinorMatrix)

위 공식의 의미는 다음과 같다.

image

Determinent Property

속성 설명
det(In)=1 단위행렬의 행렬식
det(AT)=det(A) 전치행렬의 행렬식
det(A1)=1/det(A) 역행렬의 행렬식
det(AB)=det(A)det(b) 행렬식의 곱 법칙
det(tA)=tndet(A) Scalar factorization 의 행렬식

Elementary Matrices (기본행렬)Permalink

단위행렬 In에서 기본행연산(elementary row operation)을 한 번 실행하여 얻어지는 행렬이다.

아래에 3가지의 기본행연산이 있습니다.
(a) 0이 아닌 스칼라 값을 M의 행에 곱합니다.
(b) M의 행의 위치를 바뀌어 줍니다.
(C) 스칼라 값을 곱한 행을 다른행에 더합니다.

기본행 연산 중 (b)의 경우는 행교환을 하게 되면 교환하기 전/후 Matrix Determinant의
부호가 반대가 된다는 사실입니다.

[cdab]=cbda=(adbc)=[abcd]

위 사실을 기반으로 가장 중요한 사실은 동일한 Row를 포함하고 있는 행렬의 행렬식의 값은 0 이라는 사실입니다.
행 교환을 했지만 Matrix자체에 변화가 없기 때문에 유추해 보면 양수와 음수 값이 같은 경우는 0이기 때문입니다.

[1212]=adbc=(1×2)(2×1)=0

Inverse Calculation (역행렬)Permalink

  • 역행렬을 구한는 방법 두가지를 설명 하고자 합니다.
  • Gauss-Jordan Elimination
  • Determinant & Cofactor Matrix

Gauss-Jordan Elimination Case

  • 기본행 연산의 곱으로 역행렬을 구할 수 있습니다.
EmEm1 E2E1M=I
  • 예제
  • 기본행 연산을 양쪽 행렬에 동일하게 적용한다.
[101100021010111001][101100021010010101]row1×(1)+row3[101100010101021010]row2row3[101100010101001212]row2×(2)+row3[100112010101001212]row3×(1)+row1M1=[112101212]

Determinant & Cofactor Matrix Case

(Cofactor)Cij=(1)i+j|M¯ij|(adjugateofthematrixM)=CT(M)M1=CT(M)det(M)
  • 3×3 행렬의 경우는 다음과 같이 벡터로 계산 할 수 있음.
(M=[abc])M1=1[a,b,c][b×cc×aa×b]

4×4 Matrix에서 M1을 구하는 효율적인 방법.Permalink

  • 처음 3개 행에 대한 Column Vector a,b,c,d 와 4번째(마지막)행인 x, y, z, w를 다음과 같이 설정.
M=[abcdxyzw]
  • 그 다음 우리는 s,t,u,v를 다음과 같이 정의 합니다.
s=a×bt=c×du=yaxbv=wczddet(M)=sv+tuM1=1sv+tu[b×v+ytbtv×axtatd×u+wsdsu×czscs]
  • 역행렬M1의 처음 3개의 컬럼은 위 4개의 3차원 행 벡터 에 의해서 채워 짐
  • 역행렬M1의 4번째 컬럼은 4차원 벡터 (bt,at,ds,cs) 에 의해서 채워 짐
  • 대부분 게임엔진에서 M 행렬의 4번재 Row는 [0001] 이므로
  • x=y=z=0,w=1 이고, u=0,v=c 이 된다.

TransformsPermalink

Coordinate SpacesPermalink

Transformation MatricesPermalink

Position pA A의 좌표계로 부터 Position pB B 좌표계로 변환하는 표현은 아래와 같다.

pB=MpA+t(affinetransformation)
  • M3×3 Matrix, t는 3D Translation Vector 이며 좌표계의 Origin(원점)을 이동시킵니다.
  • 우리는 역으로 B의 좌표계에서 A의 좌표계로 변환 할 수도 있습니다.
pa=M1(pbt)
  • Mt4×4 matrix로 표현 할 수 있습니다. 그 전까지는 일단 t는 무시하고
  • 원점(origin)은 같다는 전제하에 3×3 매트릭스 에만 당분간 집중 합니다.

  • 일반적인 Linear trasnformation(원점이 동일한)은 아래와 같이 나타 냅니다.
vb=MvaM=[abc]ThenM[100]=a,M[010]=b,M[001]=cMv=vxa+vyb+vzc

Orthogonal Transformation (직교변환)Permalink

  • 게임 엔진에서 대부분 Transform Matrices를 Perpendicular unit-length columns(직교 유닛 컬럼)으로 표헌합니다.
  • 이러한 Matrices를 우리는 Orthogonal matrices(직교 행렬) 이라고 합니다.
  • 아래는 모두 같은 의미를 지닙니다.
    1. M은 Orthogonal Matrix(직교행렬) 이다.
    2. M1=MT는 같다.
    3. M은 columns Mutually Perpendicular unit-length
    4. M은 rows Mutually Perpendicular unit-length

Transform CompositionPermalink

  • Transform A 는 A좌표계 에서 적용된 변환이라고 한다면, 그와 동등한 B좌표계에서의 변환은 아래와 같습니다.
  • 행렬 M 은 좌표계 AB 로 변환행렬.
  • 행렬 M1 은 좌표게 BA로 변환행렬.
B=MAM1

Rotations (회전)Permalink

  • 어떤 v를 z축을 기준으로 회전 시키려고 합니다.
  • v를 다음과 같이 표기 합니다.
  • v=vxi+vyj+vzk
  • i,j,k는 좌표축과 평행한 unit vector입니다.
  • k는 z axis와 평행하므로 변화가 없고, vxi+vyj만 변화될 것입니다.

image

  • 위 그림에서 vxiθ 만큼 회전 시키면 아래와 같습니다.
  • iunitvector 입니다.
vxcosθi+vxsinθj
  • 또 한 우리는 vyj도 계산해 줘야 합니다.
  • 위 그림의 j축을 기준으로 θ 만큼 회전한 값을 구해주면 아래와 같습니다.
vycosθjvysinθi v=(vxcosθvysinθ)i+(vxsinθ+vycosθ)j+vzk[vxvyvz]=[cosθsinθ0sinθcosθ0001][vxvyvz]
  • 최종적으로 X, Y, Z 축에 대한 공식은 아래와 같습니다.

image

Rotation about an Arbitrary Axis (임의의 축에 대한 회전)Permalink

  • 하지만 일반적으로 회전을 할 때, 임의의 축을 중심으로 회전 할 경우가 더 많다.

이미지

vsinα=va=a×v(samelength.)v=va+vacosθ+(a×v)sinθ
  • projection과 rejection의 정의에 의해서 아래와 같이 정의된다.
  • a=unitvector 이기 때문에 a2은 생략한다.(Projection 공식에서)
  • a,v 는 벡터 입니다.
v=(va)a+[v(va)a]cosθ+(a×v)sinθv=vcosθ+(va)a(1cosθ)+(a×v)sinθ(va)a=(aa)v

image

image

  • c=cosθ, s=sinθ

Reflections (반사)Permalink

  • 게임엔진에서 거울이나 물표면에 반사되는 변환을 나타낼때 많이 사용 된다.
v=va+vav=vava

image

ScalesPermalink

  • 객체의 사이즈를 확장 하거나 축소하는 변환 입니다.
  • Uniform Scale : 모든 방향이 동일한 크기로 확장 하는것.
  • Nonuniform Scale : 어떤 한 방향이 다른 방향에 비해서 크거나 작은 크기로 확장 되는것.
Mscale(sx,sy,sz)=[sx000sy000sz]
  • 우리는 x, y, z 축 이 아닌 특정 방향 a 대해서 확대/축소 할 수도 있습니다.

image

  • 위 그림으로 아래와 같은 공식을 유도 할 수 있습니다.

v=sva+va=s(vaa2a)+(vvaa2a)=s(va)a+v(va)a=(s1)(va)av=(s1)(aa)vv=(s1)[axayaz][axayaz][100010001]v image

SkewsPermalink

  • Skews를 그림으로 설명하면 다음과 같습니다. image

  • 공식은 아래와 같이 유도 된다.
  • v=v+a(bv)tanθ
    image
v=v+a(bv)tanθ=Iv+(ab)vtanθ=(I+(ab)tanθ)v

image

  • 만약 a 와 b가 좌표시스템의 축과 같다면, a=(1,0,0) , b=(0,1,0)
  • 공식은 아래와 같이 더 간결해 집니다.
Mskew(θ,i,j)=[1tanθ0010001]

Homogeneous Coordinates (동차 좌표)Permalink

  • 일반 적인 Affine Transformation 좌표계A 에서 좌표계 B로 의 공식
pb=Mp+t
  • 4×4 매트릭스로 나타내면 다음과 같다.
H=[Mt01]=[M00M01M02txM10M11M12txM20M21M22tx0001]

QuaternionsPermalink

Quaternion FundamentalsPermalink

  • x, y, z, and w are real number
  • three imaginary units i,y, and k
    q=xi+yj+zk+w
i2=j2=k2=ijk=1ij=ji=kjk=ikj=iki=ik=j
  • 두개의 Quaternions를 곱하면 다음과 같이 계산 됩니다.
    image

  • q1=v1+s1 이고 q2=v2+s2 이므로
    q1q2=v1×v2+s1v2+s2v1+s1s2v1v2q2q1=q1q22(v1×v2)

  • q의 켤레수는 q로 표현 한다. q=v+sq=v+sqq=qq=v2+s2

  • quaternion의 magnitude는 아래와 같다.
    q=qq=v2+s2 q1q2=q1q2

  • multiplicative inverse
    q1=qqq=v+sv2+s2

  • quaternions의 성질
    image

Rotations With QuaternionsPermalink

  • q=xi+yj+zk+w 그리고, v=(vx,vy,vz) 이고
  • 최종적으로 v에 의해서 회전된 v은 다음과 같다. v=qvq1.

  • q가 unit quaternion 일 경우 v=qvq

  • q=b+c 라고 하면, qvqv=(b+c)v=b×v+cvbv
  • q=b+c 입니다.
  • qvq는 아래와 같습니다. qvq=(b×v+cvbv)(b+c)=(c2b2)v+2(vb)b+2c(b×v)

  • b×v×b=(bv)b2v 라면
qvq=(c2s2)v+2s2(va)a+2cs(a×v)c2s2=cosθ2s2=1cosθ2cs=sinθ.c=cosθ2s=sinθ2 q=(sinθ2)a+cosθ2

댓글남기기