63.5 组合rotational sweeping和sphere sweeping画一个teapot
----------------------------------------------main.cpp ------------------------------------------
main.cpp
//rotational sweeping
vec3 ctrl_points_r[8] = {vec3(-4.0, 5.0, 0.0), vec3( 1.0, 3.5, 0.0),
vec3( 1.0, 3.0, 0.0), vec3( 0.2, 2.5, 0.0),
vec3( 3.0, 1.5, 0.0), vec3( 3.0, -1.5, 0.0),
vec3( 2.0, -4.0, 0.0), vec3(-4.0, -4.0, 0.0)};
//sphere sweeping, teapot handle
vec3 ctrl_points_sc_h[8] = {vec3( 1.0, 0.5, 0.0), vec3( 2.5, 0.5, 0.0),
vec3( 4.0, 1.0, 0.0), vec3( 5.0, 0.8, 0.0),
vec3( 4.0, -1.5, 0.0), vec3( 3.0, -2.0, 0.0),
vec3( 2.5, -2.5, 0.0), vec3( 1.5, -1.5, 0.0)};
vec3 ctrl_points_sr_h[8] = {vec3( 0.4, 0.0, 0.0), vec3( 0.4, 0.0, 0.0),
vec3( 0.4, 0.0, 0.0), vec3( 0.4, 0.0, 0.0),
vec3( 0.4, 0.0, 0.0), vec3( 0.4, 0.0, 0.0),
vec3( 0.4, 0.0, 0.0), vec3( 0.4, 0.0, 0.0)};
//sphere sweeping, teapot spout
vec3 ctrl_points_sc_s[8] = {vec3(-0.5, -1.0, 0.0), vec3(-2.5, -1.5, 0.0),
vec3(-4.0, -1.5, 0.0), vec3(-4.5, -0.5, 0.0),
vec3(-5.0, 0.5, 0.0), vec3(-6.0, 1.5, 0.0),
vec3(-7.0, 1.5, 0.0), vec3(-8.0, 0.0, 0.0)};
vec3 ctrl_points_sr_s[8] = {vec3( 1.0, 0.0, 0.0), vec3( 1.0, 0.0, 0.0),
vec3( 0.8, 0.0, 0.0), vec3( 0.8, 0.0, 0.0),
vec3( 0.4, 0.0, 0.0), vec3( 0.4, 0.0, 0.0),
vec3( 0.2, 0.0, 0.0), vec3( 0.2, 0.0, 0.0)};
hitable *list[3];
list[0] = new sweeping_rotational(vec3( 0.0, 0.0, 0.0), ctrl_points_r, new lambertian(vec3(1.0, 0.0, 0.0)), 0.0);
list[1] = new sweeping_sphere(ctrl_points_sc_h, ctrl_points_sr_h, new lambertian(vec3(1.0, 0.0, 0.0)));
list[2] = new sweeping_sphere(ctrl_points_sc_s, ctrl_points_sr_s, new lambertian(vec3(1.0, 0.0, 0.0)));
hitable *world = new hitable_list(list,3);
vec3 lookfrom(0, 0, 20);
vec3 lookat(0, 0, 0);
float dist_to_focus = (lookfrom - lookat).length();
float aperture = 0.0;
camera cam(lookfrom, lookat, vec3(0,1,0), 40, float(nx)/float(ny), aperture, 0.7*dist_to_focus);
输出图形如下:
vec3 lookfrom(0, 0, 20);
vec3 lookfrom(10, 10, 10);
vec3 lookfrom(15, 0, 15);
vec3 lookfrom(15, 5, 15);