행렬

Woogie_·2025년 5월 22일

게임 수학

목록 보기
7/15

행렬 (Matrix)

  • 단순 정의 : 사각형 안에 수를 행과 열에 맞춰 배열한 것

    • 복잡한 선형 변환의 식을 계산하기 편하게 단순화시킨 계산 도구

    • 선형 변환의 표현

f(x,y)=(ax+by,cx+dy)f(x,y)=(ax+by,cx+dy)
  • 함수로서의 행렬 : 2×2Matrix2\times 2 Matrix

  • 벡터로서의 행렬 : 2×1Matrix2\times 1 Matrix

행렬과 행렬의 덧셈 연산

행렬과 스칼라의 곱셈 연산

행렬의 전치 (Transpose) 연산

  • 행과 열을 변경

행렬과 행렬의 곱셈 연산

  • 행과 열을 교차해서 곱해준 후 더함

행렬 곱셈 연산의 특징

  • 교환 법칙을 만족하지 않음
ABBAA\cdot B\ne B\cdot A

  • 결합 법칙은 만족

  • 행렬 곱의 전치 연산

  • 복잡하지만 분배법칙도 만족

선형 변환과 행렬

  • R2R2\mathbb{R}^2 \mapsto \mathbb{R}^2 대응관계를 가지는 선형 변환의 식
f((x,y))=(ax+by,cx+dy)f((x,y))=(ax+by, cx+dy)
  • 정방행렬과 열벡터의 곱셈

  • 이의 결과는 무엇을 의미하는가?

    • 정방 행렬은 같은 차원의 공간이 서로 대응되는 선형 변환을 의미한다.

    • 열벡터는 벡터 공간의 벡터를 의미한다

열기반 행렬과 행기반 행렬

  • 열기반(Column Major) Matrix : OpenGL → 수학에서 사용하는 기본 방식
[abcd][xy]=[ax+bycx+dy]\begin{bmatrix} a & b\\c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} ax+by \\ cx+dy \end{bmatrix}
  • 행기반(Row Major) Matrix : DirectX 및 게임 엔진에서 사용하는 방식

Av=v(v)T=(Av)T=vTATAv=v' \\ (v')^T=(Av)^T=v^TA^T
  • 열기반과 행기반은 전치 관계일 뿐 결과는 동일함을 보장

선현 변환의 시각화

원 벡터 공간의 선형 변환

  • 원 공간에 속한 임의의 벡터에 대한 조합식
(x,y)=x(1,0)+y(0,1)(x,y)=x(1,0)+y(0,1)

  • 선형 변환 후 변환된 기저 벡터를 조합해 벡터를 추적
(x,y)=x(a,c)+y(b,d)=(ax+by,cx+dy)(x',y')=x(a,c)+y(b,d)=(ax+by, cx+dy)

기저 벡터의 변환

크기 변환 행렬

밀기 변환

시계 방향 90도 회전 변환

반시계 방향 90도 회전 변환

[0110]\begin{bmatrix} 0 & -1\\1 & 0 \end{bmatrix}
(x,y)=(y,x)(x',y')=(-y,x)

임의의 각 θ\theta에 대한 회전 변환

[cosθsinθsinθcosθ][xy]=[xcosθysinθxsinθ+ycosθ]\begin{bmatrix} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} =\begin{bmatrix} xcos\theta-ysin\theta\\ xsin\theta+ycos\theta \end{bmatrix}

4. 행렬의 곱

행렬의 곱

  • 행렬은 하나의 선형 변환에 대응되며 행렬의 곱은 선형 변환을 적용한 결과에 다시 선형 변환을 적용한 결과를 다음과 같이 진행

  • 이를 수식으로 나타내면
w=A(Bv)w=A\cdot (B\cdot v)
  • 그런데 행렬은 결합법칙이 성립하므로 위 식은 다음과 동일
w=(AB)vw=(A\cdot B)\cdot v
  • 그렇다면 두 행렬을 곱한 식 (AB)(A\cdot B)는 벡터공간 VV에서 벡터공간 WW로 직행하는 합성변환을 의미하며 함수의 ABA\circ B와 동일한 의미를 갖음

삼각함수의 합 공식

  • 이러한 행렬의 특징을 사용하면 삼각함수의 합 공식을 유도 가능
cos(α+β),sin(α+β)cos(\alpha+\beta)\quad,\quad sin(\alpha+\beta)
[cosβsinβsinβcosβ][cosαsinαsinαcosα]=[cos(α+β)sin(α+β)sin(α+β)cos(α+β)][cosαcosβsinαsinβ?cosαsinβ+sinαcosβ?]=[cos(α+β)?sin(α+β)?]\begin{bmatrix} cos\beta & -sin\beta\\ sin\beta & cos\beta \end{bmatrix}\begin{bmatrix} cos\alpha & -sin\alpha\\ sin\alpha & cos\alpha \end{bmatrix} =\begin{bmatrix} cos(\alpha+\beta) & -sin(\alpha +\beta) \\ sin(\alpha +\beta) & cos(\alpha+\beta) \end{bmatrix}\\ \begin{bmatrix} cos\alpha cos\beta -sin\alpha sin\beta & ? \\ cos\alpha sin\beta + sin\alpha cos\beta & ? \end{bmatrix}=\begin{bmatrix} cos(\alpha+\beta) & ? \\ sin(\alpha +\beta) & ? \end{bmatrix}

행렬의 장점

  • 이러한 결합법칙이 성립하는 행렬 연산의 특징은 변환이 여러 개가 존재하더라도 동일한 결과를 보장
(ABC)v=A(B(Cv))(A\cdot B\cdot C)\cdot v=A\cdot (B\cdot (C\cdot v))
  • 앞으로 우리가 사용할 주요 선형 변환은 다음과 같음

    • Scale ( S )
    • Rotation ( R )
    • Translation ( T )
    • View ( V )
    • Projection ( P )
  • 10만개의 벡터에 위의 다섯가지 변환을 각각 적용하면 다음과 같이 50만번의 연산이 발생

P(V(T(R(Sv))))P\cdot (V\cdot (T\cdot (R\cdot (S\cdot v))))
  • 그런데 변환이 고정되어 있다면 PVTRSPVTRS를 미리 계산해 행렬을 생성한 후 이를 사용하면 동일한 결과를 만들어주는 연산은 10만번으로 해결
P(V(T(R(Sv))))=(PVTRS)vP\cdot (V\cdot (T\cdot (R\cdot (S\cdot v))))=(PVTRS)\cdot v
profile
상상을 구현하는 개발자

0개의 댓글