옆히

이득우의 게임 수학 본문

개인공부용1/etc

이득우의 게임 수학

옆집히드라 2024. 1. 31. 14:58

 

이득우의 게임 수학 - 10점
이득우 지음/책만

GitHub - onlybooks/gamemath: <이득우의 게임 수학> 공식 깃허브 페이지

 

GitHub - onlybooks/gamemath: <이득우의 게임 수학> 공식 깃허브 페이지

<이득우의 게임 수학> 공식 깃허브 페이지. Contribute to onlybooks/gamemath development by creating an account on GitHub.

github.com

더보기

1장 메타버스를 지탱하는 게임 수학
1.1 메타버스가 가져올 새로운 변화
1.2 게임 엔진의 구성
1.3 게임 수학의 구성
1.4 이 책의 실습 환경 구축
__1.4.1 실습 예제 구성
__1.4.2 개발 환경의 구성
__1.4.3 소스 코드의 빌드
__1.4.4 소스 코드의 구성
1.5 정리

1부 | 가상 세계의 구축
2장 수: 가상 세계를 구성하는 가장 작은 단위
2.1 수와 집합
__2.1.1 연산과 수의 구조
__2.1.2 수의 구조
__2.1.3 수의 표현
2.2 함수
__2.2.1 함수의 개념과 종류
__2.2.2 합성함수
__2.2.3 항등함수와 역함수
__2.2.4 곱집합을 활용한 좌표 평면으로의 확장
2.3 정리

3장 벡터: 가상 공간의 탄생
3.1 데카르트 좌표계
3.2 벡터 공간과 벡터
__3.2.1 스칼라와 벡터
__3.2.2 벡터 공간의 연산
__3.2.3 벡터의 크기와 이동
3.3 벡터의 결합과 생성
3.4 정리

4장 삼각함수: 회전을 위한 수학
4.1 삼각함수
__4.1.1 삼각함수의 성질
__4.1.2 각의 측정법
4.2 삼각함수를 활용한 물체의 회전
4.3 삼각함수의 역함수
4.4 극좌표계
4.5 정리

5장 행렬: 가상 세계의 변환 도구
5.1 선형성: 예측 가능한 비례 관계
__5.1.1 선형 함수
__5.1.2 벡터 공간의 선형 변환
5.2 행렬
__5.2.1 행렬의 기본 연산
__5.2.2 행렬의 곱셈
__5.2.3 정방행렬의 곱셈
5.3 행렬의 설계
__5.3.1 크기 변환행렬
__5.3.2 회전 변환행렬
__5.3.3 전단 변환행렬
__5.3.4 삼각함수의 덧셈 정리
5.4 역행렬
__5.4.1 역행렬의 존재를 판별하는 행렬식
__5.4.2 크기 변환행렬의 역행렬
__5.4.3 전단 변환행렬의 역행렬
__5.4.4 회전 변환행렬의 역행렬
__5.4.5 행렬 곱의 역행렬
5.5 정리

2부 | 콘텐츠 제작 기초
6장 아핀 공간: 움직이는 가상 세계의 구축
6.1 이동 변환을 위한 아핀 공간
6.2 아핀 공간의 구성 요소
__6.2.1 점
__6.2.2 이동 벡터
__6.2.3 아핀 공간의 성질
6.3 아핀 결합
__6.3.1 두 점의 결합
6.4 선 그리기 알고리즘
__6.4.1 벡터를 모니터의 점으로 표현
__6.4.2 선 그리기 알고리즘
__6.4.3 라인 클리핑 알고리즘
6.5 정리

7장 내적: 벡터 공간의 분석과 응용
7.1 벡터의 내적
__7.1.1 내적의 성질
__7.1.2 내적과 삼각함수와의 관계
__7.1.3 행렬의 곱셈을 내적으로 표현하기
7.2 시야 판별
__7.2.1 앞뒤 판별
__7.2.2 시야 판별
7.3 조명 효과의 구현
7.4 투영 벡터
7.5 정리

8장 삼각형: 물체를 구성하는 가장 작은 단위
8.1 세 점의 결합
8.2 메시
8.3 무게중심좌표
__8.3.1 무게중심좌표의 계산
__8.3.2 정점에 설정된 부가 정보의 활용
8.4 텍스처 매핑
8.5 정리

9장 게임 엔진: 콘텐츠를 만드는 기술
9.1 게임 엔진의 구성 요소
__9.1.1 씬의 구조
__9.1.2 모델링 행렬의 설계
__9.1.3 로컬 공간과 로컬 축
__9.1.4 리소스 관리
9.2 게임 엔진의 워크플로우
__9.2.1 CK소프트렌더러의 워크플로우
__9.2.2 렌더링 파이프라인
9.3 카메라 시스템
__9.3.1 가상 공간의 카메라
9.4 정리

3부 | 3차원 콘텐츠 제작
10장 3차원 공간: 입체 공간의 생성
10.1 3차원 공간의 설계
10.2 3차원 공간의 트랜스폼
__10.2.1 오일러 각
__10.2.2 회전행렬의 유도
__10.2.3 3차원 모델링 행렬
10.3 카메라 공간
10.4 오일러 각의 특징
__10.4.1 짐벌락 현상
__10.4.2 회전 보간의 계산
10.5 정리

11장 외적: 3차원 공간의 분석과 응용
11.1 벡터의 외적
__11.1.1 평행성 판별
__11.1.2 법선 벡터
__11.1.3 좌우 방향 판별
11.2 벡터로부터 회전행렬 생성
11.3 렌더링 계산량을 줄여주는 백페이스 컬링
11.4 오일러 각의 문제를 해결하는 로드리게스 회전 공식
11.5 삼중곱
__11.5.1 스칼라 삼중곱
__11.5.2 벡터 삼중곱
11.6 정리

12장 원근 투영: 화면에 현실감을 부여하는 변환
12.1 원근 투영 변환의 원리
12.2 동차 좌표계
12.3 깊이 값
12.4 원근 보정 매핑
12.5 깊이 버퍼
12.6 정리

13장 절두체: 최적화된 3차원 공간
13.1 절두체 컬링
__13.1.1 평면의 방정식
__13.1.2 평면의 방정식의 정규화
__13.1.3 평면의 방정식을 활용한 절두체 표현
__13.1.4 원근 투영 행렬로부터 평면의 방정식 만들기
13.2 바운딩 볼륨
__13.2.1 구 바운딩 볼륨의 판정
__13.2.2 AABB와의 판정
13.3 삼각형 클리핑
13.4 정리

4부 | 4차원 수학과 캐릭터
14장 복소수: 2차원 평면의 수
14.1 복소수
__14.1.1 허수
__14.1.2 복소수의 구조
14.2 복소평면
__14.2.1 단위 복소수와의 곱
__14.2.1 켤레 복소수의 회전 변환
14.3 복소수와 행렬의 관계
14.4 정리

15장 오일러 공식: 허수로 표현하는 회전 변환
15.1 자연지수함수
__15.1.1 무리수 e
__15.1.2 자연지수함수
15.2 미분
__15.2.1 도함수
__15.2.2 자연지수함수의 도함수
__15.2.3 sin 함수와 cos 함수의 도함수
15.3 급수
__15.3.1 등비수열
__15.3.2 급수
__15.3.3 매클로린 급수
15.4 오일러 공식
15.5 정리

16장 사원수: 4차원 수로 설계한 3차원 회전
16.1 사원수 대수
__16.1.1 사원수를 구성하는 세 허수
__16.1.2 사원수의 구조
__16.1.3 사원수와 벡터
16.2 사원수의 회전
__16.2.1 사원수와 오일러 공식
__16.2.2 회전 사원수를 이용한 3차원 공간에서의 회전
16.3 사원수의 변환
__16.3.1 오일러 각에서 사원수로의 변환
__16.3.2 사원수에서 오일러 각으로의 변환
__16.3.3 사원수에서 회전 변환행렬로의 변환
__16.3.4 회전 변환행렬에서 사원수로의 변환
16.4 사원수의 보간
16.5 사원수의 활용
16.6 정리

17장 캐릭터: 게임에 생기를 불어넣는 기술
17.1 스켈레탈 애니메이션
17.2 트랜스폼 계층 구조
__17.2.1 트랜스폼 계층 구조의 변환
__17.2.2 로컬 트랜스폼으로부터 월드 트랜스폼의 계산
__17.2.3 월드 트랜스폼으로부터 로컬 트랜스폼의 계산
17.3 캐릭터 메시와 애니메이션
17.4 정리

공간을 다루는 수학 : 벡터 -> 수학

물체를 다루는 수학 : 점 -> 삼각형

회전을 다루는 수학 : 삼각함수 -> 사원수

Windows API


2장 수: 가상 세계를 구성하는 가장 작은 단위

 

2.1 수와 집합

