WinCNT

행렬 본문

게임 프로그래밍(학습 내용 정리)/게임 수학

행렬

WinCNT_SSS 2021. 12. 21. 15:48

각각의 오브젝트에 대해 월드 행렬이 따로 존재해야 한다

월드 행렬이란 각각의 오브젝트가 월드 좌표계에 위치하기 위해 사용하는 행렬

 

로컬 좌표계

월드 행렬 => 월드 좌표계

카메라 행렬 => 카메라 좌표계

투영 행렬 => 투영 좌표계

해상도 처리 => 뷰포트 좌표계

 

언프로젝션이란?

화면에서 클릭한 지점을 3차원 공간의 좌표로 바꾸는 것

 

뷰포트 좌표계에서 클릭

해상도에서 역산해서 투영좌표계 구하기

투영좌표계에 투영 행렬의 역행렬 => 카메라 좌표계

카메라 좌표계에 카메라 행렬의 역행렬 => 월드 좌표계

월드 좌표계에서 월드 행렬의 역행렬 => 로컬 좌표계

 

4차원 공간에서 연산

3차원 공간으로 표시

2차원 화면에 그리기

 

사용하는 것은 항상 정방행렬이다

 

단위 행렬 중요함

 

행렬이란

벡터들의 모임이라고 생각할 수 있다

x, y, z, w 등등

벡터 : 하나의 행이나 열로 표현되는 행렬

기저: 3차원 축

축들을 모아둔게 변환 행렬

 

 

 

 

주대각선

 

항등행렬(Identity Matrix)

항등원과 역원

행렬의 연산을 정의하기 위해서는 항등원, 역원이 필요하다

프로그래밍에서 사용하는 행렬 연산은 오직 곱셈(!!!)밖에 없다

 

항등행렬 : 대각선 성분만 1이고 나머지는 0인 행렬

 

행렬연산

행렬 간의 합과 차

 

행렬과 스칼라의 곱

 

전치행렬

행렬의 전치 : 임의 행렬의 열과 행을 바꿔 새로운 행렬을 구성한다는 의미

T는 Transpose의 약자

 

D2D에서는 일반적으로 직접 계산하지 않는다

관련 함수를 D2D가 제공하기 때문

(어셈블리 레벨로 최적화가 되어 있기 때문에 단순히 for문으로 구현하는 것보다 빠르다)

 

물론 OpenGL에서는 관련 함수를 지원하지 않기 때문에 구현해야 한다...

 

행렬곱셈

두 행렬의 곱

각 행렬 요소의 계산식

 

 

 

행렬의 곱셈은 벡터내적을 모아 놓은 것이다!

행벡터와 열벡터의 내적!

 

행렬의 성질

행렬의 성질 중에서 3D 그래픽스에서 중요한 것은 결합 법칙!

결합 법칙이 성립하므로 3D 그래픽스에서 행렬을 사용하고 있다

 

이동 행렬 A, 회전 행렬 B

캐릭터 버텍스에 A를 곱하고 B를 곱해서

캐릭터를 특정 방향에 옮기고 회전하는 값을 얻고 싶다고 가정하자

 

캐릭터의 버텍스 3만개라면

3만개의 캐릭터 벡터 x 이동 행렬(4x4) = 48만번 연산

3만개의 캐릭터 벡터 x  행렬(4x4) = 48만번 연산

도합 96만번 연산이 필요하다

 

하!지!만!

결합 법칙이 성립하므로 이동 행렬과 회전 행렬을 미리 곱해 놓을 수 있다

3만개의 캐릭터 벡터 x 미리 계산한 이동 회전 행렬(4x4) = 48만번 연산

연산이 절반으로 연산이 줄어든다

곱하는 행렬(크기 행렬 등등)이 늘어놔도 미리 계산한 행렬은 항상 4x4이므로

연산도 48만번으로 일정하다

 

참고) 위의 예는 실제 애니메이션에서 움직이는 상황이 아니다

캐릭터가 특정 방향으로 이동하고 회전하는 애니메이션을 구하는 것이 아니라

캐릭터를 특정 방향으로 이동하고 회전한 결과 값을 얻고 싶은 것

실제로 애니메이션을 하기 위해서는 중간 중간의 행렬을 계속 연산해야 한다

추가 키워드) 이터콜레이션, 프레임

 

행렬은 교환법칙이 성립되지 않는다!!

3D 그래픽스에서 매우 중요한 성질인데, 행렬 곱셈의 순서가 틀리면 캐릭터가 제대로 묘사되지 않을 수 있다

(캐릭터의 손발 위치가 바뀐다던가 하는 일이 일어나기도 한다...)

 

행렬식

실제 선형대수에서의 의미는 둘째 치고

실제 프로그래밍에서 중요한 것은 역행렬의 존재 유무를 알 수 있다

역행렬을 구할 때 행렬식(det)로 나누는데 행렬식이 0이면 나눌 수 없기 때문

 

행렬식(det)이 0이라는 것은 기하학적으로 생각하면,

변환을 통해 차원의 축이 1개 이상 뭉개진다는 의미

 

역행렬

(1/A로 표현하지 않는 것은 행렬에서 나눗셈이 정의되지 않았기 때문에)

 

버텍스L x 행렬w x 행렬v x 행렬p = 버텍스p(p는 projection)

구하고 싶은 것은 버텍스L x 행렬w = 즉, 버텍스w

(바꿔쓰면 버텍스w x 행렬v x 행렬p = 버텍스p)

 

좌표(960, 720) 클릭

버텍스(projection)은 0.5, 0.5

여기에 추가 좌표를 넣어줘서 (0.5, 0.5, 0.1)

위의 식에서 역행렬을 계속 곱해주면 버텍스w를 구할 수 있다

버텍스w = 버텍스p x 행렬p의 역행렬 x 행렬v의 역행렬

 

여기에 결합 법칙을 이용해서 행렬v x 행렬p를 미리 계산해두면

연산의 횟수를 줄일 수 있다

버텍스w = 버텍스p x (행렬p x 행렬v)의 역행렬 

 

3D 그래픽스에서 역행렬은 특정 좌표가 변환 전에 어디에 있었는지 추적할(되돌릴) 수 있다는 것

 

무협 게임의 경공

경공에서 중요한 요소 중 하나가 모션 블러이다

보통 2가지가 있는데 캐릭터 모션 블러카메라 모션 블러가 있다

 

카메라 픽셀이 특정한 좌표로 이동한 거리만큼 모션 블러를 한다

직전 프레임의 카메라 행렬과 현재 프레임의 카메라 행렬이 있으면 거리 값을 구할 수 있다(뺄셈)

그 거리만큼 모션 블러를 강하게 설정하면 속도감을 표현할 수 있다

 

SSS

'게임 프로그래밍(학습 내용 정리) > 게임 수학' 카테고리의 다른 글

변환 파이프라인  (0) 2022.01.04
좌표계  (0) 2021.12.28
삼각비와 삼각 함수  (0) 2021.11.09
수열(Sequence)과 급수(Series)  (0) 2021.10.26
게임 수학 - 벡터  (0) 2021.10.12