[42cursurs]Ray Tracing in One Weekend 4-Adding a Sphere

이상헌·2020년 10월 8일
0

이전 포스트에서 그라데이션으로 이미지를 출력해 보았다. 이제 이 이미지를 배경으로 구 하나를 그려보자.

Ray-Sphere Intersection

원문에서는 구의 방정식과 판별식을 이용해 광선 P(t)와 구의 교차여부를 판별하는 내용을 설명한다. 내용이 이해가 안가면 아래의 코드에서 hit_sphere라는 함수가 쏘아진 광선이 가상의 구와 교차하는 지 판별하는 역할을 한다고만 알아두자.

main.cc - Creating Our First Raytraced Image

bool hit_sphere(const point3& center, double radius, const ray& r) {
// 광선과 물체(여기서는 구)의 충돌 여부를 판단하는 함수
    vec3 oc = r.origin() - center;
    auto a = dot(r.direction(), r.direction());
    auto b = 2.0 * dot(oc, r.direction());
    auto c = dot(oc, oc) - radius*radius;
    auto discriminant = b*b - 4*a*c;
    return (discriminant > 0);
}

color ray_color(const ray& r) {
	// 광선과 구가 교차하는 지점은 빨간색을 반환한다.
    if (hit_sphere(point3(0,0,-1), 0.5, r))
        return color(1, 0, 0);
    vec3 unit_direction = unit_vector(r.direction());
    auto t = 0.5*(unit_direction.y() + 1.0);
    return (1.0-t)*color(1.0, 1.0, 1.0) + t*color(0.5, 0.7, 1.0);
}

아래처럼 중앙의 구에 부딪힌 광선이 있다면 해당지점만 붉은색으로 칠해지면 된다.

profile
배고픈 개발자 sayi입니다!

0개의 댓글