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

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

텍스처 매핑과 뷰 좌표계

1. 텍스처 매핑

1) UV 좌표계
UV 좌표계란 텍스처의 좌표계이다.
이 좌표계는 이미지를 3D 폴리곤에 입히기위해 사용된다.
UV 좌표계는 (0,0) 부터 (1,1) 사이의 값으로 이루어져있다.

참고로 OpenGL과 DirectX를 보면 서로 다른 좌표계를 사용하고 있기도 하니
알아두면 좋을 것 같다.












이 좌표계 덕분에 우리는 픽셀 단위가 아닌 정규화된 단위로 폴리곤에 텍스처를 씌울수 잇다.
좌표계를 보면 0 ~ 1 까지라고 했었다. 그럼 만약 이값을 넘어가거나 더 작아지면 어떻게 될까

기본적으로는 해당 이미지가 반복되거나 마지막 픽셀의 색으로 쭉 그려진다.
아래 이미지들은 유니티에서 여러가지 UV 값을 조정해본 이미지이다.
유니티는 OpenGL과 같은 방식의 UV 좌표계를 사용한다.



















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

이처럼 UV 좌표만으로 다양한 형식으로 텍스처를 그릴수 있다.

2) 매핑

마인크래프트 스티브 스킨의 얼굴 부분에 대한 UV 좌표


















마인크래프트 스킨의 텍스처 크기는 64px X 64px 이다.
여기서 얼굴 부분만 매핑하려고 한다.

일단 어떻게 해당 UV 좌표를 구할 수 있을까
이건 간단하다 (1/64px) * (해당 지점의 픽셀 좌표)를 하면 된다.

그럼 UV 좌표는 아래 그림과 같이 나올것이다.








하지만 Y의 값들이 생각한 것과 조금 틀리다 왜 그런걸까
이건 사용하는 UV 좌표계에 따라 틀려진다. 
교수님이 제공해주신 프로그램이 OpenGL의 좌표와 같아 해당과 같이 나왔다.

만약 DirectX였다면 생각하던 결과가 나왔을 것이다.

매핑한 결과

















2. 뷰 좌표계

게임을 만들려면 중요한것 중에 하나가 카메라입니다.
카메라가 없다면 플레이어는 원하는 장면을 보지 못할 것 입니다.

그럼 카메라로 어떻게 원하는 장면을 보여줄수 있을까
아래 그림과 같이 이루어진 어떤 공간이 하나 있다고 보겠습니다.






















현재 위의 그림을 보면
월드 공간에 각각 로컬 공간(모델 스페이스)를 가진 게임 오브젝트들이 있고
카메라의 위치가 있고 그 영역이 있다.

여기서 어떻게 카메라 기준으로 다른 오브젝트들의 트렌스폼을 변경할까?
이걸 구하는 건 생각보다 간단하다.
해당 모델의 월드 좌표에서 카메라의 월드 좌표를 빼주기만 하면 된다.

그럼 초록색 오브젝트의 카메라 공간에서의 좌표는 (5, 7)이 될 것이다.
노란색은 (-30, 22), 파란색은 (-45, -8)이 될 것이다.

이게 무엇을 의미할까? 
이건 바로 카메라의 이동 행렬의 역행렬을 구하고 이를 해당 오브젝트의 월드 포지션에 곱해주기만 하면된다. 


회전 또한 동일하게 해주면 된다.
카메라의 회전 행렬이 R 이동 행렬이 T 라고 한다면 각각의 역행렬을 곱한
 같은 카메라 좌표계 즉 뷰 행렬(View Matrix)를 만들 수 있을 것이다.

1학년때 나는 이 카메라 개념이 제일 이해가 안되었다. 하지만 지금 보니 생각보다 간단(?)하고 중요한 개념인거 같다.


3. 내적
두 벡터 a와 b를 내적하면 다음과 같은 공식으로 나타낼수 있습니다.


그럼 이 내적이 어디에 사용되면 좋을까요?

1) 두 벡터의 사이각을 구할때




2) 게임에서 플레이어가 적 시야 인에 들어와 있는지 판단할때
















플레이어의 전방 벡터와 적을 향하는 방향 벡터를 내적해주고
각도의 반을 코사인해주고 비교해주면 된다.
굳이 왜 각도로 바꿔 비교를 안하고 위의 값들로 비교해줄까?
각도로 해도 상관 없지만 각도를 직접 구하는 것 보다
내적의 값으로 비교해주는 것이 연산량이 훨씬 작기 때문에 좋을 것 같다.

3) 조명 쉐이더에서 사용
아웃라인이나 기타 라이트에서 많이 사용할 수 있다.
이것도 위와 같은 경우이다. 각도를 구해서 사용할 수도 있지만
내적의 값으로 비교해주는 것이 연산량이 훨씬 작기 때문에 사용한다.

그외에도 각도로 할 수 있는 다른 것도 많을 것 같다.



댓글

이 블로그의 인기 게시물

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

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

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