1학기 결산-게임엔진프로그래밍활용

1. 브레젠험 직선 알고리즘

컴퓨터에서 계산이 느린 실수 연산을 사용하지 않고 직선을 그리기 위해 만들이진 알고리즘입니다.
평면을 아래와 같이 8분 면으로 나누어 직선을 그립니다.





2. 엔진 기초 수학

여기서는 본격적으로 구현에 들어가기 전 기초 수학 지식을 쌓았습니다. 

수학에서의 체는 대수적 구조의 하나로 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산을 집합 안에서 소화할 수 있는 집합을 의미합니다. 체를 이루기 위한 조건과 체라는 개념을 알아보았습니다.
처음에 체 라는 개념이 뭔가 머릿속에서 애매했는데 이후 갈로이스 체에 대해 배운 후 조금 더 명확해졌습니다.

스칼라는 벡터를 정의하기 위한 필수 요소이고 크기만 있고 방향이 없는 성분이다.
벡터는 크기와 방향을 포함하는 표현 도구이다. 겨기서 벡터의 기본 연산자들을 알아보았습니다.

선형성은 직선처럼 똑바른 도형 또는 그와 비슷한 성질을 가진 대상이라는 뜻으로
함수의 경우 함수가 진행하는 모양이 직선이라는 의미로 사용된다.
선형성을 만족하려면 두 가지 조건을 만족해야 하는데 균질성과 첨가성이다.
homogeneity (균질성): 
additivity (첨가성):
선형이라고 부르는 수식들은 중첩의 원리가 적용된다는 특징이 있다.
이때 행렬과 선형 변환의 관계에 대하여도 알아보았었는데 선형 변환과 행렬은 1:1 대응된다.

기저란 어떤 벡터 공간을 선형 생성하는 선형 독립인 벡터들이다.
각각의 원소들이 다시 벡터 공간을 생성할 수 있어야하고 일차 독립이어야 한다.
표준 기저는 많은 기저들 중 성분 1개만이 1이고 나머지 성분이 모두 0인 표준 적인 벡터이다.
여기서 벡터 공간 R의 기저를 구성하는 원소의 개수가 해당 공간의 차원이다.

행렬은 열기반 행렬과 행기반 행렬 중 어떤 걸 사용하느냐에 따라 계산 방식이 달라진다.
여기서는 벡터의 크기, 회전, 밀기, 선형 변환에 대하여 알아보았습니다.
특히 정방 직교 행렬은 자기 자신을 제외한 모든 벡터들과 직교이면서 단위 벡터인 행렬을 의미하는데 이 행렬의 전치 행렬은 해당 행렬의 역행렬과 같기 때문에 알아두면 좋다.

아핀 공간은 점과 벡터를 같은 군으로 해석하여 벡터 공간을 한 차원 확장한 공간이다.
아핀 공간의 특징은 점은 항상 마지막 원소의 값이 1인 곳에 존재하고 0이라면 벡터이다.




3. 코헨 서더랜드 알고리즘

이 알고리즘은 라인 클리핑에 사용되는 컴퓨터 그래픽 알고리즘 입니다.
2차원 공간을 9개의 영역으로 분할한 후 볼 수 있는 선의 부분을 효율적으로 연산합니다.

아래와 같이 영역을 비트로 나누고 비트 연산을 이용하기 때문에 검사 방식이 효율적이고 빠릅니다.





4. 갈로이스 체와 아핀 조합, 컨벡스

갈로이스 체(GF2)는 0과 1로 구성된 가장 작은 유한체 입니다.
여기서 계산 결과가 체 안에서 순환을 돈다는 걸 알수 있었고
체라는 개념에 대해 조금 더 알게 되었습니다.

아핀 조합은  에서 상수 a의 값이 항상 1인 조건을 만족할 때
두점을 지나는 직선상의 모든 점들은 아핀 조합으로 표현이 가능합니다.

컨벡스란 일단 직역하면 볼록입니다.
컨벡스란 어떤 2개의 지점을 선으로 연결했을 때, 그 선을 이루는 요소들이 해당 집합안에 속해 있다면 그 집합을 Convex Set 이라고 합니다.
컨벡스 조합은 위의 아핀 조합에서 모든 계수들이 0 이상 1이하라는 조건이 추가로 붙습니다.

아핀 조합과 컨벡스 조합의 비교 그림

무개 중심 좌표 (Barycentric Coordinate)란 삼각형의 면적의 비율로 생각할 수 있습니다.
삼각형을 무게를 가지는 하나의 물체로 보았을 때 삼각형의 총 무게가 작용하는 작용점입니다.
개인적으로 이게 처음 봤을때는 가장 이해하기 힘들었던것 같습니다.
 




5. 무개 중심 좌표의 활용

무개 중심 좌표를 활용해 삼각형을 칠해 보았습니다.
삼각형의 세 점을 검사해 AABB 바운드 박스를 만들고 바운드 박스 내의 임의의 점 P 가
Convex Set에 포함되는지 확인하고 포함된다면 점을 그려 삼각형을 칠합니다.

