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

이미지
1. 브레젠험 직선 알고리즘 컴퓨터에서 계산이 느린 실수 연산을 사용하지 않고 직선을 그리기 위해 만들이진 알고리즘입니다. 평면을 아래와 같이 8분 면으로 나누어 직선을 그립니다. 링크:  https://sulinep.blogspot.com/2020/05/bresenhams-line-algorithm.html 2. 엔진 기초 수학 여기서는 본격적으로 구현에 들어가기 전 기초 수학 지식을 쌓았습니다.  수학에서의 체는 대수적 구조의 하나로 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산을 집합 안에서 소화할 수 있는 집합을 의미합니다. 체를 이루기 위한 조건과 체라는 개념을 알아보았습니다. 처음에 체 라는 개념이 뭔가 머릿속에서 애매했는데 이후 갈로이스 체에 대해 배운 후 조금 더 명확해졌습니다. 스칼라 는 벡터를 정의하기 위한 필수 요소이고 크기만 있고 방향이 없는 성분이다. 벡터는 크기와 방향을 포함하는 표현 도구이다. 겨기서 벡터의 기본 연산자들을 알아보았습니다. 선형성 은 직선처럼 똑바른 도형 또는 그와 비슷한 성질을 가진 대상이라는 뜻으로 함수의 경우 함수가 진행하는 모양이 직선이라는 의미로 사용된다. 선형성을 만족하려면 두 가지 조건을 만족해야 하는데 균질성과 첨가성이다. homogeneity (균질성):   additivity (첨가성): 선형이라고 부르는 수식들은 중첩의 원리 가 적용된다는 특징이 있다. 이때 행렬과 선형 변환의 관계에 대하여도 알아보았었는데 선형 변환과 행렬은 1:1 대응된다. 기저 란 어떤 벡터 공간을 선형 생성하는 선형 독립인 벡터들이다. 각각의 원소들이 다시 벡터 공간을 생성할 수 있어야하고 일차 독립이어야 한다. 표준 기저 는 많은 기저들 중 성분 1개만이 1이고 나머지 성분이 모두 0인 표준 적인 벡터이다. 여기서 벡터 공간 R의 기저를 구성하는 원소의 개수가 해당 공간의 차원 이다. 행렬 은 열기반 행렬과 행기반 행렬 중 어떤 걸 사용하느냐에 따라 계산 방식이 달라진다. 여기서는 벡터의 크기, 회전, 밀기, 선형 변환에 대하여

[수학] 엔진 강의 수학 복습

이 글은 강의 시간에 배운 수학 이론에 대한 정리글 및 중간고사입니다.

1. 수학에서의 체(Field)

일단 나무위키에 있는 글을 일부분 가져와 보았다.
"체는 대수적 구조의 하나로, 간단히 말해 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산을 집합 안에서 소화할 수 있는 집합을 의미한다."


예를 들면 오른쪽 그림과 같은 실수들의 집합이 있다고 보면
(정수는 체가 되지 않기 때문에 실수라고 보겠습니다.)
해당 체 안에서의 
덧셈 뺄셈 곱셈 나눗셈등 사칙연산을 집합안의 수들로 할수 있다.



체를 이루기위한 조건은 다음과 같다.
1. 사칙연산이 가능해야한다.
2. 덧셈에 대한 교환법칙, 결합법칙이 성립하고 항등원 0이 존재한다.
3. 모든 원소에 대해 역원이 존제한다.
4. 곱셈에 대한 교환법칙, 결합법칙이 성립하고 항등원 1이 존재한다.
5. 덧셈과 곱셈에 대한 분배법칙이 성립한다.
6. 0이 아닌 모든 원소에 대해 역원이 존제한다. 따라서 0 이외의 수로는 항상 나누기를 할 수있다. 즉 체에서는 나머지가 존재해서는 안 된다.

(추가로 정수가 체가 될 수 없는 이유는 6번의 이유 때문이다.)