의무교육에서 배운 집합(set은 서로 구분되는 원소(element)로 구성된 묶음을 의미한다. 이러한 집합론을 소박한 집합론(Naive set theory)이라고 한다.

+사원수(Hamilton number)

 

소박한 집합론은 인간의 언어로 집합을 정의하기 때문에, 인간의 보편적인 관념에 의존할 수 밖에 없다. 

>확장>  공리-Axiom를 기반으로 대상을 구분하는 집합론, 공리적 집합론-Axiomatic set theory; 공리적 집합론에서는 수가 가지는 연산에 대한 공리를 기반으로 수를 분류한다.

2.1.1 연산과 수의 구조

수집합의 고유한 특징은 원소를 이용해 연산을 한다는 점이다. 대표적인 연산으로는 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산이 있으며 이들은 두 개의 원소를 사용해 새로운 원소를 만들어내기 때문에 이항연산-Binary operation 이라고도 한다.

 

Binary operation의 성질

1. Closure (같은 집합에 속한 두 수를 투입한 이항연산의 결과가 항상 투입한 집합에 속함)
2. Commutative law(교환법칙) 두 원소의 좌우 순서를 바꿔도 결과가 동일한 성질
3. Associative law(결합법칙) 세 원소의 연산 순서를 바꿔도 결과가 동일한 성질
4. Distributive law(분배법칙)
5. Idenity(항등원) 임의의 수와의 연산 결과를 항상 동일한 수로 만들어줌,
6. Inverse(역원) 임의의 수와의 연산 결과를 항상 항등원으로 만들어줌
덧셈 역원은 주어진 수에서 항상 부호가 반대인 수가 되므로 Opposite number(반대수)라고 부른다.
곱셈 역원은 분자가 1이고 분모는 주어진 수가 되므로 Reciprocal(역수)라고도 일컫는다.

 

Axiomatic set theory에서 두 연산에 대해 1번부터 11번까지의 공리를 모두 만족하는 수 집합은 Field-체의 구조를 지닌다고 표현한다.

1. 연산에 대해 닫혀 있다.
2. 연산에 대해 결합법칙이 성립한다.
3. 연산에 대한 항등원이 존재한다.
4. 연산에 대한 역원이 존재한다.
5. 연산에 대해 교환법칙이 성립한다.
6.두 번째 연산에 대해 닫혀 있다.
7. 두 번째 연산에 대한 결합법칙이 성립한다.
8. 첫 번째 연산과 두 번째 연산에 대해 분배법칙이 성립한다.
9. 두 번째 연산에 대해 교환법칙이 성립한다.
10. 두 번째 연산에 대해 항등원이 존재한다.
11. 두 번째 연산에 대해 역원이 존재한다.(단 0은 제외).

 

2.1.3 수의 표현

Number line-수직선, Perpendicylar line-직각으로 만나는 직선을 의미하는 수직선

어떤 수의 원점으로 부터의 거리를 Vertical bar-수직 막대- 기호를 써서 나타내는 Absolute value-절댓값

수와 연산을 원점을 기준으로 수직선상에서의 거리로 시각화 시킬 수 있다.

덧셈 연산은 점의 이동, 곱셈 연산은 크기와 방향의 변화로 표현됨

 

2.2.1 함수의 개념과 종류

Function는 두 집합에서 첫 번째 집합의 모든 원소가 빠짐없이 두 번째 집합의 어떤 원소에 대응하는 관계를 의미한다.

  1. 첫 번째 집합의 모든 원소에 대한 대응 관계가 존재해야 함
  2. 첫 번째 집합의 원소는 두 번째 집합의 한 원소에만 대응되어야 함

정의역-domain-의 모든 원소는 공역-codomain-의 원소에 대응되어야 한다. 하지만 공역의 모든 원소가 정의역에 대응할 필요는 없다. 그렇기 때문에 정의역에 대응되는 공역의 원소만 따로 모아 부분집합-subset-을 형성할 수 있는데, 이를 치역-Range-이라고 부른다.

 

정의역과 공역이 서로 대응되는 형태에 따른 함수의 종류

출처 :&nbsp;http://www.ktword.co.kr/test/view/view.php?no=5084

  • 전사함수-Surjection--Onto라고도 부름- : 공역의 모든 요소가 정의역에 대응되는 함수 공역 = 치역)
  • 단사함수-Injection--One-to-One라고도 부름- : 정의역과 공역의 요소가 일대일로 대응되는 함수
  • 전단사함수-Bijection--One-to-One and Onto- : 정의역과 공역의 모든 요소가 빠짐없이 일대일로 대응되는 함수

함수의 대응 관계를 확장해 다수 집합의 대응 관계로 발전시킬 수도 있다. 2개의 함수를 연쇄적으로 이어서 하나의 함수로 만드는 연산을 함수의 합성-Function composition-이라 한다.

합성 함수를 이항 연산으로 규정하면, 합성 함수는 결합법칙이 성립한다. $\left ( f\circ g \right )^{-1} = g^{-1} \circ f^{-1}$

 

앞서 수의 연산에서 다룬 항등원, 역원과 동일한 개념이 함수에도 존재한다.

정의역과 공역이 동일한 값으로 대응되는 함수 항등함수-id : Identity function-

