18 void Camera::set_field_of_view(float f)
23 void Camera::set_aspect(float a)
28 void Camera::set_depth_clip(float n, float f)
34 void Camera::set_position(const Vector3 &p)
40 void Camera::set_up_direction(const Vector3 &u)
42 up_dir = normalize(u);
47 void Camera::set_look_direction(const Vector3 &l)
49 look_dir = normalize(l);
54 void Camera::look_at(const Vector3 &p)
56 set_look_direction(p-position);
59 Vector3 Camera::project(const Vector4 &p) const
61 float frustum_h = tan(fov/2);
62 float frustum_w = frustum_h*aspect;
63 float z_range = clip_far-clip_near;
65 Vector4 eye = matrix*p;
67 return Vector3(eye.x/frustum_w/-eye.z, eye.y/frustum_h/-eye.z,
68 (clip_far+clip_near)/z_range+2*clip_far*clip_near/(eye.z*z_range));
71 Vector3 Camera::project(const Vector3 &p) const
73 return project(Vector4(p.x, p.y, p.z, 1.0));
76 Vector4 Camera::unproject(const Vector4 &p) const
78 float frustum_h = tan(fov/2);
79 float frustum_w = frustum_h*aspect;
80 float z_range = clip_far-clip_near;
82 float z = (2*clip_far*clip_near)/(p.z*z_range-(clip_far+clip_near))-matrix[14]*p.w;
83 float x = p.x*-z*frustum_w-matrix[12]*p.w;
84 float y = p.y*-z*frustum_h-matrix[13]*p.w;
86 return Vector4(matrix[0]*x+matrix[1]*y+matrix[2]*z,
87 matrix[4]*x+matrix[5]*y+matrix[6]*z,
88 matrix[8]*x+matrix[9]*y+matrix[10]*z,
92 void Camera::apply() const
94 MatrixStack::projection() = Matrix::perspective(fov, aspect, clip_near, clip_far);
95 MatrixStack::modelview() = matrix;
98 void Camera::compute_matrix()
100 Vector3 right_dir = normalize(cross(look_dir, up_dir));
103 mdata[0] = right_dir.x;
104 mdata[4] = right_dir.y;
105 mdata[8] = right_dir.z;
107 mdata[1] = right_dir.y*look_dir.z-right_dir.z*look_dir.y;
108 mdata[5] = right_dir.z*look_dir.x-right_dir.x*look_dir.z;
109 mdata[9] = right_dir.x*look_dir.y-right_dir.y*look_dir.x;
111 mdata[2] = -look_dir.x;
112 mdata[6] = -look_dir.y;
113 mdata[10] = -look_dir.z;
115 mdata[12] = -position.x*mdata[0]-position.y*mdata[4]-position.z*mdata[8];
116 mdata[13] = -position.x*mdata[1]-position.y*mdata[5]-position.z*mdata[9];
117 mdata[14] = -position.x*mdata[2]-position.y*mdata[6]-position.z*mdata[10];