(추가...)
체라는 개념이 생각보다 이해가 안가고 어려웠다.
저번 시간에 갈로이스 체라는 것을 새로 배웠는데 원래 여기에 추가로 쓰려했으나.
해당 체에 관한 과제가 나와서 다른 포스트에 쓸 예정이다.

신기했던건 저번 시간의 강의를 듣기 전까지 체는 집합안의 수들이 무조건 무한할줄 알았는데 유한체도 있다는 것이었다.


2. 스칼라와 벡터

1) 스칼라
스칼라는 벡터를 정의하기위한 필수 요소이다.
스칼라는 크기만 있고 방향이 없는 성분이다.

2) 벡터
크기와 방향을 포함하는 표현 도구이다.

일단 벡터가 존재하려면 벡터 공간이 필요하다.
수학에서 벡터의 정의는 벡터 공간을 정의하고 벡터공간안의 무수히 많은 원소들을
벡터라고 한다.

3) 벡터의 기본 연산자
(1) 벡터의 합
벡터의 합은  같이 각 원소의 덧셈이다.
합을 기하학적으로 살펴 보면 다음과 같다



(2) 벡터의 차
벡터의 차는  같이 각 원소의 뺄셈이다.



(3) 스칼라 배
벡터와 스칼라의 곱은 벡터의 각 원소에 스칼라값을 곱해주기만 하면 된다.

스칼라값이 1이면 벡터는 그대로 이고 1보다 작으면 작아지고 1보다 크면 커진다.



(4) 스칼라 곱
다른 말로 내적이라고 불린다. 벡터의 각 원소끼리 곱하며 결과 값은 스칼라 값이다.



3. 선형성

선형성은 직선처럼 똑바른 도형 또는 그와 비슷한 성질을 가진 대상이라는 뜻으로
함수의 경우 함수가 진행하는 모양이 직선이라는 의미로 사용된다.
보통 수식이 어떠한 형태를 가지고 있으면, 선형이라고 하고 아니면 비선형이라고 하는데
선형이라고 부르는 수식들의 특징은 중첩의 원리가 적용된다.

1)선형 의존과 선형 독립
같은 수의 성분을 가진 n개의 벡터 에 대하여

을 만족하는 0이 아닌 스칼라  이 존재하면 선형 의존이다.
반대로 모두 0이면 선형 독립이다.

간단한 예시를 생각해보면
 과  두 벡터가 있다고 생각해보자
 으로 수식에 넣으면 해당 두 벡터가 이 되는 조건은
 모두가 0이 되어야 한다. 그러므로  의 두 벡터는 선형 독립이다.

반대의 예시도 생각해보자
 과  두 벡터가 있다고 생각해보자

위의 식을 풀었을때 두 벡터가 이 되는 조건은
 모두가 0이 되거나  등 여러가지 스칼라 값이 존재한다.
그러므로 위의 두벡터는 선형 의존이다.

2)행렬과 선형 변환
결론 부터 이야기하면 선형 변환은 행렬이다.
아래의 일반화된 선형성의 가지는 벡터 함수가 있다고 보자

위의 함수는 행렬과 벡터의 곱셈으로 표현 할수 있다.

즉, 행렬과 선형 변환은 1:1 대응된다.

3) 추가

는 선형이고 은 선형이 아니다 이유는?

선형 함수는 다음 두가지 조건을 만족해야 한다.

homogeneity (균질성): 
additivity (첨가성):

하지만  는 위의 조건을 만족하지 못한다.

4. 기저와 차원

기저란 어떤 벡터 공간을 선형 생성 하는 선형 독립인 벡터들이다.
각각의 원소들이 다시 벡터공간을 생성할 수 있어야하고 일차 독립이어야 한다.
즉 기저란 벡터 공간을 생성하는 기본 뼈대이다.

벡터 공간 R의 임의의 원소인 각 벡터 에 대하여

