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

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

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

1. 오일러 각
오일러 각은 강체가 놓인 방향을 3차원 공간에 표시하기 위해 있는 세 개의 각도이다.

1) 짐벌락 (Gimbal lock)
이 현상이 발생하는 이유는 일단 오일러각은 특 징상 세축이 종속적이기 때문에 발생한다.
오일러 각을 이용해 강체를 회전하다 보면 두 개의 축이 거의 일치하여 회전이 2축으로 한정되는 사태를 이야기합니다.
이 현상은 자이로스코프라는 기기를 보면 현상을 쉽계 알 수 있습니다.













이 현상을 최소화 하려면 특정 축이 90가 되지 않거나
종속 구조를 바꾸는 방법이 있습니다.

그림으로 표현하기가 힘들어 유튜브에 좋은 영상이 있어 링크를 남깁니다.


2) 오일러각이 두 축에 회전에 대해서 보간이 성립하지 않는 이유

일단 이유는 오일러 각에서는 회전을 세 축으로 나누어 계산하기 때문이다.
특정 각들을 x -> y -> z 순으로 회전했다고 생각해보면
X 축을 먼저 회전 시킨 값에 Y 값을 회전 하고 마지막으로 Z 축 회전을 한다.

이걸 수학 공식으로 풀어보면 
일단 X, Y, Z 축 순서대로 각각 (60, 20, 0) 그리고 (10, 20, 0) 도씩 회전 시켰다고 보면

(행렬 계산을 간략화 표기 I = Identity)


 


이기 때문에 일방적으로 생각하는 (70, 40, 0) 도 회전 시켰다와는 다른 값이 나온다.

만약  와 같이 계산한다면 
(70, 40, 0) 도 회전과 똑같을 것입니다.




2. 로드리게스 회전 공식

임의의 축에 대한 회전을 구현하기 위해 사용한다.

먼저 여기서 벡터의 투영이 쓰이기 때문에 벡터의 투영 공식을 간단히 적어 놓았다




























일단 r의 벡터를 구하기하기 위해 P 의 점에서 O의 점을 뺀다.
그 다음 r 벡터에 OO' 벡터를 빼주면 O'P 벡터가 나올 것이다.

다음은 좀 보기 편하게 임의의 축과 평행인 상태에서 바라보면 다음과 같을 것이다.
















위에서 OO' 벡터를 구했고 이제 q와 h 벡터만 구하면 회전 이동하는 벡터를 구할 수 있을 것이다.

q 벡터는 벡터의 투영 공식으로 구할 수 있다.
일단 O'P 벡터를 정규화 하고 거기에 O'P' 벡터의 크기와 회전한 양  를 곱해주면 
q 벡터를 구할 수 있다. 
여기서 O'P 벡터의 크기와 O'P' 벡터 의 크기는 같기 때문에    의 결과로 보면 된다.
 
다음 으로 h 벡터를 구하기 위해서는 해당 벡터의 방향이 필요한데 다행이게도
n 벡터와 O'P 벡터를 외적하면 해당 방향과 같은 방향을 구할 수 있다.
(이때 외적하는 순서를 주의해야한다.)

 로 간단하게 수식을 간략화 하여 구할 수있다.

















마지막으로  OO' + q + h 벡터들을 모두 더해주면 될 것이다.
그럼 위의 마지막 결과와 같은 식이 완성된다.


로드리게스 회전 공식이 처음 들었을 때 이해가 잘 가지 않았던 게
이걸 어디에 사용하는 거지? 그리고 뭐가 우리가 알고 있다고 주어진 값들이지?
라는 걸 잘 몰라서 어려웠습니다. 하지만 다시 천천히 해보니 생각보다 금방 풀렸습니다.
물론 사용을 하지 않다 보면 잊어버릴 수도 있겠지만 나중에 다시 보면 금방 이해할 것 같습니다.



3. 평면의 방정식

평면을 구성하기 위해서는 어떠한 공간에 최소 점 3개가 있어야한다.













위의 공식은 간단하게 볼 수 있습니다.
어느 면의 임의의 점 P - P0 는 면의 방향 n 노멀 벡터와 내적하면 직교하기 때문에 
0의 값이 나오게 됩니다.

크기가 1인 벡터와의 내적은 투영한 벡터의 크기이다.
그리고 원점에서의 평면까지의 길이이기도 합니다.
즉 위의 d 값은 원점으로 부터의 거리에서 음수를 취한 값입니다.
이때 d 값의 특징이 있는데

1) d의 값이 음수인 경우: 면의 방향이 원점을 향함
2) d의 값이 양수인 경우: 면의 방향이 원점에서 멀어진다.
3) d의 값이 0이라면 면이 원점을 지난다.



4. 카메라의 프러스텀을 이루는 6개의 면의 방정식


















여기서 near 의 값이 10이고 far의 값이 100 이라고 가정하고 면의 방정식을 만들어 보겠습니다.

일단 near에 해당하는 면을 1번 면이라고 가정하고 보면 (0, 0, -10)으로 볼 수 있습니다.
프러스텀의 면들은 전부 바깥 쪽을 향하고 있어야 하기 때문에
노멀의 값이 (0, 0, 1)입니다. 그리고 d의 값이 필요한데 -d 값이므로 
평면의 방정식은 z + 10 = 0 이 될 것입니다.

그 다음 far에 해당하는 2번 면을 보면 노멀은 (0, 0, -1)이 될것이고 
-d의 값은 -100 이 될 겁니다. 즉 평면의 방정식은 -z-100 = 0 이 될 것입니다.

그리고 나머지 3번 4번 면과 위의 그림에서는 보이지 않는 5번 6번 면이 있습니다.
일단 나머지 면들은 모두 원점을 지나기 때문에 d의 값이 0입니다. 

이제 노멀의 값을 구해야 합니다. 일단 3번 면으로 구해 보겠습니다.

만약 해당 면의 임의의 점   이 있다고 하면
노멀 벡터는 90도 돌린거기 때문에  의 형태가 됩니다.
여기서  이기 때문에 
노멀 벡터는  이 될것 입니다.

즉 해당 평면의 방정식은  이 될것입니다.

나머지도 이런 식으로 계산하면 
4번 면의 방정식은 방향만 반대 이기 때문에 

5번과 6번은 단지 x, y 축을 이용하기 때문에 
5번 면의 방정식은 
마지막으로 6번 면의 방정식은  의 결과가 나올 것입니다.


마지막 4번은 정답인지는 모르겠지만 일단 이해한데로 풀어봤습니다.


댓글

  1. 그럼 y축으로 90도 회전을 로드리게스 회전 벡터로 어떻게 나타낼수 있을까요?

    답글삭제
    답글
    1. 감히 제 생각으로는 theta 가 90도라서 q벡터가 0이므로 oo`+h만 하면 r`을 찾을 수 있을거 같습니다.!

      삭제

댓글 쓰기

이 블로그의 인기 게시물

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

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