합성함수의 대응 결과가 항등함수가 되게 하는 함수 -역함수(Inverse function-

Surjection function 과 Injection function 의 역함수는 함수의 조건을 만족시키지 못하므로Bijectiojn function 이여야만 역함수를 가지게 됨.

곱집합-Cartesian product 혹은 Product set-이란 두 집합의 원소를 순서쌍으로 묶은 원소의 집합을 의미한다. A x B

곱집합의 요소는 각 집합의 원소 a와 b를 다음의 순서쌍으로 묶어 표현한다. ((a, b))

곱집합은 두 집합 A와 B의 요소를 서로 수직으로 배치해 묶는다.

위 성질을 응용해 하나의 직선으로 표현한 실수 집합 ℝ을 확장해 두 실수 집합의 곱집합 ℝ x ℝ로 평면을 나타낼 수 있다.


3장 벡터: 가상 공간의 탄생

 

3.1 데카르트 좌표계

직선의 수 집합을 수직으로 배치해 평면을 표기하는 방식을 데카르트 좌표계-직교 좌표계, cartesian coordinate system-라고 부른다.

1st Quadrant ~ 4thQuadrant -1~4사분면-

 

평면에서의 움직임을 표현하기 위해 ((x, y)) coordinate는 두 실수의 결합이니까 실수의 연산 성질(체의 구조)을 기반으로 새로운 공리를 덧붙여서 평면을 대표하는 집합을 규정하고, 해당 집합에서 이뤄지는 덧셈과 곱셈 연산 체계를 만든다.

 

3.2 벡터 공간과 벡터

두 개 이상의 실수를 곱집합으로 묶어 형성된 집합을 공리적 집합론의 관점에서 규정한 것을 vector space이라고 하며, 벡터 공간의 원소를 vector라고 한다. 공리적 집합론의 관점에서는 특정한 수 집합을 지칭하지 않고 연산이 갖는 성질만 다루기 때문에, 좌푯값으로 사용하는 x, y를 실수로 규정하기보다는 체의 구조를 지니는 집합, 즉 체 집합의 원소로 규정한다. 이렇게 체의 구조를 가지는 수 집합의 원소를 scalar라고 부른다. 즉 우리가 좌표로 사용하는 실수 x, y는 모두 공리적 집합론의 관점에서 스칼라인 것이다.

 

벡터 공간에서의 두 가지 기본 연산 : 벡터의 합, 스칼라배


+벡터 공간의 공리+

[선형대수학] 25. 벡터공간의 공리(1), .. : 네이버블로그 (naver.com)

 

[선형대수학] 25. 벡터공간의 공리(1), Vector Space Axioms

이번 포스팅부터 선형대수학의 또다른 중요한 파트인 '벡터공간'을 다루려고 합니다. 엔지니어와 물리학자...

blog.naver.com

 


수의 크기 = 원점으로부터의 거리 -절댓값 기호 | |; 피타고라스 정리

$\left\| v\right\|$ Norm:벡터의 크기 Unit Vector:단위 벡터 $\hat{v}$ 기호 써서 표시

$\hat{v} = \frac{\vec{v}}{\left\| \vec{v} \right\|}$ : Normalize : 정규화한다

 

3.3 벡터의 결합과 생성

벡터 공간의 벡터의 합과 스칼라 곱셈 연산은 선형성((superposition, homogeneity)) 이 있어 선형 연산이라고도 한다.

선형 연산을 사용해 n개의 스칼라, n개의 벡터를 결합해 새로운 벡터를 생성하는 수식을 선형 결합-Linear combination- 이라고 한다.

$$2\cdot \left ( 1, 1 \right )+\left ( -1 \right )\cdot \left ( 2,2 \right )=\left ( 0,0 \right )$$

이 식과 같이 모든 스칼라 값이 0이 아님에도 영벡터를 만들 수 있다면, 선형 결합에 사용된 벡터는 서로 '선형 종속의 관계'를 가진다라고 표현한다. 따라서 ((1, 1))과 ((2,2))의 두 벡터는 선형 종속인 관계를 갖는다. 반면 영벡터가 나오기 위해서 모든 스칼라의 값이 0이어야 한다면 선형 결합에 사용된 벡터들은 서로 선형 독립의 관계를 갖는다.

선형 독립의 관계를 가지는 벡터를 선형 결합하면 벡터 공간에 속한 모든 벡터를 생성할 수 있다. 

Basis :기저; 선형 독립 관계를 가지는 벡터의 집합 >> Dimension

Basis vector : 기저벡터; 기저에 속한 원소 

Real vector space : 실벡터 공간

standard basis : 표준 기저; 다양한 기저 중에서 ((0,1)), ((1,0)) 와 같이 한 축만 사용하는 단위 벡터로 구성된 집합

standard basis vector : 표준기저벡터; 표준 기저에 속한 원소 $e_{1}, e_{2}, \cdots $ <표기 기호

벡터 공간의 차원에는 제약이 없다.

                               


4장 삼각함수 : 회전을 위한 수학

회전은 원의 궤적을 따라 이동하는 움직임이기 때문에, 이를 이해하려면 원과 밀접하게 연결되어 있는 삼각함수를 알아야 한다.

 

삼각함수 -trigonometric function- 직각삼각형을 데카르트 좌표계 상에 배치하고 사잇각의 범위를 실수 전체(ℝ 집합)로 확장한 대응관계

 

$$ cos^{2}\theta + sin^{2}\theta = 1$$

Amplitue((진폭)), Period((주기)), Even function((짝함수, 우함수)), Odd function((홀함수, 기함수))

Angle, degree, Radian((호의 길이가 1일 때 각도)) $\pi = 180\degree$

 

4.3 삼각함수의 역함수

게임 제작과정에서는 주어진 벡터의 좌표로부터 이에 대응하는 각도를 얻어내는 작업도 필요하다. 이를 계산하려면 삼각함수의 역함수와 이에 대한 성질을 알아야 한다. 역삼각함수

영역을 제한시켜 전사함수의 성질을 가지게 해 역함수를 구함 

$$ f^{-1} = sin^{-1}\theta = arcsin \theta$$

$$ f^{-1} = cos^{-1}\theta = arccos \theta$$

$$ f^{-1} = tan^{-1}\theta = arctan \theta$$

arctan 함수는 벡터의 각도를 구하는 데 유용하게 사용된다. 임의의 벡터를 $\vec{v} = (x,y)$ 라고 할 때 분수식 $\frac{y}{x}$ 를 계산해 벡터로부터 tan 함수 값을 얻을 수 있다. 이 tan 값을 arctan 함수에 넣으면 해당 벡터가 x 축과 이루는 사잇각 얻어낼 수 있다.

 

arctan에 y/x로 값을 넣으면 4th quardrant 일 때 양수 값이 나와 1st quadrant 각이 나옴 >> x, y 인자를 분리해서 받아서 어느 quadrant 에 있었는지 찾아냄 ((-x, y)) -> 2nd , ((-x, -y)) -> 3rd

 

4.4 극좌표계

https://everyday-image-processing.tistory.com/270

Cartesian coordinate system ((데카르트 좌표계)) 으로 회전을 구현하면 회전에 따른 x와 y의 변화를 매번 계산하는 번거로움이 발생한다. 이를 해소하기 위해 회전 동작을 기반으로 설계된 좌표계가 바로 Polar coordinate system ((극좌표계))다. 극좌표계는 원점으로부터의 거리 (r)과 각 $\theta$의 두요소로 구성되며 극좌표계의 좌표는 $(r, \theta)$로 표시한다.

 

데카르트 좌표계로 표현된 벡터 $(x,y)$는 벡터의 크기와 arctan 함수를 사용해 다음과 같이 극좌표계 $(r, \theta)$로 변환할 수 있다.

$$r = \sqrt{x^{2} + y^{2}}$$

$$\theta = arctan(y/x)$$

반대로 극좌표계의 좌표 $(r, \theta)$ 를 데카르트 좌표계 $(x,y)$로 변화하는 식은 삼각함수를 사용해 구할 수 있다.

$$x = r \cdot cos\theta$$

$$y = r \cdot sin\theta$$


5장 행렬 : 가상 세계의 변환 도구

Liniarity((선형성)) 을 수학에서는 다음과 같이 1:Additivity((가법성)), 2:Homogeneity of degree 1((1차 동차성)) 두 가지 조건을 모두 만족하는 함수의 성질로 정의한다.

$$1:f(x_{1} + x_{2}) = f(x_{1}) + f(x_{2}) $$

$$2:f(k \cdot x) = k \cdot f(x) $$

선형성이란 단지 곧게 뻗은 직선의 성질 뜻하는 것이 아니라, 두 집합의 순수한 비((Ratio))로 구성된 1차적 대응 관계를 의미한다. 함수 $f(x) = ax$에서 대응되는 두 집합은 순수한 비로 구성되어 있기 때문에 다른 입력값을 투여했을 때 어떤 출력값이 나올지 쉽게 예측할 수 있으며, 반대로 역함수 $f(x) = \frac{1}{a}x$를 사용하면 출력값으로부터 입력값을 거꾸로 계산하는 것이 가능하다.

 

5.1.2 벡터 공간의 선형 변환

V and W are vector space

표준기저벡터의 선형 결합으로 형성된 벡터 공간은 선형성을 지닌다.

이 벡터 공간을 선형 함수로 변화시킨 새로운 공간도 기저벡터의 선형 결합으로 형성되므로 선형성을 지닌다. 이렇게 두 공간이 동일한 구조를 지닐 때 두 공간의 대응 관계를 Transformation((변환))이라고도 부른다.

따라서 선형성을 유지시켜주는 선형 함수 $f(x, y) = (ax + by, cx + dy)$는 Linear transformation((선형 변환))이라고 한다.

 

임의의 벡터 $\vec{v}$를 (k)배 늘리기

$$f(\vec{v}) = f(x,y) = (kx, ky)$$

임의의 벡터 $\vec{v}$를 각 $\theta$만큼 회전시키기

$$f(\vec{v}) = f(x,y) = (cos\theta x - sin \theta y, cos \theta x + sin \theta y)$$

 

벡터 공간에서의 선형 변환은 두 집합의 순수한 비를 통해 예측가능한 형태로 변환되며, 역함수를 통해 변환 전 벡터를 파악할 수 있다.

 

5.2 행렬

Matrix, Row vector, Column vector, Square matrix

행렬의 곱셈은 앞에 위치한 행렬의 행벡터와 뒤에 위치한 행렬의 열벡터를 각각 곱하는 방식으로 진행됨.

행렬 곱은 Commutative law 만족 안함, Associative law 는 가능

$$(A \cdot B)^{T} = B^{T} \cdot A^{T} $$

2 x 2 정방행렬 A와 2차원 벡터 (x, y)의 곱은 선형 변환 $f(x, y) = (ax + by, cx + dy)$ 와 동일하다.

$$A \cdot (x, y) = \begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix} \cdot \begin{pmatrix}
x \\
y \\
\end{pmatrix} = \begin{pmatrix}
ax + by\\
cx + dy \\
\end{pmatrix}$$

2 x 2 정방행렬 A는 2차원 공간의 선형 변환에 대응되는 함수를 의미하고, 이 수식은  $f(x, y) = (ax + by, cx + dy)$  2차원 벡터에 선형 변환을 적용해 새로운 벡터를 생성하는 작업으로 해석할 수 있다. 또한 선형 변환을 적용하기 위한 연산 순서는 오른쪽에서 왼쪽 방향으로 이뤄짐을 알 수 있다.

 

$$\vec{w}= B \cdot ( A \cdot \vec{v} ) = (B \cdot A ) \cdot \vec{v}$$

Associative law 가 성립하는 행렬 곱의 성질은 컴퓨터 그래픽 연산에서 아주 유용하게 활용된다. 선형 변환을 수행하는 행렬들의 곱을 미리 연산해놓고 이후 물체의 점 벡터와 연산시키면 계산량이 크게 줄어듬

 

행렬과 벡터의 곱셈을 수행하는 방식으로, 열 기준 행렬(Column major matrix)과 행 기준 행렬(Row major matrix) 두 가지가 있다. 수학에서 행렬을 다룰 때는, 벡터를 열벡터로 나타내는 열 기준 행렬 방식을 주로 사용한다.

Column major matrix ((열 기준 행렬)) 연산 방향 : R - > L

$$\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix} \cdot \begin{pmatrix}
x \\
y \\
\end{pmatrix} = \begin{pmatrix}
ax + by\\
cx + dy \\
\end{pmatrix}$$

 

Row major matrix (( 행 기준 행렬)) 연산 방향 : L -> R 

$$\begin{pmatrix}
x & y \\
\end{pmatrix} \cdot \begin{pmatrix}
a & c \\
b & d \\
\end{pmatrix} = \begin{pmatrix}
ax + by\\
cx + dy \\
\end{pmatrix}$$

벡터를 Transpose 시키면 열 기준 행렬에서의 곱과 행 기준 행렬 곱이 같아짐

$$\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix} ^{T}  = \begin{pmatrix}
a & c \\
b & d \\
\end{pmatrix} $$

행 기준 방식을 사용하는 대표적인 사례로는 게임 그래픽스 라이브러리인 DirectX가 있으며, 열 기준 방식을 사용하는 게임 그래픽스 라이브러리로는 OpenGL이 있다. Unity engine은 C# 스크립트에서 열 기준 방식을 사용하고 , Unreal engine의 C++ 코드는 행 기준 방식을 사용한다. 열 기준 체계에서 설계된 수식을 행 기준에서 가져다 쓰고 싶다면 전치연산을 적용해 변환하면 됨 //행벡터와 열벡터의 의미 한 번 더 생각해보기

 

Scale transformation matrix ((크기 변환 행렬))

$$S = \begin{pmatrix}
a & 0 \\
0 & b \\
\end{pmatrix}$$

Rotation transformation matrix ((회전 변환행렬))

$$R_{\theta} = \begin{pmatrix}
cos\theta & -sin\theta \\
sin\theta  & cos\theta \\
\end{pmatrix}$$

Shear transformation matrix ((전단 변환행렬))

x축 방향으로 a만큼 미는 전단 변환행렬

