1 #ifndef SPHERICALCAMERA_HXX
2 #define SPHERICALCAMERA_HXX
3
4 #include "Camera.hxx"
5
6 // This camera creates images to be projected into Dersch's PTViewer,
7 // a free java applet to view 360* panoramas with
8 class SphericalCamera : public Camera
9 {
10 // input values
11 Vec3f pos,up,
12 xAxis, yAxis, zAxis;
13
14 // precomputed values
15 float stepH,
16 stepV;
17 public:
18 SphericalCamera(Vec3f pos,Vec3f dir,Vec3f up,
19 int resX, int resY
20 )
21 : Camera(resX,resY),pos(pos),up(up),zAxis(-dir)
22 {
23 stepH = 2.0f * M_PI / static_cast<float>(resX);
24 stepV = M_PI / static_cast<float>(resY);
25
26 Normalize(zAxis);
27 Normalize(up);
28
29 xAxis = Cross(-zAxis,up);
30 Normalize(xAxis);
31
32 yAxis = Cross(xAxis, -zAxis);
33 Normalize(yAxis);
34 }
35
36 virtual ~SphericalCamera(){};
37
38 virtual bool InitRay(float x, float y, Ray &ray)
39 {
40 ray.org = pos;
41
42 // Interpolate in X Z plane
43 ray.dir = xAxis * -sin(static_cast<float>(x) * stepH)
44 + zAxis * cos(static_cast<float>(x) * stepH);
45
46 // Interpolate towards Y axis
47 ray.dir = ray.dir * sin(static_cast<float>(y) * stepV)
48 + yAxis * -cos(static_cast<float>(y) * stepV);
49
50 ray.t = Infinity;
51 ray.hit = NULL;
52
53 // Normalize the ray direction
54 Normalize(ray.dir);
55
56 return true;
57 };
58
59 #ifdef STEREOVIEW
60 // This camera does not support stereo view due to physical reasons,
61 // we're sorry :-(
62 virtual bool InitRay(float x, float y, Ray &ray, float eyedistance)
63 {
64 return InitRay(x, y, ray);
65 }
66 #endif
67 };
68 #endif
syntax highlighted by Code2HTML, v. 0.9.1