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

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

카메라의 행렬

1. 회전 행렬

각각의 축에대한 회전 행렬입니다.






이 행렬들은 2차원 회전 행렬에 사용되는 것을 그데로 응용하여 만들 수 있습니다.
좌표가 변화가 되는 것은 한 축이 회전할 때 2개의 좌표만 변화되기 때문에
x축을 기준으로 회전 한다고 보면
x의 값은 변하지 않으니 그데로 두고 나머지 축에 대해서만 연산을 진행합니다.

이 행렬들을 하번에 곱해서 오일러 회전 행렬을 구하는 공식을 유도해보았습니다.

(여기서 sp cy등의 의미는 접두: s = sin, c = cos, 접미: y = yaw,  p = pitch,  r = roll)






















결과 값을 이용해 행렬을 만들고 최종적으로 TRS 행렬을 만들어주면 됩니다.


2. LookAt 행렬

보통 게임에서의 카메라는 주인공 캐릭터를 바라보거나 특정 대상을 바라봅니다.
이번에는 해당 지점을 바라보는 LookAt 행렬을 만들어보겠습니다.

(해당 프로젝트에서는 오른손 좌표계를 사용하며 Z+는 화면 앞쪽을 향합니다.)

여기서 Forward 는 Roll (Z), Right는 Pitch(X), Up은 Yaw(Y) 라고 보겠습니다.

1) 카메라의 위치에서 바라보려는 물체의 위치를 빼서 Forward 백터를 구합니다.













2) World의 Y 좌표와 외적해 Right 벡터를 구합니다.











3) Up 벡터를 구하기 위해 위에서 구했던 Foward 벡터와 Right 벡터를 외적합니다.











4) 마지막으로 위의 3개의 벡터 축을 하나의 행렬로 만들어 역행렬로 만들어주면 끝입니다.
하지만 직교 행렬에서 역행력은 전치 행렬과 같기 때문에 계산이 적은 전치를 이용합니다.









3. 위의 LookAt 행렬에서의 문제점

만약 카메라가 (0, 500, 0)의 위치에서 (0, 0, 0)을 바라보면 어떻게 될까
일단 LookAt 행렬을 구하는 방법을 다시 확인해보면 World의 Y축을 가져와 Right 벡터를 구합니다. 
하지만 좌표가 위와 같은 경우라면 외적한 값이 (0, 0, 0) 이 나와버려 이상한 결과가 나와버릴겁니다.
가장 간단한 해결 방법은 외적한 값이 (0, 0, 0)이 나왔을 때는 World의 Y 축이 아닌 다른 축을 기준으로 구하면 될것입니다. 



댓글

이 블로그의 인기 게시물

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

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

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