<aside> ⁉️ 궁금한 내용, 오타, 수정사항, 문의사항은 아래 깃허브 이슈 혹은 노션 블록 댓글로 달아주시면 바로 확인해드립니다! 도움이 되셨다면 아래 링크를 통해 🌟 한번 꾹 눌러주세요 ‼️

</aside>

GaepoMorningEagles/mini_raytracing_in_c


3. 레이, 카메라

이번 장에서는 '레이'트레이싱의 레이 , '레이'의 출발점이 되는 카메라 에 대해 알아볼 것이다.

들어가기 전에

우리는 오른손 좌표계를 쓸 것이다. 우리의 오른쪽 방향이 x축, 머리 위쪽 방향이 y축, 모니터에서 나오는 방향이 z축이다.

3.1. 실습목표

레이에 대해 이해하고, 관련 구조체와 함수를 만든다.카메라에 대해 이해하고, 관련 함수를 만든다.레이와 카메라로 픽셀에 색상을 표현해본다.

3.2. 레이

다시 한 번 사과가 빨간색으로 보이는 이유에 대해 생각해보자. 광원(ex.태양)으로부터 나온 빛(태양광)이 사과와 만난 뒤, 그 중 일부(사람이 빨간색으로 느끼는 파장대에 해당하는 가시광선)가 사과 표면에 의해 반사되어 우리의 눈에 들어오기 때문이다(이미지 1).

https://github.com/GaepoMorningEagles/mini_raytracing_in_c/raw/main/images/03_image1.jpg

이미지1

광선이 우리의 눈에 들어올 때에만 물체가 보이는 것이다. 만약 사과 뒤에 귤이 있었어도 귤은 보이지 않았을 것이다. 귤 표면에서 반사된 빛은 사과에 가로막혀 우리 눈에 들어오지 않았기 때문이다. 사과가 우리의 뒤에 있었어도 보이지 않았을 것이다. 역시 반사된 빛이 우리 눈에 들어오지 않았기 때문이다. 광선이 우리 눈에 들어와야지만 우리가 본 것으로 인식한다.

광원으로부터 나온 모든 광선이 우리 눈에 들어오는 것이 아니다(햇빛이 다른 나라에 있는 사과를 비춘다고 해서 그것이 우리 눈에 직접 보이진 않는 것처럼). 그러므로 광원으로부터 나온 모든 광선에 대해 조사할 필요가 없다. 우리의 눈에 들어온 광선(ray)이 어떤 길을 따라 왔는지만 거꾸로 추적(tracing)하면 되는 것이다.

우리는 3차원 좌표계에서 광선을 추적하며 그 색상을 확인할 것이다. 광선도 벡터와 같이 시작하는 점(origin)과 뻗어나가는 방향(direction)을 가지고 있다. 수식의 형태로 다시 써보면 다음과 같을 것이다.P = O + d(P는 광선, O와 d는 각각 출발점과 벡터)여기서 방향 벡터의 크기는 1일 수도, 그렇지 않을 수도 있다. 우리는 앞으로 방향 벡터를 1로 정규화해준 뒤 그것에 실수(t)를 곱하여 광선의 방향을 표현할 것이다.P(t) = O + t * D(D는 정규화된 방향벡터)위와 같이 광선을 t에 관한 매개변수 방정식으로 표현해주면, 광선의 방정식과 오브젝트(앞으로 설명할 구, 사각형 등)의 벡터 방정식을 연립하여 t의 값을 구할 수 있게 된다. 이 때 얻은 t값을 통해 광선과 벡터의 교점을 알 수 있게 되는 것이다! (고등학교 때 배운 수학을 떠올려보자. x와 y로 표현된 직선과 원의 방정식을 연립하면 x와 y의 값을 구할 수 있고, 그 값들이 곧 교점의 좌표가 되는 것과 같은 원리다)

https://github.com/GaepoMorningEagles/mini_raytracing_in_c/raw/main/images/03_image2.jpg

이미지2: 방정식으로 나타낸 벡터

코드는 다음과 같다.