이걸 이용해 무지개 삼각형도 그릴 수 있습니다. 
무개 중심 좌표는 비율이기도 하기 떄문에 각 정점에 해당하는 색상에 값들을 곱하여 무지개 삼각형을 그릴 수 있습니다.





6. 텍스처 매핑과 뷰 좌표계

텍스처를 사용할때는 UV 좌표계라는 것을 이용하며 이 좌표계는 (0,0) 부터 (1,1) 사이의 값으로 이루어집니다. 
이 좌표계 덕분에 우리는 픽셀 단위가 아닌 정규화된 단위로 폴리곤에 텍스처를 씌울수 있습니다.

(F1 머신 이미지 출처: https://unsplash.com/@chuttersnap)

어떤 게임이던 카메라는 필수 요소입니다. 그럼 카메라로 어떻게 원하는 위치에 원하는 장면을 보여줄 수 있을까?
이때 이용하는게 뷰 좌표계 뷰 행렬을 만들어 사용할 수 있습니다.




7. 카메라의 행렬

회전 행렬은 각각의 축에 대한 회전 행렬을 한번에 곱하여 만들어 두고 사용했습니다.
여기서는 TRS 행렬을 만들어 주었습니다.

보통 게임에서의 카메라는 주인공 캐릭터를 바라보거나 특정 대상을 바라봅니다.
이때 Look At 행렬이라는 것을 사용할 수 있습니다.




8. 백스페이스 컬링과 원근 투영

백스페이스 컬링은 그리기 단계에서 화면상 보이지 않는 불필요한 폴리곤을 잘라내 렌더링하는 기법중 하나입니다.

그리기 순서가 필요하고 이 그리기 순서에 따라 두 벡터가 나오는데 이 벡터값을 외적해
해당 벡터가 카메라 방향을 향한다면 그려주고 반대라면 컬링합니다.

원근 투영은 아레의 그림과 같은 절두체의 모양안의 영역을 렌더링합니다.
이때 NDC라는 좌표로 정규화를 하고 해당 화면의 해상도를 곱해 물체의 최종 위치를 구하고 그줍니다. 

구현 모습




9. 외적을 이용한 왼쪽 오른쪽 구분

벡터의 외적의 특징을 이용하면 타겟이 왼쪽에 있는지 오른쪽에 있는지 구분할 수 있습니다.





10. 오일러 각, 로드리게스 회전 공식, 평면의 방정식

오일러 각은 강체가 놓인 방향을 3차원 공간에 표시하기 위해 있는 세 개의 각도 입니다.
이 오일러 각에는 엄청난 단점이 존재합니다. 바로 짐벌락 입니다. 오일러 각 특징상 
세 축이 종속적인데 오일러 각을 이용해 강체를 회전하다 보면 
두 개의 축이 거의 일치하여 회전으로 2축으로 한정되는 현상이 일어납니다. 


또 다른 특징은 오일러 각은 두 축에 회전에 대하여 보간이 성립하지 않습니다.

로드리게스 회전 공식임의의 축에 대한 회전을 구현하기 위해 사용합니다.
처음 배울때 어디에 사용하는지 몰라서 어려웠습니다. 



평면의 방정식은 평면에 대한 방정식 입니다.
이 방정식에는 3가지 특징이 있는데
1) d의 값이 음수이면 면의 방향이 원점을 향함
2) d의 값이 양수이면 면의 방향이 원점에서 멀어짐
3) d의 값이 0이라면 면이 원점을 지난다.

위의 평면의 방정식을 이용해 카메라의 프러스텀을 이루는 6개의 면의 방정식을 구해
6개의 평면의 내부와 외부를 판단하여 프러스텀 컬링에 활용 할 수 있을 것 입니다.




11. 투영 보정 매핑

투영 보정 매핑은 앞에서 했던 원근 투영의 문제점을 확인하고 이를 보완하기 위해
사용합니다.
투영 보정 매핑은  값과 NDC 좌표계로 산출된 무게 중심값  을 이용해 보정합니다.
보정을 하기 전에는 왼쪽 그림 처럼 텍스처가 찌그러진 듯이 씌워지는데
보정 후에는 정확하게 씌워진 것을 볼 수있습니다.





이 글을 작성하면서 뒤돌아보니 복습도되고 좋았습니다.
생각보다 많은 이론들을 배운 것 같고 무엇보다 기초 지식의 중요성을 알았습니다.
기초 지식이 부족하더라도 어떻게 어떻게 구현하면 구현은 가능하겠지만
최적화나 자기가 원하는데로 바꾸어 사용하려면 기초 지식이 필수인것 같습니다.

댓글

이 블로그의 인기 게시물

[알고리즘] 코헨 서더랜드 알고리즘(Cohen–Sutherland algorithm)

[게임 수학] 외적을 이용한 왼쪽 오른쪽 구분

오일러 각, 로드리게스 회전 공식, 평면의 방정식