38#include <visp3/core/vpConfig.h>
40#ifndef DOXYGEN_SHOULD_SKIP_THIS
41#include "vpProjection.h"
53 void View_to_Matrix(View_parameters *vp, Matrix m)
55 static char proc_name[] =
"View_to_Matrix";
62 set_perspective(vp, m);
65 fprintf(stderr,
"%s: bad view type\n", proc_name);
66 set_perspective(vp, m);
80static void set_zy(Matrix m, Vector *v0, Vector *v1)
84 SET_COORD3(rz, -v0->x, -v0->y, -v0->z);
85 CROSS_PRODUCT(rx, *v0, *v1);
88 CROSS_PRODUCT(ry, rz, rx);
118void 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);
148 SET_COORD3(dop, vp->vrp.x - vp->cop.x, vp->vrp.y - vp->cop.y, vp->vrp.z - vp->cop.z);
150 SET_COORD3(cop, dop.x, dop.y, dop.z);
151 point_matrix(&doprim, &cop, m);
153 m[2][0] = -doprim.x / doprim.z;
154 m[2][1] = -doprim.y / doprim.z;
155 postmult_matrix(wc, m);
163 SET_COORD3(v,
static_cast<float>(-(vp->vwd.umax + vp->vwd.umin) / 2.0),
static_cast<float>(-(vp->vwd.vmax + vp->vwd.vmin) / 2.0),
164 static_cast<float>(vp->depth.front));
165 posttrans_matrix(wc, &v);
166 SET_COORD3(v,
static_cast<float>(2.0 / (vp->vwd.umax - vp->vwd.umin)),
static_cast<float>(2.0 / (vp->vwd.vmax - vp->vwd.vmin)),
167 static_cast<float>(1.0 / (vp->depth.back - vp->depth.front)));
168 postscale_matrix(wc, &v);
181void set_perspective(View_parameters *vp, Matrix wc)
183 Matrix m = IDENTITY_MATRIX;
191 SET_COORD3(v, -vp->cop.x, -vp->cop.y, -vp->cop.z);
192 Translate_to_Matrix(&v, wc);
198 set_zy(m, &vp->vpn, &vp->vup);
199 postmult_matrix(wc, m);
203 postleft_matrix(wc,
'z');
207 point_matrix(&vrprim, &vp->vrp, wc);
208 cw.x =
static_cast<float>(vrprim.x + (vp->vwd.umin + vp->vwd.umax) / 2.0);
209 cw.y =
static_cast<float>(vrprim.y + (vp->vwd.vmin + vp->vwd.vmax) / 2.0);
210 cw.z =
static_cast<float>(vrprim.z);
212 m[2][0] = -cw.x / cw.z;
213 m[2][1] = -cw.y / cw.z;
214 postmult_matrix(wc, m);
218 SET_COORD3(v,
static_cast<float>((2.0 * vrprim.z) / ((vp->vwd.umax - vp->vwd.umin) * (vrprim.z + vp->depth.back))),
219 static_cast<float>((2.0 * vrprim.z) / ((vp->vwd.vmax - vp->vwd.vmin) * (vrprim.z + vp->depth.back))),
220 static_cast<float>(1.0 / (vrprim.z + vp->depth.back)));
221 postscale_matrix(wc, &v);
225 zmin = (vrprim.z + vp->depth.front) / (vrprim.z + vp->depth.back);
227 m[2][2] =
static_cast<float>(1.0 / (1.0 - zmin));
229 m[3][2] =
static_cast<float>(-zmin / (1.0 - zmin));
231 postmult_matrix(wc, m);