$$S = \begin{pmatrix}
1 & a \\
0 & 1 \\
\end{pmatrix}$$

 

선형 변환을 수행하는 행렬은 본질적으로 함수의 성질을 지니기 때문에 항등함수와 역함수에 대응하는 행렬이 존재한다.

 

Identity matrix ((항등행렬))은 원 공간의 변화없이 동일한 공간으로 유지하는 변환을 의미한다. 변환된 공간의 표준기저벡터는 원 공간의 표준기저벡터와 동일하다. 따라서 항등행렬은 표준기저벡터 (1, 0)과 (0, 1)을 순서대로 넣어 만들 수 있다. 항등행렬은 (I)로 표기한다.

$$I = \begin{pmatrix}
1 & 0 \\
0 & 1 \\
\end{pmatrix}$$

역함수의 정의와 동일하게 행렬 곱의 결과가 항등행렬이 나오는 특별한 행렬을 Inverse matrix ((역행렬))이라고 부른다. 

$$A \cdot  A^{-1} = A^{-1} \cdot A = I$$

 

어떤 함수가 역함수를 갖기 위한 조건은 전단사함수이다. 행렬도 함수이므로 두 공간의 변환이 전단사로 대응될 때만 역행렬이 존재한다. 역행렬이 존재를 알 수 있는 수식 Determinant ((행렬식))

$$A = \begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}$$

$$det(A) = ad - bc$$

Determinant의 값이 0이면 역행렬이 존재하지 않는다. //Be Invertible matrix & Determinant is not zero

두 기저벡터가 형성하는 Parallelogram((평행사변형))의 넓이가 0 >> 원 공간의 정보가 소실됨

행렬식의 값이 음수 >>  표준기저벡터가 변환 과정에서 위아래가 뒤집힘 >> 뒤집힌 반대

크기 변환행렬의 역행렬 곱해진 수에 역수를 곱함

전단 변환행렬의 역행렬 민 방향에 반대 방향으로 밀음 위에 예시로 들었던 행렬 기준이면 a에 마이너스

회전 변환행렬의 역행렬

$$R^{-1}_{\theta} = R_{-\theta} \begin{pmatrix}
cos( -\theta ) & -sin( -\theta ) \\
sin( -\theta )  & cos( -\theta ) \\
\end{pmatrix} = \begin{pmatrix}
cos\theta & sin\theta \\
-sin\theta  & cos\theta \\
\end{pmatrix} (\therefore R_{\theta}^{-1} = R^{T}_{\theta})  $$

행렬곱의 역행렬 : $(A \cdot B)^{-1} = B^{-1} \cdot A^{-1}$


6장 아핀 공간 : 움직이는 가상 세계의 구축

5장에서 크기, 회전, 밀기에 대한 선형변환을 행렬로 설계하는 방법에 대해 알아봤는데 벡터의 이동 기능을 구현하기 위해 6장에서는 새로운 방법을 소개한다. 이 방법은 벡터 공간의 일부에만 적용할 수 있는데, 이동이 가능한 부분 공간을 Affine space ((아핀 공간))이라고 부른다. 동일한 형태의 행렬 곱으로 모든 변환 방식을 통일시켜주는 아핀 공간으로부터 가상 세계의 기반이 완성된다.

 

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

$$A \cdot \begin{bmatrix}
x \\
y \\
\end{bmatrix} = \begin{bmatrix}
 x + a  \\
 y + b  \\
\end{bmatrix}$$

위 식의 행렬 곱을 만족하는 정방행렬 는 존재하지 않는다. 표준기저벡터의 원점을 이동시키는 변환이 행렬이 되기 위해서는 선형성을 만족해야 하는데, 선형성이 되기 위해서는 기저벡터는 원점에서부터 출발해야 한다는 조건을 만족해야 하기 때문이다.

원점에서 벗어난 $f(x) = ax + b$은 additivity가 만족안됨
$f(x_{1} + x_{2}) = a(x_{1} + x_{2}) + b \neq f(x_{1}) + f(x_{2}) = ax_{1} + ax_{2} + 2b$

 

그런데 공간의 차원을 하나 더 늘려 선형변환을 위한 원점과의 연결고리로 활용한다면 선형 변환의 형태로 이동을 구현할 수 있다.

 

$$\begin{bmatrix}
1 & a \\
0 & 1 \\
\end{bmatrix} \cdot \begin{bmatrix}
x \\
1 \\
\end{bmatrix} = \begin{bmatrix}
x+ a\\
1 \\
\end{bmatrix} $$

위 식과 같은 전단 변환의 성질을 활용한다면, 선형 변환의 체계에서 특정 조건하에 이동 기능의 구현이 가능하다. 위 수식으로 $y=1$이라는 조건하에 $a$ 만큼 미는 전단 변환의 결과는 1차원의 이동 변환 $x+a$로 활용할 수 있다.

 

$$ \begin{bmatrix}
1 & 0 & a \\
0 & 1 & b \\
0 & 0 & 1 \\
\end{bmatrix} \cdot \begin{bmatrix}
x \\
y \\
1 \\
\end{bmatrix} = \begin{bmatrix}
x + a \\
y + b \\
1 \\
\end{bmatrix}$$

이처럼 $z=1$의 조건에서 임의의 벡터$(x,y)$를 지정한 크기 $(a,b)$만큼 이동시키는 2차원의 이동 변환을 만들 수 있다.

 

마지막 차원의 값이 1이라는 특정 조건을 가지는 전단 변환을 활용하면 게임 콘텐츠 제작에 필수적인 이동 기능을 행렬로 구현할 수 있다. 이를 Translate tranformation matrix ((이동 변환행렬))이라고 한다.

 

벡터 공간에서 이동을 위해 마지막 차원 값을 1로 한정한 부분 공간을 Affine space라고 부른다.

$$S = \begin{bmatrix}
a & 0 & 0 \\
0 & b & 0 \\
0 & 0 & 1 \\
\end{bmatrix} \cdot \begin{bmatrix}
x \\
y \\
1 \\
\end{bmatrix} = \begin{bmatrix}
ax \\
by \\
1 \\
\end{bmatrix}$$

$$R = \begin{bmatrix}
cos\theta & -sin\theta & 0 \\
sin\theta & cos\theta & 0 \\
0 & 0 & 1 \\
\end{bmatrix} \cdot \begin{bmatrix}
x \\
y \\
1 \\
\end{bmatrix} = \begin{bmatrix}
cos\theta x - sin\theta y \\
sin\theta x + cos\theta y \\
1 \\
\end{bmatrix}$$

$$T = \begin{bmatrix}
1 & 0 & a \\
0 & 1 & b \\
0 & 0 & 1 \\
\end{bmatrix} \cdot \begin{bmatrix}
x \\
y \\
1 \\
\end{bmatrix} = \begin{bmatrix}
x + a \\
y + b \\
1 \\
\end{bmatrix}$$

위 식들과 같이 한 차원을 높여 설계한 선형 변환을 Affine trasformation((아핀 변환))이라고 한다.

 

6.2 아핀 공간의 구성 요소

마지막 차원 값이 1인 아핀 공간의 원소를 Point((점))라고 부른다. 점이 지니는 성질은 행렬 곱을 사용해 이동이 가능하다는 것이다. 가상 공간이 이동하려면 물체는 점으로 구성되어야 한다.

 

2차원 공간의 point : $(x, y, 1)$, 3차원 공간의 point $(x, y, z, 1)$

 

벡터의 합 연산으로 아핀 공간의 원소인 점을 이동 시켰을 때, 행렬 곱의 장점을 유지하기 위해서는 그 결과는 항상 아핀 공간에 닫혀 있어야 한다. 이를 위해서 아핀 공간은 Vector라는 개념을 추가로 제공한다. Vector는 아핀 공간내의 이동을 지정하기 위해 사용되는데, 벡터 공간의 원소로 정의한 벡터와 구분하기 위해 아핀 공간의 벡터를 이동 벡터 또는 Displacement vector((변위 벡터))라고 부른다. 이동 벡터는 아핀 공간의 점과 점 간의 최단 거리로 정의된다.

 

$$P_{1}  = (x_{1}, y_{1}, 1),  P_{2}  = (x_{2}, y_{2}, 0)$$

$$P_{1} - P_{2} = -\vec{v} = (x_{1} - x_{2}, y_{1} - y_{2}, 0) $$

https://velog.io/@sch990428/%EA%B2%8C%EC%9E%84-%EC%88%98%ED%95%99-9-%EC%95%84%ED%95%80-%EA%B3%B5%EA%B0%842

 

Displacement vector 구하기

$$\vec{v} = P - 0 = (x,y,1)-(0,0,1) = (x,y,0)$$

 

현실 세계 역시 보이는 물체와 보이지 않는 힘으로 구성되어 있으므로, 아핀 공간의 점과 이동 벡터를 사용한다면 현실 세계를 복제한 가상 공간을 구축할 수 있게 된다.

 

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

 

게임 콘텐츠를 담는 가상 세계를 구성하는 두 요소

  • Point ((점)): 물체를 표현하고 위치를 지정하는 데 사용한다. 마지막 차원의 값은 항상 1이다.
  • Displacement vector ((이동 벡터))  : 물체를 움직이는 데 사용한다. 마지막 차원의 값은 항상 0이다.

