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

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

[수학]무게중심좌표를 이용해 무지개 삼각형 칠하기

이전에 아핀 조합(Affine combination)과 볼록 조합(Convex combination)에 대해 알아보았습니다.
이번에는 볼록 조합을 이용해 삼각형을 어떻게 칠하는지 알아볼려고 합니다.

1. 삼각형 칠하기
간단 원리 
1. 삼각형의 세 점을 검사해 AABB 바운드 박스를 만듭니다.
   즉, 삼각형의 최소 최대 영역을 결정합니다.

2. 바운드 박스 내의 임의의 점 P 가 Convex Set에 포함되는지 확인하고 
   포함 된다면 점을 그리고 안된다면 점을 그리지 않습니다.

삼각형을 그리려면 일단 세 점이 필요합니다.
그러므로 세 점 A, B, C의 아핀 조합에 대해 식으로 나타내면 아래와 같을 것 입니다.


여기서 삼각형은 볼록이기 때문에 볼록 조합으로 나타내보면

 

아핀 조합과 같은 식과 아래와 같은 조건들이 붙게 될 것입니다.

 ,  ,  

다음과 같은 삼각형이 있습니다. (초록색 선은 백터입니다.)


 

위의 식을 벡터로 변환 하여 다시 표현한 식


이제 여기서 우리가 구해야할 값은 의 값 입니다.


 의 식에 각각 u와 v를 내적합니다.



s의 값을 구하기 위해 연립해서 식을 풀기위해 양변의 t 값을 동일하게 맞추기



t의 값을 소거한 후 s의 값을 구한 결과


위와 같은 방법으로 t 를 구한 결과 


그리고  의 값

이제 이 값들이 계산되었으니 
 ,  ,   의 조건이 모두 맞는다면 해당 지점에
점을 그려주면 될 것이다.

삼각형을 그려준 결과...

2. 무지개 삼각형
이제 이 삼각형을 각 점들에 색상 정보를 담아 무지개 삼각형으로 만들것이다.

각 점들에 색상 정보를 담기위해 기존의 x, y 위치 값만을 가지고 있는 Vector2와 다르게 
Vertex2 구조체를 하나 만들어 줍니다.

struct Vertex2
{
	Vertex2(const Vector2& InPosition, const LinearColor& InColor)
		: position(InPosition), color(InColor) {}

	Vector2 position;
	LinearColor color;
};

이제 이 Vertex2 구조체에 각 정점의 색상 정보를 담고
삼각형을 그려줄 때 색상만 보간 해주면 됩니다.

색상을 보간 하는 방법은 간단합니다.
 의 값들은 비율이기도 합니다.
그렇기 때문에 각 정점에 해당하는 색상에 값들을 곱하여 더하기만 해주면 끝입니다.

float s = ((wuDot * vvDot) - (wvDot * uvDot)) / ((uuDot * vvDot) - (uvDot * uvDot));
float t = ((wvDot * uuDot) - (wuDot * uvDot)) / ((uuDot * vvDot) - (uvDot * uvDot));
float oneMinusST = 1.f - s - t;
if (((s >= 0.f) && (s <= 1.f)) && ((t >= 0.f) && (t <= 1.f)) && ((oneMinusST >= 0.f) && (oneMinusST <= 1.f)))
{
	LinearColor pixelColor = triangleVertices[0].color * oneMinusST + triangleVertices[1].color * s + triangleVertices[2].color * t;
	_RSI->DrawPoint(fragment, pixelColor);
}


무지개 삼각형을 그린 결과



추가..
벡터 a, b의 내적은 와 동일하다.
s와 t를 구하는 과정에서 계산되는 공통분모 값이 0이 된다면
삼각형을 이루는 점 ABC가 있다면
BC가 같은 점에 있어 공통분모 값이 0이 된다.
즉 삼각형을 그릴 수 없는 상태일 것이다.

댓글

이 블로그의 인기 게시물

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

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

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