전체 글 (10) 썸네일형 리스트형 한 학기 동안 정리한 것들 1. 브레젠험 알고리즘 구현 브레젠험 알고리즘은 실수(float)연산을 사용하지 않고 직선을 그리기위해 사용하는 알고리즘 입니다. 아래 그림과 같이 8분면으로 나누어서 직선을 그립니다. https://filedownload.tistory.com/entry/%EB%B8%8C%EB%A0%88%EC%A0%A0%ED%97%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84 브레젠험 알고리즘 구현 브레젠험 알고리즘이란? 두 점 (x1, y1), (x2, y2)에 대한 직선의 방정식은 다음과 같습니다. 직선의 방정식으로 완벽한 선을 그리려면 float 자료형으로 표현해야 합니다. 하지만 모니터의 픽셀 좌표� filedownload.tistory.com 2. 엔진.. 투영 보정 매핑 이전에 원근투영에 대하여 설명했었습니다. 그 때 3D 큐브를 선으로 나타내어 보았지만 사실 그대로 사용하면 문제가 발생합니다. 문제는 텍스쳐를 매핑할 때 나타납니다. 텍스쳐를 매핑하면 살짝 화가난 것 처럼보이는 스티브를 볼 수 있습니다. 이렇게 나오는 이유는 위 사진에서 보이듯이 p의 무게 중심 좌표는 0.5입니다. 하지만 v의 무게 중심 좌표는 0.5가 아닙니다. 그래서 위의 스티브의 얼굴이 카메라의 각도에 따라 다르게 나타나는 것입니다. 따라서 p의 좌표를 기준으로 v의 무게 중심 좌표를 보간해야 올바른 결과가 나옵니다. 이를 투영 보정 매핑이라고 합니다. 해결 방법 현재 우리가 알고 있는 값은 NDC좌표계로 산출된 p의 무게 중심 값$$(1 - s - t, s, t)$$삼각형의 각 점의 NDC좌표와.. 오일러 각과 평면의 방정식 오일러 각 짐벌락 현상은 오일러 각을 사용할 떄 발생하는 문제 현상입니다. 위의 사진은 Y가 부모인 오일러 각을 그림으로 나타낸 것입니다. 계층 구조상 Y축이 회전하면 모든 축이 회전합니다. 반대로 Z축은 혼자서만 회전합니다. X축은 회전할 때 Z축에 영향을 줍니다. 만약 이상태에서 Z축을 회전시킨다고 했을 때 상황은 아래처럼 됩니다. X축을 회전시켰을 뿐인데 Z축이 X축의 자식이므로 Y축과 Z축이 겹치게 됩니다. 이 상태에서 화살표를 아래방향으로 하려고 할 때 돌릴 수 있는 축이 없어지기 때문에 문제가 발생합니다. 사라진 축을 점선으로 표시했습니다. 이렇게 3차원 공간에서 2개의 축이 겹칠 때를 짐벌락 상태라고 합니다. 짐벌락은 오일러 각을 사용하는 이상 어떻게 하던간에 발생합니다. 짐벌락을 최소화 할.. 백페이스 컬링과 원근 투영 벡터 외적의 활용 시작하기에 앞서 저번 게시글에서 했던 forward벡터와 up벡터가 주어질 때 물체가 왼쪽에 있는지 오른쪽에 있는지 판별하는 방법을 알아보겠습니다. 다음과 같이 플레이어의 정면방향 왼쪽, 오른쪽에 각각 타겟이 있다고 가정할 때, 수식으로 Target의 위치를 판별하려면 먼저 forward벡터와 target벡터를 외적합니다. A벡터는 forward벡터와 왼쪽 target벡터를 외적한 값이고 B는 아래쪽 target벡터와 외적한 값입니다. 오른손 법칙에 따라서 저렇게 그려집니다. 이렇게 나온 벡터 A와 B를 각각 Up벡터(0,1,0)와 내적할 때 벡터의 내적한 값이 방향이 같으면 양수 다르면 음수가 나오게 됨으로써 결과값이 양수가 나오면 물체는 왼쪽으로 판별되고 음수가 나오면 오른쪽으로 판.. 회전 행렬과 LookAt 행렬 회전 행렬 회전 행렬은 위의 3개의 행렬을 곱하여 오일러 각에 대한 회전 행렬을 구할 수 있습니다. 이렇게 구한 회전 행렬을 코드에 대입합니다. 결과 LookAt 행렬 게임에서의 카메라는 캐릭터를 바라보는 경우가 대부분입니다. x,y,z 값을 각각 right, up, forward라고 할 때 카메라에서 forward 즉 z값은 카메라의 위치에서 바라보는 타겟의 위치를 빼면 forward값을 구할 수 있습니다. 이 때 카메라의 뒷 방향이 z+방향이므로 타겟에서 카메라쪽으로 향하는게 맞습니다. 코드로 보면 아래처럼 됩니다. 카메라의 right값은 방금 구한 forward값과 외적하여 구할 수 있습니다. 아래 코드에서 UnitY는 월드에서의 y값입니다. up값은 forward값과 right값을 외적하여 구할 .. UV좌표와 뷰 좌표계 UV 좌표계 UV 좌표계는 3차원 공간에 폴리곤에 텍스쳐를 입히기 위한 기준이 되는 2차원 좌표계입니다. UV 좌표는 최소0 최대1의 좌표를 가지고 있습니다. UV 좌표는 0에서 1의 좌표를 가지고 있으며 1을 넘어가거나 0미만이 될 경우 다시 텍스쳐가 반복되어 나옵니다. 마인크래프트에서의 UV좌표 위 텍스쳐는 마인크래프트에서의 캐릭터 텍스쳐입니다. 텍스쳐의 얼굴부분만 프로젝트에서 출력해 보겠습니다. 마인크래프트 스킨텍스쳐의 사이즈는 64px * 64px입니다. 위 텍스쳐에서 얼굴 부분의 UV좌표는 다음과 같습니다. 결과 화면 Source Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3.. Galois Field와 아핀 조합 Galois Field란? Galois Field란 Field의 한 종류로 가장 작은 유한체입니다. 유한체란 집합 내 원소의 연산결과가 다시 그 집합 내에 있는 것을 뜻합니다. 덧셈 연산 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 덧셈 연산을 보면 1 + 1 = 0인 것을 볼 수 있습니다. 일반적으로 알고있는 수학에서는 1 + 1 = 2가 나와야하지만 GF(2)인 집합 안에는 0과 1밖에 없기 때문에 0이 나오는 것입니다. 이 때 0이 나오는 이유는 없는 수를 넣을 수 없으니 다시 처음으로 돌아가서 0을 넣는 것입니다. 여기서 덧셈에 대한 항등원은 0이 됩니다. 덧셈에 대한 역원은 체안에 음수가 없으니 자기 자신이 됩니다. 이에 따라 덧셈과 동일한 비트 연산은 XOR이 됩니다.. 코헨 서덜랜드 알고리즘 구현 코헨 서덜랜드 알고리즘이란? 코헨 서덜랜드 알고리즘은 클리핑 알고리즘입니다. 가운데 보이는 빨간 영역이 클리핑 영역(스크린)입니다. 각 칸에 적혀있는 숫자들은 각영역의 비트값을 나타냅니다. 각각 가운데를 기준으로 상하우좌 순서로 예를 들어 1001은 상 1 하 0 우 0 좌 1 로 왼쪽 위에 나타나게 됩니다. 예를 들어 다음과 같은 직선이 그려진다고 할 때 이 알고리즘이 클리핑하는 과정은 이러합니다. 1. 선을 이루는 두 개의 점의 위치를 체크합니다. 2. 두 개의 점의 위치가 0000으로 같으면 선을 그립니다. (위 그림에는 해당되지 않습니다.) 3. OR연산자( | )를 통하여 점의 시작점이 클리핑 영역 밖이라는 것과 좌측에 존재한다는 것을 알 수 있습니다. 4. 점의 위치를 찾았으니 직선의 방정식을.. 이전 1 2 다음