def next_hit(pos, d): closest, normal = inf, ti.Vector.zero(ti.f32, 3) c, mat = ti.Vector.zero(ti.f32, 3), mat_lambertian # right near sphere cur_dist, hit_pos = intersect_sphere(pos, d, sp1_center, sp1_radius) if 0 < cur_dist < closest: closest = cur_dist normal = ti.normalized(hit_pos - sp1_center) c, mat = ti.Vector([1.0, 1.0, 1.0]), mat_glass # left far sphere cur_dist, hit_pos = intersect_sphere(pos, d, sp2_center, sp2_radius) if 0 < cur_dist < closest: closest = cur_dist normal = ti.normalized(hit_pos - sp2_center) c, mat = ti.Vector([0.8, 0.5, 0.4]), mat_metal # left pnorm = ti.Vector([1.0, 0.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, d, ti.Vector([-1.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([1.0, 0.0, 0.0]), mat_lambertian # right pnorm = ti.Vector([-1.0, 0.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, d, ti.Vector([1.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([0.0, 1.0, 0.0]), mat_lambertian # bottom pnorm = ti.Vector([0.0, 1.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, d, ti.Vector([0.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([1.0, 1.0, 1.0]), mat_lambertian # top pnorm = ti.Vector([0.0, -1.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, d, ti.Vector([0.0, 2.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([1.0, 1.0, 1.0]), mat_lambertian # far pnorm = ti.Vector([0.0, 0.0, 1.0]) cur_dist, _ = ray_plane_intersect(pos, d, ti.Vector([0.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([1.0, 1.0, 1.0]), mat_lambertian return closest, normal, c, mat
def intersect_scene(pos, ray_dir): closest, normal = inf, ti.Vector.zero(ti.f32, 3) c, mat = ti.Vector.zero(ti.f32, 3), mat_none # right near sphere cur_dist, hit_pos = intersect_sphere(pos, ray_dir, sp1_center, sp1_radius) if 0 < cur_dist < closest: closest = cur_dist normal = (hit_pos - sp1_center).normalized() c, mat = ti.Vector([1.0, 1.0, 1.0]), mat_glass # left box hit, cur_dist, pnorm = ray_aabb_intersection2_transformed( box_min, box_max, pos, ray_dir) if hit and 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([0.8, 0.5, 0.4]), mat_specular # left pnorm = ti.Vector([1.0, 0.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, ray_dir, ti.Vector([-1.1, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([0.65, 0.05, 0.05]), mat_lambertian # right pnorm = ti.Vector([-1.0, 0.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, ray_dir, ti.Vector([1.1, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = ti.Vector([0.12, 0.45, 0.15]), mat_lambertian # bottom gray = ti.Vector([0.93, 0.93, 0.93]) pnorm = ti.Vector([0.0, 1.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, ray_dir, ti.Vector([0.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = gray, mat_lambertian # top pnorm = ti.Vector([0.0, -1.0, 0.0]) cur_dist, _ = ray_plane_intersect(pos, ray_dir, ti.Vector([0.0, 2.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = gray, mat_lambertian # far pnorm = ti.Vector([0.0, 0.0, 1.0]) cur_dist, _ = ray_plane_intersect(pos, ray_dir, ti.Vector([0.0, 0.0, 0.0]), pnorm) if 0 < cur_dist < closest: closest = cur_dist normal = pnorm c, mat = gray, mat_lambertian # light hit_l, cur_dist = intersect_light(pos, ray_dir, closest) if hit_l and 0 < cur_dist < closest: # technically speaking, no need to check the second term closest = cur_dist normal = light_normal c, mat = light_color, mat_light return closest, normal, c, mat