-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcamera.h
More file actions
143 lines (130 loc) · 3.83 KB
/
Copy pathcamera.h
File metadata and controls
143 lines (130 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#pragma once
#include "rtweekend.h"
//class camera {
//public:
// camera() {
// auto aspect_ratio = 16.0 / 9.0;
// auto viewport_height = 2.0;
// auto viewport_width = aspect_ratio * viewport_height;
// auto focal_length = 1.0;
//
// origin = point3(0, 0, 0);
// horizontal = vec3(viewport_width, 0.0, 0.0);
// vertical = vec3(0.0, viewport_height, 0.0);
// lower_left_corner = origin - horizontal / 2 - vertical / 2 - vec3(0, 0, focal_length);
// }
//
// ray get_ray(double u, double v) const {
// return ray(origin, lower_left_corner + u * horizontal + v * vertical - origin);
// }
//
//private:
// point3 origin;
// point3 lower_left_corner;
// vec3 horizontal;
// vec3 vertical;
//};
//class camera {
//public:
// camera(
// double vfov,
// double aspect_ratio
// ) {
// auto theta = degrees_to_radians(vfov); // 计算视口的地方
// auto h = tan(theta / 2);
// auto viewport_height = 2.0 * h; // 距离定死是2
// auto viewport_width = aspect_ratio * viewport_height;
//
// auto focal_length = 1.0;
//
// origin = point3(0, 0, 0);
// horizontal = vec3(viewport_width, 0.0, 0.0);
// vertical = vec3(0.0, viewport_height, 0.0);
// lower_left_corner = origin - horizontal / 2 - vertical / 2 - vec3(0, 0, focal_length);
// }
//
// ray get_ray(double u, double v) const {
// return ray(origin, lower_left_corner + u * horizontal + v * vertical - origin);
// }
//
//private:
// point3 origin;
// point3 lower_left_corner;
// vec3 horizontal;
// vec3 vertical;
//};
//
//class camera {
//public:
// camera(
// point3 lookfrom,
// point3 lookat,
// vec3 vup,
// double vfov, // vertical field-of-view in degrees
// double aspect_ratio
// ) {
// auto theta = degrees_to_radians(vfov);
// auto h = tan(theta / 2);
// auto viewport_height = 2.0 * h;
// auto viewport_width = aspect_ratio * viewport_height;
//
// auto w = unit_vector(lookfrom - lookat);
// auto u = unit_vector(cross(vup, w)); // 叉乘得垂直向量
// auto v = cross(w, u);
//
// origin = lookfrom;
// horizontal = viewport_width * u;
// vertical = viewport_height * v;
// lower_left_corner = origin - horizontal / 2 - vertical / 2 - w;
// }
//
// ray get_ray(double s, double t) const {
// return ray(origin, lower_left_corner + s * horizontal + t * vertical - origin);
// }
//
//private:
// point3 origin;
// point3 lower_left_corner;
// vec3 horizontal;
// vec3 vertical;
//};
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;
};