이러저런 이야기
-
정수만 사용해서 선 빠르게 그리기이러저런 이야기 2019. 12. 19. 10:46
https://playground10.tistory.com/62 [알고리즘] 브레젠험 알고리즘 선분그리기 알고리즘 중 대표적이고 정수계산이라 많이 쓰이는 브레젠헴, 브레젠험 알고리즘(Bresenham's algorithm) 오늘은 브레젠험 알고리즘의 원리와 구현방법을 포스팅하려합니다. 브레젠험 알고리즘의 사전.. playground10.tistory.com https://kukuta.tistory.com/186 브레즌햄(Bresenham) 알고리즘 브레즌햄 알고리즘은 컴퓨터 그래픽스에서 복잡하고 계산을 느리게 만드는 실수 계산을 배제하고 정수 계산만으로 직선을 그리기 위해 만들어진 알고리즘 입니다. 직선의 공식을 이용해 계산된 좌표값은 결국 스크.. kukuta.tistory.com https://m.b..
-
왼손 좌표계 오른손 좌표계이러저런 이야기 2019. 12. 19. 10:46
좌표계에는 크게 2d, 3d 좌표계가 있다. 2d 좌표계는 중학교 수학 때 배우는 x와 y의 좌표를 가지는 자표계, 3d 좌표계는 x, y에 z라는 축이 추가 되어 x, y, z의 좌표를 가지게 된다. 이 3d 좌표계를 게임에서 사용할 때 왼손 좌표계 또는 오른손 좌표계를 사용하여 계산한다. 왼손 좌표계와 오른손 좌표계의 차이는 +z의 방향의 차이가 있다. 위 사진에서 보는 것 처럼 왼손 좌표계의 +z의 방향은 앞이지만 오른손 좌표계의 +z의 방향은 뒤라고 할 수 있다. 좀 더 이해하기 쉽게 설명하자면 플레이어가 바라보는 방향이 +z이면 왼손, 플레이어가 바라보는 방향으로 들어오는게 +z이면 오른손 이라고 할 수 있다. DirectX는 왼손 좌표계를 사용하고 OpenGL은 오른손 좌표계를 사용한다. 이 ..
-
투영 행렬 유도하기이러저런 이야기 2019. 12. 19. 10:45
투영 변환이란 왼쪽 그림에서 보는 것 처럼 빨간색 영역은 카메라가 비출수있는 공간이다. z=near 가 근평면, z=far 가 원평면이라 하는데 카메라의 시야각에 따라 이 공간은 달라진다. 이 공간을 오른쪽에 보이는 그림과 같은 공간으로 변환 하는 것을 투영 변환이라 한다. 그림과 같이 모니터 화면을 가로, 세로의 크기가 2인 사각형으로 정규화시켜 작업하는데, 이렇게 정규화된 좌표계를 NDC(Normalized Device Coordinate)라고 한다. NDC는 변환되면 다음과 같이 가로, 세로의 크기가 2인 좌표 시스템을 가진다. 뷰스페이스의 점 P(x,y,z) 를 (-1,-1,0) ~ (1,1,1) 로 표현되는 공간상의 점 Q(X, Y, Z) 로 변환한다고 할 때 점P의 x가 점Q의 X로 변환되는 ..
-
점이 삼각형 내부에 있는지 외부에 있는지 판별이러저런 이야기 2019. 12. 19. 10:45
점 A, B, C로 구성된 삼각형이 있을 때 임의의 점 P가 삼각형 내부에 있는지 외부에 있는지의 판별은 벡터의 외적의 응용이라 할 수 있다. 먼저 기본 조건으로 점 A, B, C로 구성된 삼각형은 점 A, B, C의 순서가 반시계 방향으로 정렬이 되어있어야 한다. 정렬이 되어있다면, 저번 시간에 벡터 내적과 외적을 이용한 왼쪽 오른쪽 판별을 통해 임의의 점 P가 내부[왼쪽]에 있는지 외부[오른쪽]에 있는지 알 수 있다. 먼저 삼각형[평면]의 수직인 벡터인 법선 벡터를 구한다. 세 점을 알고 있기 때문에 법선 벡터는 평면의 방정식[삼각형의 선분 AB, BC, CA 중 두 벡터를 외적하면 평면의 수직인인 벡터 법선 벡터를 구할 수 있다.]을 통해 알 수있다. 그 다음 선분 AB, AP의 벡터를 외적한 뒤에..
-
백스페이스 컬링이러저런 이야기 2019. 12. 19. 10:45
백스페이스 컬링이란? 그래픽스 파이프라인의 한 단계의 속하며 "컬링" 단계에서 이뤄진다. 컬링은 최종 씬에서 보이지 않은 불필요한 폴리곤을 잘라내 랜더링 및 연산에서 제외시키는 작업이다. *클리핑이랑 컬링은 다르다. 클리핑은 시야에서 벗어난 물체[폴리곤]를 그리지 않거나, 시야에 걸친 폴리곤을 잘라내는 것을 말한다. 클리핑은 단순히 그리기에 대한 예외 처리라서 연산은 적용이 된다. [클리핑은 연산이 되지만, 컬링은 연산이 이뤄지지 않는다.] 화면에 보이지 않지만 움직이고 있는 몬스터를 그릴 때 클리핑을 하면 연산을 하지만, 화면에 보이지도 않고, 움직이지도 않는 몬스터는 그릴 때 컬링으로 연산을 제외시킬 수 있다.
-
벡터의 내적과 외적을 응용해 왼쪽 오른쪽 판별이러저런 이야기 2019. 12. 19. 10:45
벡터의 외적은 벡터 곱이라 할 수 있으며, 벡터 A와 벡터 B의 외적을 A x B라고 한다 [A cross B]. 외적의 결과는 내적과 달리 벡터가 나오며, A x B [외적 벡터]의 방향은 수학에서는 오른손 법칙을 사용한다. 게임은 엔진이 사용하는 좌표계에 따라 다른데, OpenGL에서는 오른손 법칙, Unity는 왼손 법칙에 따른다. 그리고 외적 벡터의 크기는 두 벡터의 크기에 sinθ를 곱한 값과 같다. [A x B = |A| |B| sin θ] 외적의 특징으로 A와 B 벡터의 외적, AxB는 벡터 A와도 수직이고, 벡터 B와도 수직이다. 캐릭터와 적이 월드 상에 존재할 때 월드 좌표계의 Up 방향 벡터를 U, 캐릭터의 Forward 방향 벡터를 F, 그리고 적과 캐릭터의 위치를 뺀 벡터를 A라고 ..
-
내적을 이용한 시야 판별이러저런 이야기 2019. 12. 19. 10:45
벡터의 내적은 지난 게시글에 있으니 공식만 보겠습니다. a·b = ||a|| ||b|| cos θ 이게 벡터의 내적 공식이며, 여기서 cos θ 두 벡터의 사이 각을 의미한다. 한마디로 두 벡터 A, B의 값을 알고 있다면 두 벡터의 사이 각을 알 수 있다. 위 사진이 많이 조잡하지만 이해해주세요. 플레이어가 가진 Forward 벡터와 적 위치에서 플레이어의 위치를 뺀 벡터 A가 있을 때 플레이어의 시야 각을 θ라고 한다면 F 벡터와 A 벡터의 내적 한 값이 θ / 2보다 값이 작아야 플레이어의 시야 안에 있다고 할 수 있다. [+ 내적을 해서 나온 값이 양수[cos θ 값]라면 각이 -90 ~ 90 이기 때문에 적이 내 앞에 있다는 뜻이고, 음수라면 각이 90 ~ 270 이기 때문에 적이 내 뒤에 있다..
-
평면의 방정식과 d이러저런 이야기 2019. 12. 19. 10:45
평면의 방정식이란? 평면 위에 존재하는 점 A(x1, y1, z1) 그리고 평면의 법선 벡터가 h->(a, b, c) 일 때 평면의 방정식은 ax + by + cz + d = 0이다. [여기서 d는 원점과의 거리이다.] 평면의 법선 벡터 N(a, b, c)가 있고 평면 위의 한 점 P(d, e, f)가 있을 때 평면 위에 있는 임의의 점 Q(g, h, i)라 가정 했을 때 Q - P 는 평면 위의 벡터가 되며, 법선 벡터와 수직이니 법선 벡터와 내적은 0이 된다. 법선 벡터 N과 평면 위의 점 P를 알고 있으니 -(ad + be + cf)의 결과 값은 상수가 나온다. 여기서 이 값을 d라고 할 때 평면의 방정식은 ax + by + cz + d = 0가 된다. [-(ad + be + cf) 가 d 이므로 ..