5. Adding a Sphere(구 추가하기)

레이 트레이서에 단일 객체를 추가해봅시다. 광선이 구와 충돌하는지 계산하는 것이 비교적 간단하기 때문에 구를 자주 사용합니다.

5.1 Ray-Sphere Intersection(광선-구 교차)

원점을 중심으로 하는 반지름 r의 구에 대한 방정식은 다음과 같습니다:

$$ x²+y²+z²=r² $$

주어진 점 $(x,y,z)$가 구의 표면에 있다면 $x²+y²+z²=r²$입니다. 점이 구의 내부에 있다면 $x²+y²+z²<r²$이고, 외부에 있다면 $x²+y²+z²>r²$입니다.

구의 중심을 임의의 점 $(Cx,Cy,Cz)$에 두고 싶다면 방정식이 더 복잡해집니다:

$$ (Cx−x)²+(Cy−y)²+(Cz−z)²=r² $$

그래픽스에서는 모든 $x/y/z$ 내용을 vec3 클래스로 간단하게 표현하기 위해 공식을 벡터로 표현합니다. 점 $P=(x,y,z)$에서 중심 $C=(Cx,Cy,Cz)$까지의 벡터는 $(C−P)$입니다.

내적의 정의를 사용하면:

$$ (C−P)⋅(C−P)=(Cx−x)²+(Cy−y)²+(Cz−z)² $$

따라서 구의 방정식을 벡터 형태로 다시 쓸 수 있습니다:

$$ (C−P)⋅(C−P)=r² $$

이것은 "이 방정식을 만족하는 모든 점 P는 구 위에 있다"는 의미입니다. 우리는 광선 P(t)=Q+td가 구의 어딘가에 닿는지 알고 싶습니다. 구에 닿는다면 P(t)가 구 방정식을 만족하는 t가 존재합니다. 따라서 다음이 참인 t를 찾고 있습니다:

광선-구 교차를 계산할 때 원의 방정식을 벡터 형태로 변환하는 이유를 설명해드리겠습니다.

$$ (C−P(t))⋅(C−P(t))=r² $$

$P(t)$를 확장된 형태로 대체하면:

$$ (C−(Q+td))⋅(C−(Q+td))=r² $$

왼쪽에 세 개의 벡터가 오른쪽의 세 개의 벡터와 내적됩니다. 전체 내적을 풀면 아홉 개의 항을 얻게 됩니다. 모든 것을 전개할 수도 있지만, 그렇게까지 할 필요는 없습니다. t에 대해 풀고 싶으므로 t의 유무에 따라 항을 분리하겠습니다: