47 #include <visp/vpConfig.h>
49 #ifndef DOXYGEN_SHOULD_SKIP_THIS
50 #include <visp/vpMy.h>
51 #include <visp/vpArit.h>
52 #include <visp/vpView.h>
55 void set_parallel (View_parameters*, Matrix);
56 void set_perspective (View_parameters*, Matrix);
67 void View_to_Matrix (View_parameters *vp, Matrix m)
69 static char proc_name[] =
"View_to_Matrix";
76 set_perspective (vp, m);
79 fprintf (stderr,
"%s: bad view type\n", proc_name);
80 set_perspective (vp, m);
95 static void set_zy (Matrix m, Vector *v0, Vector *v1)
99 SET_COORD3(rz, - v0->x,- v0->y, - v0->z);
100 CROSS_PRODUCT(rx, *v0, *v1);
103 CROSS_PRODUCT (ry,rz,rx);
105 m[0][0] = rx.x; m[0][1] = ry.x; m[0][2] = rz.x; m[0][3] = 0.0;
106 m[1][0] = rx.y; m[1][1] = ry.y; m[1][2] = rz.y; m[1][3] = 0.0;
107 m[2][0] = rx.z; m[2][1] = ry.z; m[2][2] = rz.z; m[2][3] = 0.0;
108 m[3][0] = 0.0 ; m[3][1] = 0.0 ; m[3][2] = 0.0 ; m[3][3] = 1.0;
121 void set_parallel (View_parameters *vp, Matrix wc)
123 Matrix m = IDENTITY_MATRIX;
131 SET_COORD3(v,- vp->vrp.x, - vp->vrp.y, - vp->vrp.z);
132 Translate_to_Matrix (&v, wc);
138 set_zy (m, &vp->vpn, &vp->vup);
142 postleft_matrix (m,
'z');
143 postmult_matrix (wc, m);
152 vp->vrp.x - vp->cop.x,
153 vp->vrp.y - vp->cop.y,
154 vp->vrp.z - vp->cop.z);
156 SET_COORD3(cop,dop.x,dop.y,dop.z);
157 point_matrix (&doprim, &cop, m);
159 m[2][0] = - doprim.x / doprim.z;
160 m[2][1] = - doprim.y / doprim.z;
161 postmult_matrix (wc, m);
170 (
float)(-(vp->vwd.umax + vp->vwd.umin) / 2.0),
171 (
float)(-(vp->vwd.vmax + vp->vwd.vmin) / 2.0),
172 (
float)(-vp->depth.front));
173 posttrans_matrix (wc, &v);
175 (
float)(2.0 / (vp->vwd.umax - vp->vwd.umin)),
176 (
float)(2.0 / (vp->vwd.vmax - vp->vwd.vmin)),
177 (
float)(1.0 / (vp->depth.back - vp->depth.front)));
178 postscale_matrix (wc, &v);
191 void set_perspective (View_parameters *vp, Matrix wc)
193 Matrix m = IDENTITY_MATRIX;
201 SET_COORD3(v,- vp->cop.x, - vp->cop.y, - vp->cop.z);
202 Translate_to_Matrix (&v, wc);
208 set_zy (m, &vp->vpn, &vp->vup);
209 postmult_matrix (wc, m);
213 postleft_matrix (wc,
'z');
217 point_matrix (&vrprim, &vp->vrp, wc);
218 cw.x = (float)(vrprim.x + (vp->vwd.umin + vp->vwd.umax) / 2.0);
219 cw.y = (float)(vrprim.y + (vp->vwd.vmin + vp->vwd.vmax) / 2.0);
220 cw.z = (float)(vrprim.z);
222 m[2][0] = - cw.x / cw.z;
223 m[2][1] = - cw.y / cw.z;
224 postmult_matrix (wc, m);
229 (
float)((2.0*vrprim.z)/((vp->vwd.umax-vp->vwd.umin)*(vrprim.z+vp->depth.back))),
230 (
float)((2.0*vrprim.z)/((vp->vwd.vmax-vp->vwd.vmin)*(vrprim.z+vp->depth.back))),
231 (
float)( 1.0/(vrprim.z+vp->depth.back)));
232 postscale_matrix (wc, &v);
236 zmin = (vrprim.z + vp->depth.front) / (vrprim.z + vp->depth.back);
238 m[2][2] = (float)(1.0 / (1.0 - zmin)); m[2][3] = 1.0;
239 m[3][2] = (float)(- zmin / (1.0 - zmin)); m[3][3] = 0.0;
240 postmult_matrix (wc, m);