점과 벡터의 마지막 차원 값을 토대로 두 요소 사이에는 다음과 같은 연산 규칙이 성립된다.

  • 점 - 점 = 벡터
  • 점 + 점 != 점 (차원 값이 2가 돼서 선형성이 깨짐, 하지만 합이 1이 유지가 된다면? 아핀조합:affine combination)
  • 점 + 벡터 = 점
  • 벡터 + 벡터 = 벡터

6.3 아핀 결합

아핀 공간을 다룰 때 점과 점을 더한 결과는 사용할 수 없다. 그런데 점과 점을 더할 때 그대로 더하는 것이 아닌 선형 결합의 형태로 점에 스칼라(계수)를 곱해 더한다면, 특정 조건에서 새로운 점을 생성하는 것이 가능해진다.

 

$$a \cdot P_{1} + b \cdot P_{2} + \cdots  = (ax_{1}+bx_{2}+\cdots,\cdots ,{\color{Red}  a \color{Red}  + \color{Red}  b \color{Red}  + \color{Red}   \cdots } )$$

각각 스칼라를 곱한 선형 결합의 식에서 마지막 차원의 값의 합이 항상 1이 되어야 새로운 점이 생성됨. 이렇게 여러 개의 점을 결합해 새로운 점을 생성하는 수식을 Affine combination((아핀 결합))이라고 한다.

 

$n$ 개의 점을 아핀 결합하는 경우 각 점을 $P_{i}$로, 점에 사용하는 스칼라를 $c_{i}$로 지정한 후 시그마 기호를 사용해 다음과 같이 간략히 표현 가능함.

$$ \sum_{i=1}^{n} c_{i} \cdot P_{i} (s.t. \sum_{i=1}^{n} c_{i} = 1)$$

 

차원의 값((스칼라))의 합이 항상 1이 되는 점을 이용해 두 점의 스칼라를 $a$, $(1-a)$라 둔다면

 

 

직선의 방정식은 a의 범위에 따라 다양한 종류의 선으로 대응되는데 각 범위마다 line((직선)), ray((반직선)), line segment((반직선))이라고 부른다.

 

line은 두 점의 양쪽 방향으로 무한히 뻗어나가는 선의 형태를 의미하며 추상적인 선의 성질을 표현할 때 사용한다.

 

Ray는 지정한 위치에서 한쪽 방향으로만 뻗어나가는 선을 뜻한다. 반직선도 추상적인 개념이지만 게임 제작에서 여러 용도로 사용된다.게임 제작에서 전방에 물체가 있는지 탐지하기 위해 사용되는 기능에 Raycasting((레이캐스팅))이 있다. 이는 말 그대로 지정한 위치에서 특정 방향으로 ray를 casting-던져 이와 맞닿는 물체를 탐지하는 기능이다. 컴퓨터 그래픽스에서 각광받는 raytracing 기술에도 ray-반직선 개념이 사용된다. 레이트레이싱은 화면에 도달한 빛의 경로를 거꾸로 Tracing-추척해 현실 세계와 유사하게 빛의 경로를 시뮬레이션하여 사실적인 이미지를 만들어내는 기법이다.

 

line segment는 시작점과 끝점의 위치가 정해져 있는 선을 말한다. 프로그래밍을 활용해 화면에 선을 그리려면 무한이라는 추상적인 개념을 배제하고 명확하게 시작점과 끝점을 정해주어 선분의 형태로 정보가 제공되어야 한다.

 

6.4.2 선 그리기 알고리즘

 

https://mycom333.blogspot.com/2013/03/screen-transform.html

수학에서 사용하는 데카르트 좌표계와 달리 모니터 화면의 좌표계는 y축이 아래쪽을 향하는 방식을 사용한다. 이를 Screen coordinate((스크린 좌표계))라고 한다. 스크린 좌표계는 y축 말고도 Continuous((연속된)) 실수가 아닌 서로 독립된 영역을 가지는 Discrete((이산적인)) 정수를 사용한다. 그래서 하나의 스크린 좌표는 네모난 영역에 대응된다.

//OpenGL 원점은 좌하단에 y축이 위로

  데카르트 좌표계  스크린 좌표계
수 집합 실수 정수
수의 성질 연속성 이산성
단위 원소 벡터 픽셀
수의 범위 실수 범위 0 ~ 해상도 크기

 

스크린 좌표계를 사용해 화면에 무언가를 표현하기 위해서는 반드시 색상이 함께 지정되어야 한다. 이렇게 스크린 좌표와 색상에 대응하는 화면의 구성 요소를 Pixed이라고 한다. 따라서 벡터를 화면의 점으로 최종 표현하기 위해서는 실수로 표현된 벡터 좌표를 정수로 변환한 후 색상을 부여하는 과정을 거쳐야 한다. 이러한 변환 과정을 Rasteriztion((픽셀화, 래스터화))라고 한다.

 

픽셀화 과정에서 고려할 것 화면 해상도의 크기가 짝수인 경우, 데카르트 좌표계의 원점인 $(0,0)$을 표현하려면 어쩔 수 없이 중앙을 공유하는 네 픽셀 중 하나를 선택해야함 반대로 스크린 좌표를 벡터로 변환해야 하는 경우도 픽셀 가로 세로 [0, 1] 범위 영역에서 대표하는 값을 정해야 함.

 

//To screen coordinate
InPos.X + screenSize.x*o.5f, -InPos.y + ScreenSize.Y * 0.5f

//To cartesian coordinate
X  + 0.5f - screenSize.x * o.5f, -(y + 0.5f) + ScreenSize.Y * 0.5f
Bresenham's algorithm ((브레젠험 알고리즘))

 

Bresenham's line algorithm (tistory.com)

 

Bresenham's line algorithm

Bresenham's line algorithm - Wikipedia Bresenham's line algorithm - Wikipedia From Wikipedia, the free encyclopedia Line-drawing algorithm Bresenham's line algorithm is a line drawing algorithm that determines the points of an n-dimensional raster that sho

ndhphysics.tistory.com

 

Cohen-Sutherland line clipping algorithm ((코헨-서덜랜드 라인 클리핑 알고리즘))

 

브레젠험 알고리즘은 시작지점에서 목표지점에 도달할 때까지 한 픽셀식 전진하면서 점을 찍기 때문에, 화면을 벗어나는 굉장히 큰 값이 들어오더라도 목표에 도달할 때까지 한 칸식 전진하면서 계산해야 한다. 이러한 상황에 대비해 안전 장치를 마련해야 한다. 화면 영역을 벗어나는 큰 선분을 화면 영역에 유효하게 잘라주는 것이다. 이렇게 선분이 가진 성질은 유지하면서 지정된 영역에 맞는 데이터로 재설정하는 작업을 Clipping((클리핑))이라고 한다.


 

https://en.wikipedia.org/wiki/Line_clipping

 

클리핑을 통해 선분을 그릴 때 고려해야 할 상황은 다음과 같이 세 가지로 나뉜다.

 

1.화면 안에 위치해서 자를 필요가 없는 경우

 

2.화면 밖에 위치해 있어서 그릴 필요가 없는 경우

 

3.화면을 가로질러서 화면에 유효한 영역으로 잘라내야 하는 경우

 

 

 

 

이 case들을 구분하기 위해 선분을 그릴 영역을 화면과 그 바깥 영역을 포함해 총 9개로 설정한다.

 

 

오른쪽 그림과 같이 9개 영역을 나누고 화면 영역을 제일 가운데 두고 0b0000을 할당한다.

 

화면 영역을 기준으로 상위 비트 2자리 값을 화면 영역보다 위면 10 아래면 01 같으면 00으로 둔다.

 

좌우측도 앞선 방법처럼 하위 비트 2자리 값을 화면 영역보다 좌측에 있으면 01 우측에 있으면 10 같은 열이면 00으로 둔다.

 

 

 

선분을 그릴 두 점의 위치로 영역에 따른 이진수 값을 받아온다. 이 값을 각각 A, B라 하자. 클리핑 판단은 다음과 같다.

 

case 1 : (A == 0) && (B == 0) 이 참일 경우, 두 점은 화면 영역에 있으므로 클리핑 하지않는다.

case 2 : A & B > 0 이 참일 경우, 두 점은 화면 영역 밖에 있으므로 그리지 않는다. 

case 3 : A & B == 0 이 참일 경우, 두 점을 이은 선분은 화면 영역 밖에서 화면 영역을 지나니 클리핑한다.


 

 

 

 

오른쪽 그림과 같이 화면 영역 밖에 있지만 case 3에 해당하는 경우

일단 클리핑을 한 번 한 다음에 다시 한 번 클리핑 판단을 하면 case 2에 해당해 그리지 않게 되니 상관없다.

 

 

 

 

 

 


 

 

min, max 는 화면 영역의 길이를 나타낸다.

 

#각 영역에 접근하는 법

점의 영역에 따른 이진수 값을 current라 하자.

  • current < 0b0100 : 중간행
  • currentTest & 0b0100 : 아래행, else 위행

#클리핑 좌표 구하기

선분을 이루는 두 점 A, B의  x, y 좌표를 (AX ...) 이렇게 나타내자. 그리고 두 점을 클리핑한 점을 각각 (A`), (B`)라 하자.

  1. A`의 x좌표는 min_X로 구한다.
  2. A`의 y좌표는 $\triangle ABC \sim  \triangle AA`a$을 이용해 구한다.
  3. B`의 y좌표는 max_Y로 구한다.
  4. B`의 x좌표는 $\triangle ABC \sim  \triangle BB`a$을 이용해 구한다.

