-
Notifications
You must be signed in to change notification settings - Fork 0
/
PinholeCamera.cc
57 lines (46 loc) · 1.3 KB
/
PinholeCamera.cc
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
#include "PinholeCamera.h"
#include "RenderContext.h"
#include "Ray.h"
#include "Math.h"
#include <math.h>
#include <iostream>
PinholeCamera::PinholeCamera(const Animation<Point>& eye, const Animation<Point>& lookat, const Animation<Vector>& up,
double hfov)
: eye(eye), lookat(lookat), up(up), hfov(hfov)
{
}
PinholeCamera::~PinholeCamera()
{
}
void PinholeCamera::preprocess(double aspect_ratio, int maxTime)
{
eye.preprocess(maxTime);
lookat.preprocess(maxTime);
up.preprocess(maxTime);
for(int i = 0; i <= maxTime; i++)
{
Vector l = lookat(i)-eye(i);
l.normalize();
lookdir.addFrame(i, l);
Vector _u(Cross(l, up(i)));
Vector _v(Cross(_u, l));
double ulen = tan(hfov/2.*M_PI/180.);
_u.normalize();
_u *= ulen;
double vlen = ulen/aspect_ratio;
_v.normalize();
_v *= vlen;
u.addFrame(i, _u);
v.addFrame(i, _v);
}
u.preprocess(maxTime);
v.preprocess(maxTime);
lookdir.preprocess(maxTime);
}
void PinholeCamera::makeRay(Ray& ray, const RenderContext& context, double x, double y) const
{
double time = context.time();
Vector direction = lookdir(time) + u(time)*x + v(time)*y;
direction.normalize();
ray = Ray(eye(time), direction);
}