벡터로 나타낸 도형의 방정식
본문컴퓨터 그래픽의 광선 추적은 카메라에서 화면의 각 점을 지나는 빛줄기를 쏘아, 그 빛줄기가 장면 속 물체에 처음 닿는 점을 찾아 색을 정한다. 원점의 카메라에서 앞쪽 \(z\)축 방향으로 5 m 떨어진 곳에 반지름 3 m인 공이 있다. 정면으로 쏜 빛줄기는 공의 몇 m 앞에서 닿을까? 방향 \((0, 0.6, 0.8)\)으로 비스듬히 쏜 빛줄기는 공에 닿을까, 비켜 갈까? 빛줄기와 공을 모두 벡터의 식으로 쓰면 답을 계산할 수 있을까?
2.8.1매개변수로 그리는 직선과 평면
점 \(A\)를 지나고 방향벡터가 \(\vec u\)인 직선 위의 점 \(P\)는 \(A\)에서 \(\vec u\) 방향으로 몇 배 간 곳이므로, 위치벡터로 \(\vec p = \vec a + t\vec u\)라 쓴다. 매개변수 \(t\)가 실수 전체를 지나면 직선 전체가 그려진다. 같은 방법으로 평행하지 않은 두 방향 \(\vec u\), \(\vec v\)를 쓰면 \(\vec p = \vec a + s\vec u + t\vec v\)가 평면 하나를 그린다. 평면은 법선 벡터 \(\vec n\)으로도 나타내는데, 평면 위의 모든 점 \(P\)에 대해 \(\overrightarrow{AP}\)가 \(\vec n\)과 수직이어야 하므로 \(\vec n\cdot(\vec p - \vec a) = 0\)이다.
직선은 \(\vec p = \vec a + t\vec u\), 평면은 \(\vec n\cdot(\vec p - \vec a) = 0\), 중심이 \(C\)이고 반지름이 \(r\)인 구는 \(|\vec p - \vec c| = r\)이다. 원점에서 단위 방향 \(\vec d\)로 쏜 빛줄기 \(\vec p = t\vec d\)가 구와 만나는 \(t\)는 \[t^2 - 2(\vec d\cdot\vec c)\,t + |\vec c|^2 - r^2 = 0\]의 근이다.
빛줄기와 구의 교점을 구하는 식은 구의 방정식 \(|\vec p - \vec c|^2 = r^2\)에 \(\vec p = t\vec d\)를 넣고 내적을 전개하면 나온다. \(|\vec d| = 1\)이므로 \(|t\vec d - \vec c|^2 = t^2 - 2t\,\vec d\cdot\vec c + |\vec c|^2\)이다. 이차방정식의 판별식이 양수이면 빛줄기가 공을 뚫고 지나가 두 점에서 만나고, 0이면 스치고, 음수이면 비켜 간다. 두 근 가운데 작은 양수가 카메라에서 처음 닿는 점이다.1
2.8.2원과 구는 같은 식
\(|\vec p - \vec c| = r\)은 중심에서 거리가 \(r\)인 점들의 모임을 뜻하므로, 평면벡터로 읽으면 원, 공간벡터로 읽으면 구이다. 그래서 벡터 식 하나가 차원에 따라 다른 도형을 나타낸다. 마찬가지로 \(\vec n\cdot(\vec p - \vec a) = 0\)은 평면벡터로는 직선, 공간벡터로는 평면이다. 성분으로 풀어 쓰면 식이 길어지지만, 벡터로 쓰면 도형의 뜻이 그대로 드러나고 계산도 내적 몇 번으로 줄어든다.
2.8.3예제 풀이
처음 질문의 두 빛줄기가 공에 처음 닿는 점의 좌표를 구하여라. 정면 빛줄기가 닿은 점에서 공의 법선 벡터를 구하고, 빛줄기와 이루는 각을 구하여라.
정면 빛줄기 \(\vec d = (0, 0, 1)\)은 \(\vec d\cdot\vec c = 5\)이므로 \(t^2 - 10t + 16 = 0\)에서 \(t = 2\) 또는 8이다. 처음 닿는 점은 \(t = 2\)인 \((0, 0, 2)\)로 카메라에서 2 m 앞이다. 비스듬한 빛줄기 \((0, 0.6, 0.8)\)은 \(\vec d\cdot\vec c = 4\)이므로 \(t^2 - 8t + 16 = (t - 4)^2 = 0\)에서 \(t = 4\)인 한 점 \((0, 2.4, 3.2)\)에서 공을 스친다. 이 점과 중심 사이의 거리는 \(\sqrt{2.4^2 + 1.8^2} = 3\)으로 반지름과 같다.
\((0, 0, 2)\)에서 공의 법선은 중심에서 그 점으로 향하는 \((0, 0, 2) - (0, 0, 5) = (0, 0, -3)\), 곧 단위벡터 \((0, 0, -1)\)이다. 빛줄기 방향 \((0, 0, 1)\)과의 내적이 \(-1\)이므로 둘은 정반대로, 빛줄기가 공을 정면으로 친다. 그래서 이 점은 가장 밝게 칠해지고, 스치는 점은 법선과 빛줄기가 수직이어서 가장자리처럼 어둡게 칠해진다. 즉 직선과 구를 벡터 식으로 쓰면 둘의 교점은 내적으로 만든 이차방정식 하나로 구해지고, 판별식이 빛줄기가 물체에 닿는지를 알려 준다.
아래 탐구 카드에서 매개변수를 바꾸며 직선과 평면을 그려 보고, 빛줄기와 구의 교점을 계산해 직접 3D 그림을 만들어 보자.
- 광선 추적은 1980년 미국의 휘티드가 반사와 굴절까지 따라가는 방법으로 발전시켰다. 화면 한 장에 빛줄기를 수백만 개 쏘아야 해서 오랫동안 영화에서만 쓰였지만, 지금은 게임용 그래픽 카드가 1초에 수십억 번의 교점 계산을 해낸다.
직선은 \(\vec p = \vec a + t\vec u\), 평면은 \(\vec n\cdot(\vec p - \vec a) = 0\), 구는 \(|\vec p - \vec c| = r\)로 나타내며, 같은 벡터 식이 평면에서는 원과 직선, 공간에서는 구와 평면을 그린다. 빛줄기와 구의 교점은 구의 식에 빛줄기의 식을 넣어 얻는 \(t\)의 이차방정식으로 구하고, 판별식으로 닿는지를 판단한다. 처음 질문의 정면 빛줄기는 카메라에서 2 m 앞의 \((0, 0, 2)\)에서 공에 닿고, 비스듬한 빛줄기는 \((0, 2.4, 3.2)\)에서 공을 스친다.