목록컴퓨터 그래픽스 (45)
개발하는 리프터 꽃게맨입니다.
어떤 두 사원수를 특정 비율로 보간해보겠습니다.이런 식으로 선형보간을 할 수도 있지만, 회전은 원 궤적으로 발생하기에정확한 보간을 나타내지는 못합니다. 좀 더 좋은 결과를 귀해서 구형 선형 보간을 구현해보겠습니다. 그렇다면 구형 선형 보간을 구현하는 계수를 찾아봅시다. q1과 직교하는 회전 사원수를 q3이라고 할 떄 qt는 위와같이 나타낼 수 있을 겁니다. 그렇다면 q3를 구해봅시다. 삼각함수를 이용하여 q3와 방향이 동일한 벡터를 얻을 수 있고해당 벡터를 이용하여 q3벡터를 얻어주도록 합시다.최종적으로 위와같이 qt를 얻어낼 수 있습니다. 한 가지 생각할 점은 큰 각을 기준으로 보간을 수행할 것인가작은 각을 기준으로 보간을 수행할 것인가입니다. 이는 bool 형 flag를 세워서 분기처리해주면 됩..
오일러 각을 이용해서 회전을 구현하면,최전축이 서로 겹쳐서 하나의 축이 다른 두 축을 완전히 포함하게 되는 경우가 발생합니다.이를 짐벌락 현상이라고 합니다. 이 경우 회전의 자유도가 제한되게 됩니다. 이에 대한 우수한 해결책은 사원수 (Quaternion) 회전 입니다. 사원수 개요 사원수는 실수부 1개와 허수부 3개로 이루어집니다. 허수 부호 i, j, k 는 모두 제곱하면 -1 을 만들어내는 허수는 맞으나i, j, k 는 각각 다른 허수 체계를 사용합니다. 사원수라는 독특한 체계가 나오게된 배경은 복소평면을 3차원으로 확장시키고자하는 시도에서 비롯되었습니다. 실수부를 Right, 허수부 Up 으로 하여 복소수를 2차원 평면으로 표현할 수 있고, 이를 복소평면이라고 합니다. 윌리엄 로원 해밀턴은 복..
현재까지 만들어낸 렌더러에 존재하는 버그를 보여드리겠습니다. 오브젝트 위로 지나가면 선이 갑자기 늘어나거나 텍스처 맵핑이 잘못되는 문제가 발생합니다. 그 이유는 카메라 아래에 커다란 삼각형이 존재할 때, 투영이 이상하게 되는 현상이 발생하기 때문입니다.카메라 뒷편에 있는 점도 투영되게 됩니다.원래라면 카메라 앞에 있는 점만 투영이 되어야 하는데, 보이지 않는 뒷면의 정점까지 투영이 되면서 문제가 발생한다고 생각할 수 있습니다. 눈 앞에 있는 정점만 그리면 되는 않나? 라고 생각할 수 있지만, 점 2개로는 삼각형을 만들 수 없기 때문에 상당히 골치가 아픈 문제입니다. 이 경우, 큰 삼각형은 작은 삼각형으로 축소시킬 수 있다면 해결할 수 있습니다. 이와같은 삼각형이 있다면 이렇게 잘라내면 됩니다. 삼각..
현재까지 작성한 렌더링 머신은 시야에서 벗어난 물체들에게도 변환 연산을 수행합니다. 픽셀을 찍기 전에 해당 좌표가 스크린에 존재하는지 검사하는 조건문이 있기 때문에, 카메라에서 벗어난 물체는 그리지 않습니다. 그럼에도 불구하고, 오브젝트를 이루는 모든 정점에 대해 모델링 변환, 뷰 변환, 원근 변환, 그리고 픽셀화 직전까지의 모든 연산이 수행됩니다. 따라서 오른쪽 사진에서처럼 렌더링할 물체가 거의 없더라도, 높은 프레임을 유지하지 못하는 이유는 그릴 필요가 없는 물체를 위해 무의미한 연산이 이루어지기 때문입니다. 이 문제를 최적화하려면, 그릴 필요가 없는 물체를 빠르게 걸러낼 필요가 있습니다. 이전 글에서 다뤘듯뷰 공간에서 NDC 공간을 나타내면 위 그림과 같습니다. 해당 사다리꼴 영역을 뷰 공간으..
동일한 크기의 상자를 Z값이 변경해서 배치해봤습니다.텍스처를 입혀볼까요? 멀리있는 물체는 가까이 있는 물체에 가려져야할텐데뒤에 있는 물체가 앞에 있는 물체를 뚫고 나오고 있습니다. 그 이유는 오브젝트 사이에 그려지는 순서가 정해져있지 않기 때문입니다. 해결 방법은 두 가지 입니다. 1. Z값을 기준으로 오브젝트를 정렬하여, Z값이 큰 것부터 먼저 그린다. (깊이 정렬)2. '깊이' 라는 개념을 추가하여, 그리고자 하는 스크린 픽셀에 자기보다 깊이가 얕은 픽셀이 존재한다면, 픽셀을 찍지 않는다. (Z-Buffer 알고리즘) 저는 두 번째 방법을 사용하겠습니다. 이런 방법을 Depth Buffer, Z-Buffer 알고리즘 등으로 부릅니다. 이때까지 설계했던 원근투영 행렬을 보겠습니다. 최종적으로 얻은 클..