의 해가 1개의 조만 존재 한다면 벡터 A들의 집합을 벡터 공간 R의 기저라고 한다.

차원은 벡터 공간 라고 할때, a와 b는 모든 실수의 범위이기 때문에
기저는 셀수 없이 많다. 여기서  등을 기저라고 한다면 벡터 공간 R의 차원은 2차원이다.
즉, 벡터공간 R의 기저를 구성하는 원소의 개수가 해당 공간의 차원이다.

표준 기저는 많은 기저들 중 성분 1개만이 1이고 나머지 성분이 모두 0인 표준 적인 벡터
2차원인 벡터 공간 R이 있다면 표준 기저는  이다.


5. 행렬

1) 열기반 행렬과 행기반 행렬
열기반 행렬과 행기반 행렬 중 어떤 걸 사용하느냐에 따라 계산 방식이 틀리진다.

열기반 행렬 (Column)


대표 사용: OpenGL, Unity

행기반 행렬 (Row)


대표 사용: DirectX, Unreal Engine

열기반 행렬의 곱에서는 곱의 적용 순서가 반대인데
행렬은 기본적으로 교환법칙이 성립되지 않기 때문에 적용 순서가 반대이다.

2) 크기, 회전, 밀기 행렬, 선형 변환의 시각적 표현

(1) 벡터 공간의 선형 변환
위에서 선형성에 대해 이야기할때 백터의 선형 변환은 행렬이라고 했다.
벡터 공간에서 다른 벡터 공간으로 가는 선형 연산자는 행렬과 일대일 대응이다.
임의의 벡터 에서 (a,c) (b,d) 두 기저 벡터로 벡터 공간을 변화시키면 시각적으로 다음과 같이 나타난다.





(2) 크기
크기를 변화 시켜주는 행렬은 다음과 같이 표현할 수 있다.



만약 (1,1)인 벡터를 a = 0.5, b = 1.5 만큼 변화 시킨다고 생각해보자
그럼 다음과 같이 변화할것이다.





(3) 회전
반지름이 1인 원에서 특정 각도의 호의 좌표를 얻고 싶다면 다음과 같이 볼 수 있다.



위의 방식만 이해하고 있다면 회전 행렬을 구하는 것은 간단하다.



(4) 밀기
밀기 행렬은 다음과 같이 나타낼수 있습니다.

a는 X축으로 밀려는 값을 넣고 b에는 Y축으로 미는 값을 넣습니다.

X축 방향으로 1만큼 밀어보겠습니다.





3) 행렬의 이점
행렬의 성질에 의해 순차적인 연산을 미리 행렬의 곱으로 바꾸어서 하나의 행렬로 처리할 수 있다.
예를 들면 게임에서는 이동(T), 크기 변환(S), 회전(R)을 행렬 등 사용할 일이 많다.
행렬이 없다면 모든 좌표에 대해 일일이 하나씩 계산을 해주어야 할 것이다.
하지만 이동(T), 크기 변환(S), 회전(R) 행렬을 미리 곱해줌으로써 연산 횟수를 줄일 수 있다는 이점이 있다.

4) 행렬식, 시각적 의미
행렬식은 연립 방정식이 유일한 해를 갖는지 결정한다.
행렬식이 0이라면 행렬의 역행렬은 존재하지 않는다.
행렬식이 음수라면 방향이 바뀜을 의미한다.

2X2 행렬의 행렬식의 절대값은 선형 변환 후 두 기저 벡터가 이루고 있는 평행 사변형의 넓이이다.

 에 대해 행렬식은  로 정의 된다.







평행사변형 ABDF 의 넓이는 삼각형 FBD의 두 배이다.
그럼 평행 사변형 ABDF의 넓이 = 2 X (사각형 EGCD - 삼각형 EFD - 삼각형 BCD - 삼각형 GBF)가 될것이다.

이를 식으로 표현하면
 으로 구할수 있을 것이다.
