44 #include <visp3/core/vpConfig.h> 46 #ifndef DOXYGEN_SHOULD_SKIP_THIS 47 #include <visp3/robot/vpMy.h> 48 #include <visp3/robot/vpArit.h> 49 #include <visp3/robot/vpView.h> 52 void set_parallel (View_parameters*, Matrix);
53 void set_perspective (View_parameters*, Matrix);
64 void View_to_Matrix (View_parameters *vp, Matrix m)
66 static char proc_name[] =
"View_to_Matrix";
73 set_perspective (vp, m);
76 fprintf (stderr,
"%s: bad view type\n", proc_name);
77 set_perspective (vp, m);
92 static void set_zy (Matrix m, Vector *v0, Vector *v1)
96 SET_COORD3(rz, - v0->x,- v0->y, - v0->z);
97 CROSS_PRODUCT(rx, *v0, *v1);
100 CROSS_PRODUCT (ry,rz,rx);
102 m[0][0] = rx.x; m[0][1] = ry.x; m[0][2] = rz.x; m[0][3] = 0.0;
103 m[1][0] = rx.y; m[1][1] = ry.y; m[1][2] = rz.y; m[1][3] = 0.0;
104 m[2][0] = rx.z; m[2][1] = ry.z; m[2][2] = rz.z; m[2][3] = 0.0;
105 m[3][0] = 0.0 ; m[3][1] = 0.0 ; m[3][2] = 0.0 ; m[3][3] = 1.0;
118 void set_parallel (View_parameters *vp, Matrix wc)
120 Matrix m = IDENTITY_MATRIX;
128 SET_COORD3(v,- vp->vrp.x, - vp->vrp.y, - vp->vrp.z);
129 Translate_to_Matrix (&v, wc);
135 set_zy (m, &vp->vpn, &vp->vup);
139 postleft_matrix (m,
'z');
140 postmult_matrix (wc, m);
149 vp->vrp.x - vp->cop.x,
150 vp->vrp.y - vp->cop.y,
151 vp->vrp.z - vp->cop.z);
153 SET_COORD3(cop,dop.x,dop.y,dop.z);
154 point_matrix (&doprim, &cop, m);
156 m[2][0] = - doprim.x / doprim.z;
157 m[2][1] = - doprim.y / doprim.z;
158 postmult_matrix (wc, m);
167 (
float)(-(vp->vwd.umax + vp->vwd.umin) / 2.0),
168 (
float)(-(vp->vwd.vmax + vp->vwd.vmin) / 2.0),
169 (
float)(-vp->depth.front));
170 posttrans_matrix (wc, &v);
172 (
float)(2.0 / (vp->vwd.umax - vp->vwd.umin)),
173 (
float)(2.0 / (vp->vwd.vmax - vp->vwd.vmin)),
174 (
float)(1.0 / (vp->depth.back - vp->depth.front)));
175 postscale_matrix (wc, &v);
188 void set_perspective (View_parameters *vp, Matrix wc)
190 Matrix m = IDENTITY_MATRIX;
198 SET_COORD3(v,- vp->cop.x, - vp->cop.y, - vp->cop.z);
199 Translate_to_Matrix (&v, wc);
205 set_zy (m, &vp->vpn, &vp->vup);
206 postmult_matrix (wc, m);
210 postleft_matrix (wc,
'z');
214 point_matrix (&vrprim, &vp->vrp, wc);
215 cw.x = (float)(vrprim.x + (vp->vwd.umin + vp->vwd.umax) / 2.0);
216 cw.y = (float)(vrprim.y + (vp->vwd.vmin + vp->vwd.vmax) / 2.0);
217 cw.z = (float)(vrprim.z);
219 m[2][0] = - cw.x / cw.z;
220 m[2][1] = - cw.y / cw.z;
221 postmult_matrix (wc, m);
226 (
float)((2.0*vrprim.z)/((vp->vwd.umax-vp->vwd.umin)*(vrprim.z+vp->depth.back))),
227 (
float)((2.0*vrprim.z)/((vp->vwd.vmax-vp->vwd.vmin)*(vrprim.z+vp->depth.back))),
228 (
float)( 1.0/(vrprim.z+vp->depth.back)));
229 postscale_matrix (wc, &v);
233 zmin = (vrprim.z + vp->depth.front) / (vrprim.z + vp->depth.back);
235 m[2][2] = (float)(1.0 / (1.0 - zmin)); m[2][3] = 1.0;
236 m[3][2] = (float)(- zmin / (1.0 - zmin)); m[3][3] = 0.0;
237 postmult_matrix (wc, m);