<aside> ⁉️ 궁금한 내용, 오타, 수정사항, 문의사항은 아래 깃허브 이슈 혹은 노션 블록 댓글로 달아주시면 바로 확인해드립니다! 도움이 되셨다면 아래 링크를 통해 🌟 한번 꾹 눌러주세요 ‼️
</aside>
GaepoMorningEagles/mini_raytracing_in_c
법선은 물체 표면과 빛의 상호작용을 계산하는데 필수적이다. 이번 장에서는 법선에 대해 알아보자.
primary ray와 구가 만난 점에서의 법선을 구한다.법선의 x, y, z값을 이용해 구의 색깔을 바꿔본다.
전 장에서 구의 중심 좌표와 primary ray를 이용해 구의 방정식을 세웠고, 방정식을 t에 관한 2차 방정식으로 바꾼뒤 t^2^과 t의 계수, 상수에 해당하는 a, b, c값을 구했다. 이번 장에서는 근의 공식을 이용하여 t값을 구하고, 구와 primary ray의 정확한 교점을 구할 것이다.
hit_sphere에서 t값을 반환할 것이므로 먼저 반환 타입을 바꿔주자.
...
//제거
t_bool hit_sphere(t_sphere *sp, t_ray *ray);
//제거 끝
//추가
double hit_sphere(t_sphere *sp, t_ray *ray);
//추가 끝
Code1 : [/include/trace.h]
#include "structures.h"
#include "utils.h"//t_bool에서 double로 변환.
double hit_sphere(t_sphere *sp, t_ray *ray)
{
...
//제거
return (discriminant > 0);
//제거 끝
//추가
if (discriminant < 0) // 판별식이 0보다 작을 때 : 실근 없을 때,
return (-1.0);
else
return ((-b - sqrt(discriminant)) / (2.0 * a)); // 두 근 중 작은 근
//추가 끝
}
Code1 : [/src/trace/hit/hit_sphere.c]
구와 광선의 교점, 구의 중심을 알게 됐으니 법선은 쉽게 구할 수 있다 (이미지1). 교점에서 중심을 빼준 뒤 구의 반지름으로 나눠주면 정규화된 법선을 구할 수 있다.
이미지1 : 구 표면에서의 법선
ray_color 함수를 수정하여 법선을 구하고, 법선을 이용하여 구에 색깔을 입혀보자.