miniRT 실습 - 07. Objects

jkeum·2021년 3월 17일
0

miniRT

목록 보기
7/7

출처:
Ray Tracing in One Weekend - A List of Hittable Objects
Github - GaepoMorningEagles/mini_raytracing_in_c


Hittable Objects


A List of Hittable Objects

광선과 hit 할 수 있는 객체들, 과제에서 구현해야 하는 객체들을 hittable objects라고 하겠다. 이 객체들을 담고 있는 연결리스트를 world라고 했다. oadd()를 통해 world 리스트에 추가된 순서대로 광선과의 hit 여부를 검사한다.
world 리스트에 다음으로 어떤 타입의 객체가 들어올지 모르기 때문에 elementvoid * 타입으로 객체 정보를 받는다. 만약 객체가 원기둥이면, t_cylinder * 타입의 변수가 element에 저장된다. 현재는 구만 만들었기 때문에, 구 두 개를 리스트에 추가하겠다.


Functions to Check If the Ray Hit the Object

hit()에서 world 리스트와 광선 ray, 그리고 현재 hit 정보를 담고 있는 rec를 받아와서 hit 여부를 검사한다. 반복문을 통해 리스트에 있는 객체들을 처음부터 끝까지 검사한다. 현재 광선이 쏘고 있는 픽셀에서 뭐라도 hit 했다면 hit_anything의 값을 true로 바꿔준다. 그리고 그 hit 한 곳에서의 rec.t 값을 rec.tmax에 넣어준다.(이 부분에 대한 설명은 이전 챕터에 나와있다.) 여기서 객체가 여러 개 겹쳐있든 아니든 하나라도 hit 를 했다면 true가 리턴된다.
여기서 hit 여부를 검사하는 함수인 hit_obj() 안에서 현재 리스트가 가리키고 있는 노드의 객체 타입이 무엇인지 확인하고, 그에 맞는 함수로 들어가서 hit 여부를 검사하고 결과값을 리턴한다.


Result Image

profile
It's me, jkeum!

0개의 댓글