#닮음을 통해 좌표 구하기

1.A`의 y 좌표

$\overline{A`a} : \overline{Aa} = \overline{BC} : \overline{AC}$, 이때 $\overline{Aa}=minX - AX$,  $\overline{AC} = width$, $\overline{BC} = height$ 이므로 위 식은 다음과 같다.

$$\frac{\overline{A`a}}{minX  - AX } = \frac{height}{width}$$

$$\overline{A`a} = (minX  - AX)\cdot \frac{height}{width}$$

따라서 A`의 y좌표는 A의 x좌표에서 $ \overline{A`a}$ 만큼 이동한 다음과 같다.

$$A`X = AX + (minX  - AX)\cdot \frac{height}{width}$$

 

2.B`의 x 좌표

$\overline{Bb} : \overline{B`b} = \overline{BC} : \overline{AC}$, 이 식을 앞서 했던 방법으로 정리하면 다음과 같다.

$$\overline{B`b} = (BY - maxY) \cdot \frac{height}{width}$$

따라서 B`의 x좌표에서  $ \overline{B`b}$ 만큼 이동한 다음과 같다.

$$B`X = BX + (maxY + BY ) \cdot \frac{height}{width}$$

 


7장 내적 : 벡터 공간의 분석과 응용

곱셈과 덧셈만으로 구성된 벡터 내적은 컴퓨터에서 굉장히 빠르게 계산할 수 있으면서, 벡터 공간에 관련된 문제를 손쉽게 해결해주기 때문에 게임 제작에서 매우 유용한 연산이다.

 

#Dot product((벡터의 내적))

벡터의 내적은 같은 차원의 두 벡터가 주어졌을 때 벡터를 구성하는 각 성분을 곱한 후 이들을 더해 스칼라를 만들어내는 연산이다. 

 

http://www.findmean.com/%EC%88%98%ED%95%99/%EB%B2%A1%ED%84%B0/%EB%B2%A1%ED%84%B0%EC%9D%98-%EB%82%B4%EC%A0%81/

내적은 스칼라의 곱셈과 덧셈으로 구성되어 있으므로 교환법칙이 성립한다. 하지만 벡터가 스칼라로 나오는 성질로 인해 결합법칙은 성립하지 않는다. 그리고 내적은 덧셈에 대한 분배법칙이 성립한다.

$$\vec{u} \cdot \vec{v}  = \vec{v} \cdot \vec{u}$$

$$\vec{u} \cdot (\vec{v} \cdot \vec{w}) \neq (\vec{u} \cdot \vec{v}) \cdot \vec{w}$$

$$\vec{u} \cdot (\vec{v} + \vec{w}) = \vec{v} \cdot \vec{u} + \vec{w} \cdot \vec{u}$$

// 벡터의 크기는 피타고라스 정리를 활용한 최단 거리의 개념 외에도 자신을 내적한 결과의 제곱근으로도 정의할 수 있다.

 

내적은 교환법칙과 분배법칙이 성립하기 때문에, 두 벡터 합의 내적은 두 벡터의 크기로 표현할 수 있다.

$$(\vec{u} + \vec{v}) \cdot (\vec{u} + \vec{v}) = \left\|\vec{u}^{2} \right\| + \left\|\vec{v}^{2} \right\| + 2\cdot \vec{u} \cdot \vec{v}$$

 

두 $\vec{u}, \vec{v}$의 사잇각 $ \vec{u} \cdot \vec{v} =  \left\|\vec{u}\right\|  \left\|\vec{v} \right\| cos\theta$ 

 

두 unit vector의 사이각은 $cos \theta$임 직교하면 $cos$ 값은 0

 

행렬의 곱셈 연산은 내적으로 표현이 가능하다.

$$\begin{bmatrix}
ax + by \\
cx + dy \\
\end{bmatrix} = \begin{bmatrix}
(a,b)\cdot(x,y) \\
(c,d)\cdot(x,y) \\
\end{bmatrix}$$

$$\begin{bmatrix}
a & b \\
c & d \\
\end{bmatrix} = \begin{bmatrix}
e & f \\
g & h \\
\end{bmatrix} = \begin{bmatrix}
(a,b)\cdot (e, g) & (b,d)\cdot (f, h) \\
(c,d)\cdot (e, g) & (c,d)\cdot (f, h) \\
\end{bmatrix}$$

 

#Orthogonal matrix((직교 행렬))

정방행렬을 구성하는 모든 행벡터와 열벡터의 크기가 1이고 벡터들이 서로 직교하는 행렬이다. 직교행렬이 지니는 특징은 직교행렬의 전치행렬은 역행렬이 된다는 점이다. 직교행렬 (Q)와 이의 전치행렬 $Q^{T}$의 곱은 항등행렬이 된다.

$$Q \cdot Q^{T}  = I$$

 

회전 변환행렬은 각 행벡터와 열벡터의 크기가 1이고 서로 직교하므로 직교행렬이다

$$R^{T}_{\theta} \cdot R_{\theta} = \begin{bmatrix}
cos^{2}\theta + sin^{2}\theta & 0 \\
0 &  cos^{2}\theta + sin^{2}\theta \\
\end{bmatrix} = \begin{bmatrix}
1 & 0 \\
0 & 1 \\
\end{bmatrix} = I$$

 

여러 종류의 선형 변환 중 물체의 형태가 그대로 유지되는 선형 변환을 Rigid transformation((강체 변환))이라고 하는데, 선형 변환이 강체 변환이 되기 위한 조건은 다음과 같다.

  1. 변화된 기저벡터의 크기는 모두 1이어야 한다.
  2. 모든 기저벡터는 서로 직교해야 한다.
  3. 행렬식의 값이 1이어야 한다.

따라서 회전 변환은 강체 변환의 성질을 가지고 있다.

 

#시야 판별

목표물이 캐릭터 시선에 대하여 어디에 있는지 벡터의 내 연산으로 알아낼 수 있다.

 

 

시선 벡터와 목표물로 향하는 벡터를 normaliz 시키면 두 벡터의 내적은 $cos \theta$ 와 값이 같으므로 $cos \theta$의 그래프를 통해 두 벡터의 위치를 알 수 있다. 

  • 벡터 내적의 결과가 양수: 두 벡터는 같은 방향을 향하고 있다.
  • 벡터 내적의 결과가 음수: 두 벡터는 다른 방향을 향하고 있다. 벡터는 위치의 개념이 없으므로 두 벡터는 서로 마주 보고 있다로도 해석할 수 있다.
  • 벡터 내적의 결과가 0: 두 벡터는 서로 직교한다.

$cos \theta$ 는 0~180도 범위에서 각이 커질수록 값이 작아지는 성질을 지닌다. 따라서 $cos \theta$의 값과 시야 벡터와 목표물의 $cos \theta$ 값을 비교함으로써 시야각 안에 목표물이 탐지됐는지 판별이 가능하다.

 

7.3 조명 효과의 구현

현실 세계와 비슷한 조명 효과를 만들기 위해 고안된 방법으로 Lambertian reflection 램버트 반사 모델이 있다. 이 모델을 고안한 스위스의 수학자 Johann Heinrich Lambert 요한 하인리히 램버트의 이름을 따서 지어진 램버트 반사 모델은 컴퓨터 그래픽스에서 표면에서의 조명 모델 계산을 위해 쓰인다. 램버트 반사 모델은 계산량이 적어 속도가 빠르지만 그럴듯한 조명 효과를 줄 수 있어 실시간 조명 구현이 필요한 게임 제작에 널리 사용된다.

https://lavalle.pl/vr/node197.html

광원이 물체를 향해 직사광선을 발사하는 상황을 가정해보자. 빛을 받아 표면에서 반사되는 빛의 세기는 두 벡터가 만드는 사잇각의 cos 함수에 비례한다는 것이 램버트 반사 모델의 주요 내용이다. 표면이 향하는 단위 벡터를 $\hat{N}$으로 지정하고 표면에서 광원으로 향하는 단위 벡터를 $\hat{L}$로 지정해보자.

두 벡터의 내적을 사용하면 램버트 반사 모델에 필요한 사잇각의 cos 값을 얻을 수 있다.

$$\hat{N} \cdot \hat{L} = cos \theta$$

 

#투영 벡터

벡터 내적은 어떤 벡터를 다른 벡터에 직교 투영하는 용도로 사용된다.

$$\vec{v'} = \left\|\vec{v'}\right\|\cdot\hat{v}$$

$$= \left\|\vec{u} \right\|cos\theta \cdot \frac{\vec{v}}{\left\|\vec{v} \right\|}$$

$$= \left\|\vec{u} \right\|\frac{\vec{u}\cdot\vec{v}}{\left\|\vec{u} \right\|\left\|\vec{v} \right\|} \cdot \frac{\vec{v}}{\left\|\vec{v} \right\|}$$

$$= \frac{(\vec{u}\cdot\vec{v})}{\left\|\vec{v} \right\|^{2}}\cdot\vec{v}$$

$$= \frac{(\vec{u}\cdot\vec{v})}{(\vec{v}\cdot\vec{v})}\cdot\vec{v}$$

위 식에서 투영할 벡터 $\vec{v}$의 크기가 1이면 위 식은 다음과 같이 단순하게 정리된다.

$$\vec{v'} = (\vec{u} \cdot \vec{v}) \cdot \vec{v}$$


8장 삼각형 : 물체를 구성하는 가장 작은 단위

점으로 물체를 그린다면 점으로 이루어진 물체를 확대했을 때 점이 퍼지면서 물체의 밀도가 줄어들지만 삼각형으로 물체를 그린다면 삼각형 영역 안에 소속된 픽셀의 개수를 구하고 취한다면 정밀하게 물체를 보여줄 수 있는 체계를 만들 수 있다.

 

아핀 결합식에서 스칼라 값을 0 ~ 1 범위로 제한하면 시작과 끝의 범위가 명확해지므로 선분과 동일하게 그릴 수 있는 도형이 만들어진다. 이렇게 아핀 결합에서 모든 스칼라 값을 [0, 1] 범위로 한정한 결합을 Convex combination(컨벡스 결합)이라고 부른다.

$$\sum_{i=0}^{n}(c_{i}\cdot P_{i})(s.t.\sum_{i=0}^{n}c_{i} = 1, 0\leq c_{i}\leq 1)$$

 

functions - convex and concave regions - Mathematics Stack Exchange

선분이나 삼각형처럼 컨벡스 결합으로 만든 영역을 Convex region((컨벡스 영역))이라고 한다. /* convex : 볼록한, concave : 오목한 */ 수학에서 정의한 '볼록함'이란, 영역 내 임의의 두 점을 연결한 선분을 만들었을 대 그 선분은 언제나 해당 컨벡스 영역 안에 속하는 성질을 의미한다. 컨케이브 영역은 영역 내 임의의 두 점을 이은 선분이 영역 밖으로 벗어나는 경우가 발생한다. 

 

Convex combination - Wikipedia

Convex combination of fout points 범위를 [0, 1]로 제한한다면 내부의 두 점을 연결한 선분이 항상 해당 영역에 속하는 컨벡스 성질을 지닌 Tetrahedron((삼각뿔))이 형성됨 // coefficient 계수

Polygon mesh - Wikipedia

#메시

3차원 공간의 입체적인 물체 또한 삼각형을 이어붙이면 표현이 가능하다. 그래서 물체를 표현하기 위해 삼각형 데이터를 체계적으로 읽고 쓰는 방법이 필요한데, 삼각형을 중심으로 물체에 관련된 정보를 기록한 데이터를 Mesh((메시))라고 한다. 메시는 다수의 삼각형으로 구성되고, 메시를 이루는 삼각형은 다시 3개의 점으로 구성된다. 그렇다면 메시는 결국 다수의 점으로 구성된다고 정리할 수 있다.

 

메시는 삼각형을 이용해 물체의 외형을 표현하기 때문에 삼각형을 이루는 각 점의 위치를 가지고 있어야 한다. 물체를 표현하는 데 활용할 수 있는 색상이나 방향과 같은 다양한 부가 정보도 담아 함께 제공한다. 이렇게 위치 정보와 부가 정보를 묶은 특별한 점을 Vertex((정점))이라고 한다.

 

메시는 정점들이 모인 데이터라고 할 수 있는데, 컴퓨터에서 메시를 읽어 물체를 표현할 때에는 메시의 정점 정보를 빠르게 읽기 위해서 메모리 정점 정보를 일렬로 나열하는 배열의 형태로 관리한다. 이를 Vertex buffer((정점 버퍼))라고 한다. 그런데 정점 버퍼의 정보만으로는 어떤 세 정점이 모여 삼각형을 구성하는지 알 수 없다. 그래서 삼각형을 구성하는 정점의 인덱스만 기록한 배열을 별도로 만들어 관리한다. 이를 Index buffer((인덱스 버퍼))라고 한다. 

 Wire frame((와이어프레임)) : 삼각형의 외곽선만 그려 메시를 표현하는 방법

 

#무게중심좌표

Barycentric coordinate((무게중심좌표))는 아핀 결합의 스칼라를 묶어 만든 좌표다. 무게중심좌표는 삼각형에 관련된 정보를 담고 있기에, 삼각형에 관련된 기능을 구현할 때 유용하게 활용된다.

선형 종속의 관계를 이루는 세 점의 결합은 삼각형이 아닌 선분을 만들어내는데 이러한 삼각형을 Degenerate triangle((퇴화삼각형))이라 하며, 퇴화삼각형이 검출되면 그리기에서 제외한다.

 

세 개의 점과 계수의 관계를 통해 삼각형을 구성할 수 있고 계수의 관계를 통해 무게중심좌표가 어디에 치우친지 알 수 있다. 삼각형 안에 있는 픽셀의 무게중심좌표를 안다면 각 점에 담긴 정보를 통해 색이나 텍스처를 표현할 수 있

 

# 3. 물체의 수학 II : 정점과 삼각형 (youtube.com)

Rasterization((레스터라이제이션)) : 삼각형이 가지고 있는 영역을 픽셀로 변환하는 작업

삼각형을 칠하는 원리는 삼각형을 포함하는 픽셀의 영역을 구한 후, 각 픽셀을 순회하면서 무게중심좌표를 계산해서 해당 점이 도형의 내부 혹은 외부에 있는지를 파악하는 것이다.

무게중심좌표는 메시에 이미지를 입히는 용도로 활용할 수도 있다. 메시에 이미지를 입히기 위해 변환된 데이터를 Texture((텍스처))라고 하며, 메시에 이미지를 입히는 작업을 Texture mapping((텍스처 매핑))이라 한다. 

 

우리가 사진이나 그림을 저장한 이미지는 가로와 세로의 픽셀 수에 따른 고유한 해상도를 가진다. 하지만 이미지를 메시에 입히기 위해 텍스처로 변환하면 관리 방식을 통일하기 위해 이미지의 원본 해상도에 관계없이 텍스처의 가로, 세로 크기는 1로 정규화된다. 따라서 렌더링 과정에서 텍스처를 사용할 때에는 [0, 1] 범위로 구성된 2차원 좌표계를 사용한다. 텍스처를 구성하는 2차원 좌표계를 UV 좌표계라고 한다.  UV좌표계는 2차원 벡터로 구성되며 가로정보는 U, 세로정보는 V로 지정된다.

 

삼각형을 구성하는 각 픽셀의 무게중심좌표를 계산하고 이를 정점의 UV좌표와 선형보간하면 해당 픽셀의 UV값을 얻어낼 수 있다.

++ vertex가 가진 정보 : 위치 정보, 인덱스 정보, 색상 정보, 텍스처 좌표, 법선 벡터, 데이터 추가(사용자 지정 속성, 움직임 정보, 애니메이션 정보 등)

++Linear interpolation : 두 개의 값을 가지고 있는 두 점을 주어진 비율에 따라 그 사이의 값을 추정하는 데 사용됨

$y = y_{1} + (y_{2} - y_{1})\cdot t$ 

++렌더링 파이프라인에서 응용력을 높이게 위해 개발자가 원하는 기능을 넣기 위해 제공하는 함수 vertex shader-삼각형을 구성하는 각 정점의 최종 데이터를 결정하는 함수 , pixel shader-삼각형 내부를 구성하는 각 픽셀의 최종 색상을 결정하는 함

 

세 점의 아핀 결합에 대한 수식을 사용해 삼각형을 생성하고, 삼각형의 무게중심좌표를 통해 삼각형 내부를 표현함 무게중심좌표와 정점에 심은 부가 데이터를 활용하면 삼각형 내부에 다양한 효과를 줄 수 있다.

 


9장 게임 엔진: 콘텐츠를 만드는 기술

게임 콘텐츠는 가상 공간 위에 다양한 물체가 모여 배경을 만들고, 이를 플레이어가 탐험하는 형태로 구성된다. 이를 구현하기 위해서는 여러 종류의 물체를 담는 새로운 공간과 이들을 효과적으로 관리할 수 있는 체계를 구축해야 하며, 물체를 그리는 데 사용되는 메시, 텍스처 등의 데이터도 효과적으로 관리할 수 있는 시스템도 구축되어야 한다. 이러한 게임 콘텐츠 제작에 필요한 기본 체계와 데이터를 종합적으로 관리해주는 소프트웨어를 게임 엔진이라고 한다.

 

9.1 게임 엔진의 구성 요소

게임 엔진의 인터페이스는 게임 콘텐츠가 담기는 게임 공간을 설계하는 작업 공간과 게임 데이터를 관리하는 작업 공간으로 나뉜다. 게임 공간은 Scene((씬)) 혹은 Level((레벨))이라 부르며, 데이터는 Resource((리소스)) 혹은 Asset((에셋))이라 부른다.

9.1.1 씬의 구조

게임 엔진이 게임 공간을 생성해 개발자에게 제공하면, 개발자는 기획 의도에 맞게 다양한 종류의 물체를 게임 공간에 배치하는 작업을 진행한다. 게임 엔진은 개발자가 생성한 다양한 종류의 물체를 효과적으로 관리하기 위해 물체가 가져야 할 규격을 제시해주는데, 이를 일컬어 Game object 또는 Acto라고 부른다. 게임 오브젝트는 게임 엔진에서 콘텐츠를 구성하는 기본 단위로 관리된다. 게임 엔진은 게임 오브젝트의 묶음으로 씬을 관리한다.

 

씬을 구성하는 게임 오브젝트는 게임 공간에 항상 존재해야 하기 때문에 언제나 공간 내 배치 정보를 가져야 한다. 게임 엔진은 게임 오브젝트의 배치 정보를 위치, 회전, 크기로 구성된 Transform의 정보를 사용해 관리한다.

++순차 탐색 Sequential search

 

9.1.2 모델링 행렬의 설계

트랜스폼은 크기 S, 회전 R, 이동 T의 세 가지 데이터로 구성되며, 각각의 아핀 변환행렬을 적용하는 순서는 총 6가지가 있다((3!)). 행렬 곱은 교환 법칙이 성립하지 않기 때문에, 아핀 변환을 적용하는 순서를 결정하고 행렬 곱을 진행해야 하는데 먼저 이동 변환은 원하는 위치에 물체를 이동시켜야 하므로 가장 마지막에 진행된다. 그리고 회전 변환은 물체의 형태를 그대로 보존해주는 Rigid transform((강체 변환))이기 때문에 크기 변환 보다 나중에 진행되어야 한다. 따라서 Modeling matrix M은 다음과 같다.((columnmajormatrix 기준임))

$$ M = T \cdot R \cdot S \cdot = \begin{bmatrix}
cos\theta \cdot S_{x} & -sin\theta \cdot S_{y} & t_{x} \\
sin\theta \cdot S_{x} & cos\theta \cdot S_{y} & t_{y} \\
0 & 0 & 1 \\
\end{bmatrix}$$

 

9.1.3 로컬 공간과 로컬 축

하나의 물체를 표현하기 위해 만들어진 메시 데이터는 자신만의 공간에서 물체를 구성하는 각 정점의 위치 정보가 저장된다. 이렇게 물체의 정보를 담기 위해 부여한 공간을 Local space((로컬 공간))이라고 한다. 그런데 게임 콘텐츠는 단일 물체가 아닌 다양한 종류의 물체가 모여 배경을 이루므로, 여러 물체를 모아 담을 수 있는 별도의 공간이 있어야 한다. 여러 물체를 모아 게임 콘텐츠를 만드는 데 사용되는 새로운 공간을 World space((월드 공간))이라고 한다.

 

비행기 같은 물체의 방향을 조종한다고 하면 월드 공간을 중심으로 설정된 비행기의 위치 좌표가 필요하고 비행기의 방향을 조종하기 위한 월드 공간과 무과한 비행기가 바라보는 방향 정보도 필요하다. 이렇게 물체를 기준으로 설정된 방향 정보를 Local axis((로컬 축))이라고 한다. 로컬 축 정보는 로컬 공간의 기저벡터와 동일한 값을 가진다. 게임 엔진은 개발의 편의성을 위해 트랜스폼에서 로컬축 데이터도 함께 제공하며, 각 로컬 축은 월드의 X, Y, Z축과 구분하기 위해 별개의 이름으로 부른다.

로컬축 - 로컬 축의 이름

  • +X : Right Vector
  • +Y : Up Vector
  • +Z : Forword Vector

트랜스폼의 이동과 크기 정보가 변경되더라도 게임 오브젝트가 보는 방향은 변함이 없기 때문에, 로컬 축 정보는 오직 회전 정보에만 영향을 받는다. ++블렌더 같은 툴에서 회전시킬 때 원래 물체의 방향이 아니라면 월드 공간내에서 회전 해야겠네

로컬 축 정보는 트랜스폼에 회전이 발생할 때마다 갱신되며 최종 모델링 행렬은 로컬 축 정보를 사용해 계산됨

 

9.1.4 리소스 관리

리소스를 다루기 위해서는 게임 엔진에서 리소스가 활용되는 방식을 알아야 한다. 게임 오브젝트에 트랜스폼을 설정하는 작업은 모델링 행렬을 사용해 각 게임 오브젝트에 부여된 로컬 공간 정보를 월드 공간 정보로 변환하는 것이다. 씬에서 게임 오브젝트들은 각자 트랜스폼 정보를 포함하고 있었다. 동일한 방법으로 게임 오브젝트마다 리소스 정보를 포함한다고 생각해보자. 만일 다수의 게임 오브젝트가 동일한 메시를 사용한다면 게임 오브젝트마다 용량이 큰 메시 정보를 포함하게 되어 메모리 공간이 낭비될 것이다. 그렇기 때문에 리소스 데이터는 여러 게임 오브젝트들이 함께 사용할 수 있는 공유 자원의 형태로 관리하는 것이 바람직하다. 이를 위해 게임 엔진은 씬과 무관하게 리소스를 모아두는 저장소를 별도로 제공하는데 이를 Resource repository-리소스 저장소라고 부른다. 게임 엔진은 리소스 저장소를 효율적으로 관리하기 위해 리소스를 유형별로 나누고 리소스에 고유한 키를 부여한다. 그리고 게임 오브젝트에는 리소스 데이터를 가리키는 리소스 키 값만을 저장하도록 설계한다. 그렇다면 메모리 공간의 소비를 줄일 수 있을 것이다.

 

9.2 게임 엔진의 워크플로우 9.2.2 렌더링 파이프라인

게임 엔진은 씬과 리소스를 관리하는 기반을 제공하면서 게임 콘텐츠가 효율적으로 구동되기 위해 실행 과정에 대해서도 고도화된 표준 틀도 함께 제시하고 있다. 게임 엔진이 제공하는 실행의 흐름을 Workflow-워크플로우라고 하며, 게임 엔진의 워크플로우는 씬을 완성하는 과정과 완성된 씬으로부터 화면을 그려내는 과정 두 가지로 구성된다.

 

1.리소스 로딩 2.씬 구축 ~반복: 3.게임 로직 4.렌더링 로직~

 

게임 제작에서 렌더링은 그릴 물체의 정보를 하드웨어인 그래픽카드 GPU에 넘겨 GPU가 처리하도록 위임하는 것이 일반적이다. GPU에 그릴 물체의 정보를 전달하면 GPU는 하드웨어에 설정된 워크플로우를 통해 렌더링을 진행하고 그 결과를 화면에 띄운다. 이렇게 GPU 내부에 설정된 워크플로우를 Rendering pipeline-렌더링 파이프라인이라고 한다.

Graphics pipeline - Wikipedia

더보기

lagging 효과 : 카메라가 플레이어를 쫓아다닐 때 한 템포 느리게 따라감

tessellation : tiling 

Back Face Culling : cull : to select or choose -someone or something- from a group

hull shader : hull : to remove the outer covering of -a fruit or seed-

domain shader

 

1.정점 변환 단계 : 로컬 공간 기준으로 설정된 정점의 최종 위치를 월드 공간 중심으로 지정함

2.정점 처리 단계 : 모델링 행렬에 로컬 공간의 좌표를 곱함 >> 월드 공간 기준으로 좌표가 반환됨

3.픽셀화 단계 : 메시를 구성하는 삼각형마다 픽셀화를 진행함, 무게중심좌표를 활용해 각 삼각형 형역에 속하는 픽셀을 추려내고 색상을 결정

4.픽셀 처리 단계 : 삼각형을 구성하는 각 픽셀의 최종 색상을 구하는 과정, 텍스처로부터 해당 픽셀의 UV에 대응되는 색상을 가져온 후에 필요하다면 추가로 조명 효과 등을 적용해 최종 픽셀의 색상을 설정함

 

정점 변환 계

원본 메시 정보에 모델링 행렬을 곱해버리면 메시 정보를 공유하는 다른 게임 오브젝트에 영향을 미침 > 정점의 변환 과정에서 사용되는 메시 데이터는 원본 데이터를 복제해 사용함, 렌더링 파이프라인을 시작하는 함수가 호출되는 상황을 Drawcall이 발생된다고 표현함

 

정점 처리 단계

GPU는 렌더링 파이프라인을 구성하는 대부분의 과정을 고정시키고 이에 특화된 하드웨어 칩을 사용해 계산하지만, 몇몇 중요한 과정은 개발자들이 설계한 로직을 실행하도록 함수를 제공하는데, 이를 shader라고 부른다. GPU에서도 정점 처리 단계에서는 개발자들이 변환을 직접 설계하도록 함수를 제공하는데 이를 Vertex shader((정점 셰이더))라고 한다.

 

픽셀처리 단계

GPU에서는 삼각형을 구성하는 픽셀을 Fragment라고도 부르며, 개발자들이 직접 최종 픽셀의 색상의 계산할 수 있도록 별도의 함수를 제공하는데, 이를 Fragment shader((파편 셰이더)) 또는 Pixel shader((픽셀 셰이더))라고 일컫는다.

 

9.3 카메라 시스템

 

게임 엔진은 개발자 관점에서 바라보는 게임 공간과 게이머 관점에서 바라보는 게임 공간 두 가지 화면을 제공함. 게임을 플레이하는 게이머는 월드 공간에 개발자가 설치한 카메라를 통해 게임 콘텐츠를 본다.

 

 

카메라는 자신이 출력할 화면의 해상도 정보를 가지고 월드의 일부를 그려낸다. 카메라가 출력할 화면의 크기 정보를 Viewport라고 부른다. 카메라에 설정된 뷰포트 정보를 바탕으로 월드 공간의 일부분을 렌더링하기 위해서 카메라를 중심으로 물체의 트랜스폼을 재조정하는 작업이 필요한데, 카메라를 중심으로 변환한 공간을 View space라고 한다.

참고

 

 

 

 

 

'개인공부용1 > etc' 카테고리의 다른 글

NULL vs nullptr  (0) 2024.09.02
this 메모  (0) 2024.08.29
얄코의 TOO MUCH 친절한 깃&깃허브  (0) 2024.06.14