11const mat<T> scale_33(
const T&sx,
const T &sy,
const T&sz)
14 m(0,0)=sx; m(0,1)= 0; m(0,2)= 0;
15 m(1,0)=0; m(1,1)=sy; m(1,2)= 0;
16 m(2,0)=0; m(2,1)= 0; m(2,2)= sz;
22const mat<T> scale_33(
const T&s)
25 m(0,0)=s; m(0,1)= 0; m(0,2)= 0;
26 m(1,0)=0; m(1,1)=s; m(1,2)= 0;
27 m(2,0)=0; m(2,1)= 0; m(2,2)= s;
36const mat<T> rotatex_33(
const T& angle)
38 T angler = angle*(T)3.14159/(T)180.0;
40 m(0,0)=1; m(0,1)= 0; m(0,2)= 0;
41 m(1,0)=0; m(1,1)= (T)cos((
double)angler);
42 m(1,2)= -(T)sin((
double)angler);
43 m(2,0)=0; m(2,1)= (T)sin((
double)angler);
44 m(2,2)= (T)cos((
double)angler);
51const mat<T> rotatey_33(
const T& angle)
53 T angler=angle*(T)3.14159/(T)180.0;
55 m(0,0)=(T)cos((
double)angler); m(0,1)= 0;
56 m(0,2)= (T)sin((
double)angler);
57 m(1,0)=0; m(1,1)=1; m(1,2)= 0;
58 m(2,0)=-(T)sin((
double)angler); m(2,1)= 0;
59 m(2,2)= (T)cos((
double)angler);
67const mat<T> rotatez_33(
const T& angle)
69 T angler=angle*(T)3.14159/(T)180.0;
71 m(0,0)=(T)cos((
double)angler);
72 m(0,1)= -(T)sin((
double)angler); m(0,2)= 0;
73 m(1,0)=(T)sin((
double)angler);
74 m(1,1)= (T)cos((
double)angler); m(1,2)= 0;
75 m(2,0)=0; m(2,1)= 0; m(2,2)= 1;
81const mat<T> rotate_22(
const T& angle)
83 T angler=angle*(T)3.14159/(T)180.0;
85 m(0,0)=(T)cos((
double)angler);
86 m(0,1)= -(T)sin((
double)angler);
87 m(1,0)=(T)sin((
double)angler);
88 m(1,1)= (T)cos((
double)angler);
93const mat<T> rotate_33(
const T &dirx,
const T &diry,
const T&dirz,
97 T angler = angle*(T)3.14159/(T)180.0;
100 T rsin = sin(angler);
101 m(0,0)= rcos + dirx*dirx*((T)1-rcos);
102 m(0,1)= -dirz*rsin + diry*dirx*((T)1-rcos);
103 m(0,2)= diry*rsin + dirz*dirx*((T)1-rcos);
106 m(1,0)= dirz*rsin + dirx*diry*((T)1-rcos);
107 m(1,1)= rcos + diry*diry*((T)1-rcos);
108 m(1,2)= -dirx*rsin + dirz*diry*((T)1-rcos);
111 m(2,0)= -diry*rsin + dirx*dirz*((T)1-rcos);
112 m(2,1)= dirx*rsin + diry*dirz*((T)1-rcos);
113 m(2,2)= rcos + dirz*dirz*((T)1-rcos);
122const mat<T> rotate_euler_33(
const T& yaw,
const T& pitch,
const T& roll)
124 T yawd= (T)(yaw*3.14159/180.0);
125 T pitchd=(T)(pitch*3.14159/180.0);
126 T rolld=(T)(roll*3.14159/180.0);
127 T cosy =(T) cos(yawd);
128 T siny =(T) sin(yawd);
129 T cosp =(T) cos(pitchd);
130 T sinp =(T) sin(pitchd);
131 T cosr =(T) cos(rolld);
132 T sinr =(T) sin(rolld);
135 m(0,0) = cosr*cosy - sinr*sinp*siny;
137 m(0,2) = cosr*siny + sinr*sinp*cosy;
140 m(1,0) = sinr*cosy + cosr*sinp*siny;
142 m(1,2) = sinr*siny - cosr*sinp*cosy;
155const mat<T> star(
const vec<T>& v)
179const mat<T> rotate_rodrigues_33(
const vec<T>& r)
183 return identity<T>(3);
186 T cos_theta = cos(theta);
187 T sin_theta = sin(theta);
189 return cos_theta*identity<T>(3) + ((T)1-cos_theta)*dyad(rn,rn) + sin_theta*star(rn);
193const mat<T> rotate_rodrigues_33(
const T&rx,
const T& ry,
const T&rz)
200 return rotate_rodrigues_33(r);
206const mat<T> shearxy_33(
const T &shx,
const T ­)
209 m(0,0)=1; m(0,1)= 0; m(0,2)= shx;
210 m(1,0)=0; m(1,1)= 1; m(1,2)= shy;
211 m(2,0)=0; m(2,1)= 0; m(2,2)= 1;
219const mat<T> shearxz_33(
const T&shx,
const T&shz)
222 m(0,0)=1; m(0,1)= shx; m(0,2)= 0;
223 m(1,0)=0; m(1,1)= 1; m(1,2)= 0;
224 m(2,0)=0; m(2,1)= shz; m(2,2)= 1;
230const mat<T> shearyz_33(
const T­,
const T&shz)
233 m(0,0)=1; m(0,1)= 0; m(0,2)= 0;
234 m(1,0)=shy; m(1,1)= 1; m(1,2)= 0;
235 m(2,0)=shz; m(2,1)= 0; m(2,2)= 1;
243const mat<T> shear_33(
const T &syx,
const T &szx,
244 const T &sxy,
const T &szy,
245 const T &sxz,
const T &syz)
248 m(0,0)=1; m(0,1)= syx; m(0,2)= szx;
249 m(1,0)=sxy; m(1,1)= 1; m(1,2)= szy;
250 m(2,0)=sxz; m(2,1)= syz; m(2,2)= 1;
257const mat<T> translate_44(
const T&x,
const T &y,
const T&z)
260 m(0,0)=1; m(0,1)= 0; m(0,2)= 0; m(0,3)= x;
261 m(1,0)=0; m(1,1)= 1; m(1,2)= 0; m(1,3)= y;
262 m(2,0)=0; m(2,1)= 0; m(2,2)= 1; m(2,3)= z;
263 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
269const mat<T> translate_44(
const vec<T> &v)
272 m(0,0)=1; m(0,1)= 0; m(0,2)= 0; m(0,3)= v(0);
273 m(1,0)=0; m(1,1)= 1; m(1,2)= 0; m(1,3)= v(1);
274 m(2,0)=0; m(2,1)= 0; m(2,2)= 1; m(2,3)= v(2);
275 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
281const mat<T> scale_44(
const T&sx,
const T &sy,
const T&sz)
284 m(0,0)=sx; m(0,1)= 0; m(0,2)= 0; m(0,3)= 0;
285 m(1,0)=0; m(1,1)=sy; m(1,2)= 0; m(1,3)= 0;
286 m(2,0)=0; m(2,1)= 0; m(2,2)= sz; m(2,3)= 0;
287 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
294 assert(s.
size() == 3);
295 return scale_44(s(0),s(1),s(2));
300const mat<T> scale_44(
const T&s)
303 m(0,0)=s; m(0,1)= 0; m(0,2)= 0; m(0,3)= 0;
304 m(1,0)=0; m(1,1)=s; m(1,2)= 0; m(1,3)= 0;
305 m(2,0)=0; m(2,1)= 0; m(2,2)= s; m(2,3)= 0;
306 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
314const mat<T> rotatex_44(
const T& angle)
316 T angler = angle*(T)3.14159/(T)180.0;
318 m(0,0)=1; m(0,1)= 0; m(0,2)= 0; m(0,3)= 0;
319 m(1,0)=0; m(1,1)= (T)cos((
double)angler);
320 m(1,2)= -(T)sin((
double)angler); m(1,3)= 0;
321 m(2,0)=0; m(2,1)= (T)sin((
double)angler);
322 m(2,2)= (T)cos((
double)angler); m(2,3)= 0;
323 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
329const mat<T> rotatey_44(
const T& angle)
331 T angler=angle*(T)3.14159/(T)180.0;
333 m(0,0)=(T)cos((
double)angler); m(0,1)= 0;
334 m(0,2)= (T)sin((
double)angler); m(0,3)= 0;
335 m(1,0)=0; m(1,1)=1; m(1,2)= 0; m(1,3)= 0;
336 m(2,0)=-(T)sin((
double)angler); m(2,1)= 0;
337 m(2,2)= (T)cos((
double)angler); m(2,3)= 0;
338 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
344const mat<T> rotatez_44(
const T& angle)
346 T angler=angle*(T)3.14159/(T)180.0;
348 m(0,0)=(T)cos((
double)angler);
349 m(0,1)= -(T)sin((
double)angler); m(0,2)= 0; m(0,3)= 0;
350 m(1,0)=(T)sin((
double)angler);
351 m(1,1)= (T)cos((
double)angler); m(1,2)= 0; m(1,3)= 0;
352 m(2,0)=0; m(2,1)= 0; m(2,2)= 1; m(2,3)= 0;
353 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
359const mat<T> rotate_44(
const T &dirx,
const T &diry,
const T&dirz,
363 T angler = angle*(T)3.14159/(T)180.0;
365 T rcos = cos(angler);
366 T rsin = sin(angler);
367 m(0,0)= rcos + dirx*dirx*((T)1-rcos);
368 m(0,1)= -dirz*rsin + diry*dirx*((T)1-rcos);
369 m(0,2)= diry*rsin + dirz*dirx*((T)1-rcos);
372 m(1,0)= dirz*rsin + dirx*diry*((T)1-rcos);
373 m(1,1)= rcos + diry*diry*((T)1-rcos);
374 m(1,2)= -dirx*rsin + dirz*diry*((T)1-rcos);
377 m(2,0)= -diry*rsin + dirx*dirz*((T)1-rcos);
378 m(2,1)= dirx*rsin + diry*dirz*((T)1-rcos);
379 m(2,2)= rcos + dirz*dirz*((T)1-rcos);
396 assert(dir.
size() == 3);
399 return rotate_33<T>(vdir(0),vdir(1),vdir(2), angle);
406 assert(dir.
size() == 3);
409 return rotate_44<T>(vdir(0),vdir(1),vdir(2), angle);
415const mat<T> rotate_euler_44(
const T& yaw,
const T& pitch,
const T& roll)
417 T yawd= yaw*3.14159/180.0;
418 T pitchd=pitch*3.14159/180.0;
419 T rolld=roll*3.14159/180.0;
420 T cosy =(T) cos(yawd);
421 T siny =(T) sin(yawd);
422 T cosp =(T) cos(pitchd);
423 T sinp =(T) sin(pitchd);
424 T cosr =(T) cos(rolld);
425 T sinr =(T) sin(rolld);
428 m(0,0) = cosr*cosy - sinr*sinp*siny;
430 m(0,2) = cosr*siny + sinr*sinp*cosy;
433 m(1,0) = sinr*cosy + cosr*sinp*siny;
435 m(1,2) = sinr*siny - cosr*sinp*cosy;
443 m(3,0) = m(3,1)= m(3,2) =0;
451const mat<T> shearxy_44(
const T &shx,
const T ­)
454 m(0,0)=1; m(0,1)= 0; m(0,2)= shx; m(0,3)= 0;
455 m(1,0)=0; m(1,1)= 1; m(1,2)= shy; m(1,3)= 0;
456 m(2,0)=0; m(2,1)= 0; m(2,2)= 1; m(2,3)= 0;
457 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
464const mat<T> shearxz_44(
const T&shx,
const T&shz)
467 m(0,0)=1; m(0,1)= shx; m(0,2)= 0; m(0,3)= 0;
468 m(1,0)=0; m(1,1)= 1; m(1,2)= 0; m(1,3)= 0;
469 m(2,0)=0; m(2,1)= shz; m(2,2)= 1; m(2,3)= 0;
470 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
476const mat<T> shearyz_44(
const T­,
const T&shz)
479 m(0,0)=1; m(0,1)= 0; m(0,2)= 0; m(0,3)= 0;
480 m(1,0)=shy; m(1,1)= 1; m(1,2)= 0; m(1,3)= 0;
481 m(2,0)=shz; m(2,1)= 0; m(2,2)= 1; m(2,3)= 0;
482 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
489const mat<T> shear_44(
const T &syx,
const T &szx,
490 const T &sxy,
const T &szy,
491 const T &sxz,
const T &syz)
494 m(0,0)=1; m(0,1)= syx; m(0,2)= szx; m(0,3)= 0;
495 m(1,0)=sxy; m(1,1)= 1; m(1,2)= szy; m(1,3)= 0;
496 m(2,0)=sxz; m(2,1)= syz; m(2,2)= 1; m(2,3)= 0;
497 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
507const mat<T> perspective_44(
const T& fovy,
const T&aspect,
const T& znear,
510 T fovyr = (T)(fovy*3.14159/180.0);
511 T f = (T)(cos(fovyr/2.0f)/sin(fovyr/2.0f));
513 m(0,0)=f/aspect; m(0,1)= 0; m(0,2)= 0; m(0,3)= 0;
514 m(1,0)=0; m(1,1)= f; m(1,2)= 0; m(1,3)= 0;
515 m(2,0)=0; m(2,1)= 0; m(2,2)= (zfar+znear)/(znear-zfar);
516 m(2,3)= (2*zfar*znear)/(znear-zfar);
517 m(3,0)=0; m(3,1)= 0; m(3,2)= -1; m(3,3)= 0;
523mat<T> viewport_44(
const T& xoff,
const T yoff,
const T& width,
529 m(0,0)=a; m(0,1)= 0; m(0,2)= 0; m(0,3)= xoff+(T)0.5;
530 m(1,0)=0; m(1,1)= b; m(1,2)= 0; m(1,3)= yoff+(T)0.5;
531 m(2,0)=0; m(2,1)= 0; m(2,2)= (T)0.5; m(2,3)=(T)0.5 ;
532 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
539const mat<T> look_at_44(
const T &eyex,
const T &eyey,
const T &eyez,
540 const T& centerx,
const T& centery,
const T& centerz,
541 const T& upx,
const T& upy,
const T& upz)
543 vec<T> center(centerx,centery,centerz);
544 vec<T> eye(eyex,eyey,eyez);
545 vec<T> up(upx,upy,upz);
547 vec<T> f = normalize(center-eye);
549 vec<T> s = normalize(cross(f,up));
550 vec<T> u = normalize(cross(s,f));
553 m(0,0)=s(0); m(0,1)=s(1) ; m(0,2)= s(2); m(0,3)= 0;
554 m(1,0)=u(0); m(1,1)=u(1) ; m(1,2)= u(2); m(1,3)= 0;
555 m(2,0)=-f(0); m(2,1)= -f(1); m(2,2)= -f(2); m(2,3)= 0;
556 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
557 m = m*translate_44(-eyex,-eyey,-eyez);
562const mat<T> look_at_44(vec<T> eye, vec<T> center, vec<T> up)
566 vec<T> f = normalize(center-eye);
568 vec<T> s = normalize(cross(f,up));
569 vec<T> u = normalize(cross(s,f));
572 m(0,0)=s(0); m(0,1)=s(1) ; m(0,2)= s(2); m(0,3)= 0;
573 m(1,0)=u(0); m(1,1)=u(1) ; m(1,2)= u(2); m(1,3)= 0;
574 m(2,0)=-f(0); m(2,1)= -f(1); m(2,2)= -f(2); m(2,3)= 0;
575 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
576 m = m*translate_44(-eye);
582const mat<T> frustrum_44(
const T& left,
const T&right,
583 const T& bottom,
const T& top,
584 const T& znear,
const T& zfar)
586 T e = 2*znear/(right - left);
587 T f = 2*znear/(top-bottom);
588 T A = (right +left)/(right -left);
589 T B = (top+bottom)/(top-bottom);
590 T C = -(zfar + znear)/(zfar-znear);
591 T D = -(2*zfar*znear)/(zfar-znear);
593 m(0,0)=e; m(0,1)= 0; m(0,2)= A; m(0,3)= 0;
594 m(1,0)=0; m(1,1)= f; m(1,2)= B; m(1,3)= 0;
595 m(2,0)=0; m(2,1)= 0; m(2,2)= C; m(2,3)= D;
596 m(3,0)=0; m(3,1)= 0; m(3,2)= -1; m(3,3)= 0;
602const mat<T> ortho_44(
const T& left,
const T&right,
603 const T& bottom,
const T& top,
604 const T& znear,
const T& zfar)
606 T a = 2/(right - left);
607 T b = 2/(top-bottom);
608 T c = -2/(zfar-znear);
609 T tx = (right+left)/(right-left);
610 T ty = (top+bottom)/(top-bottom);
611 T tz = (zfar+znear)/(zfar-znear);
613 m(0,0)=a; m(0,1)= 0; m(0,2)= 0; m(0,3)= -tx;
614 m(1,0)=0; m(1,1)= b; m(1,2)= 0; m(1,3)= -ty;
615 m(2,0)=0; m(2,1)= 0; m(2,2)= c; m(2,3)= -tz;
616 m(3,0)=0; m(3,1)= 0; m(3,2)= 0; m(3,3)= 1;
623const mat<T> ortho2d_44(
const T& left,
const T&right,
624 const T& bottom,
const T& top)
626 return ortho_44<T>(left,right,bottom,top,(T)-1.0,(T)1.0);
632const mat<T> pick_44(
const T& x,
const T& y,
const T& width,
const T& height,
int viewport[4],
const mat<double> &modelviewproj,
bool flipy=
true)
637 sx = viewport[2] / width;
638 sy = viewport[3] / height;
639 tx = (T)(viewport[2] + 2.0 * (viewport[0] - x)) / width;
641 ty = (T)(viewport[3] + 2.0 * (viewport[1] - (viewport[3]-y))) / height;
643 ty = (T)(viewport[3] + 2.0 * (viewport[1] - y)) / height;
645 m(0,0) = sx; m(0,1) = 0; m(0,2) = 0; m(0,3) = tx;
646 m(1,0) = 0; m(1,1) = sy; m(1,2) = 0; m(1,3) = ty;
647 m(2,0) = 0; m(2,1) = 0; m(2,2) = 1; m(2,3) = 0;
648 m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1;
649 return m*modelviewproj;
654void decompose_R_2_RxRyRz(
const mat<T>& R33,T &angle_x, T& angle_y, T& angle_z)
657 angle_y = asin( R33(0,2));
658 T C = cos( angle_y );
660 angle_y *= (T)(180/3.14159);
661 if ( std::abs( C ) > (T)0.005 )
664 atry = -R33(1,2) / C;
665 angle_x = atan2( atry, trx ) * (T)(180/3.14159);
667 atry = -R33(0,1) / C;
668 angle_z = atan2( atry, trx ) * (T)(180/3.14159);
675 angle_z = atan2( atry, trx ) * (T)(180/3.14159);
679 if (angle_x < 0) angle_x += (T)360;
680 if (angle_y < 0) angle_y += (T)360;
681 if (angle_z < 0) angle_z += (T)360;
688const mat<T> extract_frustrum_planes(
const mat<T>& modelviewprojection)
690 mat<T> frustrum_planes(4,6);
692 frustrum_planes.set_col(0,modelviewprojection.row(3)-modelviewprojection.row(0));
693 frustrum_planes.set_col(1,modelviewprojection.row(3)+modelviewprojection.row(0));
694 frustrum_planes.set_col(2,modelviewprojection.row(3)-modelviewprojection.row(1));
695 frustrum_planes.set_col(3,modelviewprojection.row(3)+modelviewprojection.row(1));
696 frustrum_planes.set_col(4,modelviewprojection.row(3)-modelviewprojection.row(2));
697 frustrum_planes.set_col(5,modelviewprojection.row(3)+modelviewprojection.row(2));
700 for(
unsigned i=0;i<6;i++)
701 frustrum_planes.set_col(i,frustrum_planes.col(i)/length(frustrum_planes.col(i).sub_vec(0,3)));
702 return frustrum_planes;
unsigned size() const
number of elements
void normalize()
normalize the vector using the L2-Norm