라벨이 알고리즘인 게시물 표시

게임엔진프로그래밍 - 수학

이미지
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. 뷰 좌표계 게임을 만들려면 중요한것 중에 하나가 카메라입니다. 카메라가 없다면 플레이어는 원하는 장면을 보지 못할 것 입니다. 그럼 카메라로 어떻게 원하는 장면을 보여줄수 있을까 아래 그림과 같이 이루어진 어떤 공간이 하나 있다고 보겠습니다. 현재 위의 그림을 보면 월드 공간에 각각 로컬 공간(모델 스페이스)를 가진 게임 오...

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

이미지
이번 글은 코헨 서더랜드 알고리즘에 관한 글입니다. 1. 코헨 서더랜드 알고리즘 이 알고리즘은 라인 클리핑에서 사용되는 컴퓨터 그래픽 알고리즘 입니다. 2차원 공간은 아래의 그림처럼 9개의 영역으로 분할 한 다음 볼 수 있는 선의 부분을 효율적으로 연산합니다. 상 = 1000 하 = 0100 좌 = 0001 우 = 0010 이 알고리즘이 선을 클리핑 하는 방식은 다음과 같습니다. 1. 선을 그리는 두 개의 점을 입력 받고 각 점이 위치한 영역을 체크합니다. 2. 위의 체크한 결과에서 두 점이 모두 0000 이 나오면 선은 모두 화면 안에 있으므로 바로 선을 그립니다. 3. 두 점의 검사 결과를 비트연산 &(and)를 통해 0000 이 나오지 않는 다면 해당 선은 화면 바깥에 있으므로 선을 그리지 않습니다. 4. 나머지 경우는 두 점중 하나만 화면안에 있는 경우로 클리핑 작업이 필요합니다. 직선의 기울기 방정식을 이용해 각 점을 계산한 후 최종 선을 그립니다. 예시 그림으로 한번 살펴 봅시다. (모두 스크린 좌표, 스크린 사이즈는 가로 800 세로 400) 위 그림의 붉은 색 선을 그린다고 가정하고 위의 알고리즘 순서에 따라 가보겠습니다. 1. 각 점이 위치한 영역을 체크합니다. 일단 P1은 스크린 좌표 안에 있으므로 0000이라는 결과 값이 나옵니다. 그리고 P2의 좌표는 (1000, 100) 이므로 그려줄 스크린 최대 넓이를 벗어납니다. 위의 그림을 봤을 때 결과값은 0100 이 나옵니다. 2. 1번에서 체크 했던 결과 두 점 모두가 0000이 아니므로 넘어갑니다. 3. 두 점의 영역 결과를 &(and) 연산 해줍니다.       결과는 0000 이 나와 다음 과정으로 넘어갑니다. 4. 위에서의 기타 과정이 끝나고 라인 클리핑이 필요하다는 것이 결정되었습니다. 이제 실제로 라인 클리핑이 이루어져야합니다....

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

이미지
이번에는 과제로 나온 브레젠험 직선 알고리즘에 대한 글입니다. 1. 브레젠험 직선 알고리즘이란? 컴퓨터에서 계산이 느린 실수 연산을 사용하지 않고 직선을 그리기 위해 브레젠험(Bresenham's) 이라는 분이 만든 알고리즘입니다. 2. 기본 원리 일단 선을 만들려면 두 점이 필요합니다.   의 좌표로 이루어진 두 점이 있다고 보면 점에 대한 직선의 방정식은       으로 정의할 수 있습니다.  좀더 단순하게 바꾸면      으로도 정의할 수 있습니다. 위와 같이 무언가 수식을 정리하긴 했습니다. 이제 저걸 어떻게 사용하는지가 핵심이라고 봅니다. 기본적으로 스크린 좌표는 정수형입니다. 브레젠험 알고리즘은 평면을 아래와 같이 8분 면으로 나누어 그립니다. 저렇게 나누어진 분면 위에서 점이 한 칸 더 가서 그려지냐 아니면 그대로 그려지냐 판별하는 것이 핵심입니다. 3. 1분면에 대해 선 그리기 브레젠험 알고리즘은 기울기가 0과 1사이일 때를 가정해 정리가 됩니다. 1분 면에서 아래와 p1과 p2를 이어주는 선을 그린다고 가정을 해봅시다. 사각형 하나는 1픽셀입니다. 그림을 보면 그리려 하는 선이 초록색으로 강조해놓은 팩셀 모두를 지나갑니다. 이때 위의 픽셀과 아래의 픽셀 중 하나를 선택해 그려줘야 합니다. 여기서 기울기는 항상 0과 1사이라서 x 값은 항상 1씩 증가합니다. y 축은 L1 보다 L2의 값이  작으면 y값을 1 증가시켜줍니다. 위의 사이 값을 아래의 좌표와 같다고 생각해봅시다. 위의 좌표 값을 대입한 값이 해당 지점의 값   을 대입했을 때의 실제 Y값 보다 작으면 해당점은 픽셀위치의 변동 없이 그려주고 반대의 경우에는 한칸 아래에 그려줍니다. 해당 지점의 값을 직선의 방정식에 대입해보겠습니다. 그리고 y의 값은   에서 0.5 증가했으니 아래와 같은 판별...