이 수식을 간략화 하면  가 된다.
즉 행렬식은 두 기저벡터가 이루고 있는 평행사변형의 넓이이다.


5) 정방 직교 행렬
일단 직교 벡터는 벡터 사이의 각도가 90도, 즉 직각을 이루는 벡터를 말한다.
정방 직교 행렬은 행렬의 벡터들이 자기 자신을 제외한 모든 벡터들과 직교이면서 단위 벡터인 행렬을 의미한다. (즉 변하지 않음)
정방 직교 행렬은 행과 열의 구성원의 크기가 1이고 서로 직교하는 행렬이다.
정방 직교 행렬은 다음과 같은 성질을 가진다.



위와 같은 조건을 만족하는 행렬 Q의 전치 행렬은 역행렬과 같아지고
이렇게 되면 직교 행렬이라고 부를 수 있다.


대표적으로 정방 직교 행렬은 단위 행렬이 있다.



6) 밀기 변환과 이동 변환
밀기 변환은 모양을 찌그러뜨리거나 여러가지 효과를 만들수 있습니다.
하지만 이동 변환은 모양 그대로 이동만 시켜줍니다. 즉 평행 이동 합니다.


6. 아핀 공간

아핀 공간은 점과 벡터를 같은 군으로 해석하여 벡터공간을 확장한 공간이다.
아핀 공간에서의 점 간의 이동을 벡터가 수행한다.
두점 사이의 변위는 한 점에 다른 점을 빼주면된다. 그럼 벡터 값이 나오는데 이 값이 두점 사이의 변위이다.

아핀 공간은 특이하게 점과 벡터를 구분하기 위해 차원의 수 + 1의 원소로 이루어진 벡터로 표현을 한다.
예를 들어 3차원 공간에서  과  인 두가지 좌표가 있다고 치자
일단 그럼 한 벡터가 4개의 원소로 표현이 되는데
마지막 값으로 점인지 벡터인지 구분한다. 이것을 동차좌표라고 한다.

아핀 공간의 점은 항상 마지막 원소의 값이 1인 곳에 존재하고 0인경우 벡터이다.
아핀 공간에서의 벡터는 점을 변위 시켜주기 위해 사용된다.

여기에서 특수한 조건이 하나 붙는다. 점에 이동 벡터를 더한 결과는 항상 1을 벗어나면 안된다.

점 + 벡터 = 점
점 - 점 = 벡터
벡터 + 벡터 = 벡터

와 같을 것이다.

그럼 점과 점의 덧셈을 어떨까?

기본적으로는 점과 점을 더하면 마지막 값이 2이 되기 때문에 불가능하다.
하지만 특수한 조건이 있다면 가능하다.
아핀 공간에서  해당 두 점이 있다고 보자 이때
두 점에 특정 스칼라값을 곱해 벡터의 마지막 원소가 1이 된다면 더할수 있다.
즉, 에서  을 만족하면 더할수 있다.
해당 조건을 만족하는 아핀 합이라는 연산이있다.

임의의 점 Q, 벡터v, 양의 스칼라 a에 대하여



Q에서 v방향의 모든 점들을 나타낸다. 이를 만족하는 점 R에대하여 다음과 같은 식을 낼수 있다.



 라는 결과를 도출 할 수 있다.
이 연산은 두 점의 합처럼 보이고  같은 식을 유도한다.




배우기 전에는 몰랐는데 지금까지 배운 것들의 내용은 서로 땔수 없는 관계인거 같다.
모든걸 담지 못한건 아쉽지만 여기 내용들중 한가지 제목만 집고 파도 이 글의 양은 가뿐히 넘을 것이다.
아는 만큼 보인다는데 배우고 나니 뭔가 새로운 것들이 보이는 것 같다.

댓글

이 블로그의 인기 게시물

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

[알고리즘] 브레젠험 직선 알고리즘 (Bresenham's line algorithm)

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