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