53 lines
1.5 KiB
C++
53 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "rtweekend.h"
|
|
#include "image.h"
|
|
|
|
class camera
|
|
{
|
|
public:
|
|
camera(
|
|
point3 lookfrom,
|
|
point3 lookat,
|
|
vec3 vup,
|
|
double vfov, // vertical field of view in degrees
|
|
double aspect_ratio,
|
|
double aperture,
|
|
double focus_dist)
|
|
{
|
|
auto theta = degrees_to_radians(vfov);
|
|
auto h = tan(theta/2);
|
|
auto viewport_height = 2.0 * h;
|
|
auto viewport_width = aspect_ratio * viewport_height;
|
|
|
|
w_ = unit_vector(lookfrom - lookat);
|
|
u_ = unit_vector(cross(vup, w_));
|
|
v_ = cross(w_, u_);
|
|
|
|
origin_ = lookfrom;
|
|
horizontal_ = focus_dist * viewport_width * u_;
|
|
vertical_ = focus_dist * viewport_height * v_;
|
|
lower_left_corner_ = origin_ - horizontal_/2 - vertical_/2 - focus_dist * w_;
|
|
|
|
lens_radius_ = aperture / 2;
|
|
}
|
|
|
|
ray get_ray(double s, double t) const
|
|
{
|
|
vec3 rd = lens_radius_ * random_in_unit_disk();
|
|
vec3 offset = (u_ * rd.x()) + (v_ * rd.y());
|
|
|
|
return ray(
|
|
origin_ + offset,
|
|
lower_left_corner_ + s*horizontal_ + t*vertical_ - origin_ - offset);
|
|
}
|
|
|
|
private:
|
|
point3 origin_;
|
|
point3 lower_left_corner_;
|
|
vec3 horizontal_;
|
|
vec3 vertical_;
|
|
vec3 u_, v_, w_;
|
|
double lens_radius_;
|
|
};
|