cgv
Loading...
Searching...
No Matches
transformations.h
1#pragma once
2#include "vec.h"
3#include "mat.h"
4
5namespace cgv {
6namespace math {
7
8
10template <typename T>
11const mat<T> scale_33(const T&sx, const T &sy, const T&sz)
12{
13 mat<T> m(3,3);
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;
17 return m;
18}
19
21template <typename T>
22const mat<T> scale_33(const T&s)
23{
24 mat<T> m(3,3);
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;
28
29 return m;
30}
31
32
33
35template<typename T>
36const mat<T> rotatex_33(const T& angle)
37{
38 T angler = angle*(T)3.14159/(T)180.0;
39 mat<T> m(3,3);
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);
45
46 return m;
47}
48
50template<typename T>
51const mat<T> rotatey_33(const T& angle)
52{
53 T angler=angle*(T)3.14159/(T)180.0;
54 mat<T> m(3,3);
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);
60
61
62 return m;
63}
64
66template<typename T>
67const mat<T> rotatez_33(const T& angle)
68{
69 T angler=angle*(T)3.14159/(T)180.0;
70 mat<T> m(3,3);
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;
76 return m;
77}
78
80template<typename T>
81const mat<T> rotate_22(const T& angle)
82{
83 T angler=angle*(T)3.14159/(T)180.0;
84 mat<T> m(2,2);
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);
89 return m;
90}
91
92template<typename T>
93const mat<T> rotate_33(const T &dirx, const T &diry, const T&dirz,
94 const T& angle)
95{
96
97 T angler = angle*(T)3.14159/(T)180.0;
98 mat<T> m(3,3);
99 T rcos = cos(angler);
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);
104
105
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);
109
110
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);
114
115
116 return m;
117}
118
119
121template<typename T>
122const mat<T> rotate_euler_33(const T& yaw, const T& pitch,const T& roll)
123{
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);
133 mat<T> m(3,3);
134
135 m(0,0) = cosr*cosy - sinr*sinp*siny;
136 m(0,1) = -sinr*cosp;
137 m(0,2) = cosr*siny + sinr*sinp*cosy;
138
139
140 m(1,0) = sinr*cosy + cosr*sinp*siny;
141 m(1,1) = cosr*cosp;
142 m(1,2) = sinr*siny - cosr*sinp*cosy;
143
144
145 m(2,0) = -cosp*siny;
146 m(2,1) = sinp;
147 m(2,2) = cosp*cosy;
148
149
150
151 return m;
152}
153
154template <typename T>
155const mat<T> star(const vec<T>& v)
156{
157 mat<T> m(3,3);
158
159 m(0,0) = 0;
160 m(0,1) = -v(2);
161 m(0,2) = v(1);
162
163
164 m(1,0) = v(2);
165 m(1,1) = 0;
166 m(1,2) = -v(0);
167
168
169 m(2,0) = -v(1);
170 m(2,1) = v(0);
171 m(2,2) = 0;
172
173
174 return m;
175}
176
178template<typename T>
179const mat<T> rotate_rodrigues_33(const vec<T>& r)
180{
181 T theta = length(r);
182 if(theta == 0)
183 return identity<T>(3);
184
185 vec<T> rn = r/theta;
186 T cos_theta = cos(theta);
187 T sin_theta = sin(theta);
188
189 return cos_theta*identity<T>(3) + ((T)1-cos_theta)*dyad(rn,rn) + sin_theta*star(rn);
190}
191
192template<typename T>
193const mat<T> rotate_rodrigues_33(const T&rx, const T& ry, const T&rz)
194{
195 vec<T> r(3);
196 r(0) = rx;
197 r(1) = ry;
198 r(2) = rz;
199
200 return rotate_rodrigues_33(r);
201}
202
203
205template<typename T>
206const mat<T> shearxy_33(const T &shx, const T &shy)
207{
208 mat<T> m(3,3);
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;
212
213 return m;
214}
215
216
218template<typename T>
219const mat<T> shearxz_33(const T&shx, const T&shz)
220{
221 mat<T> m(3,3);
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;
225 return m;
226}
227
229template<typename T>
230const mat<T> shearyz_33(const T&shy, const T&shz)
231{
232 mat<T> m(3,3);
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;
236
237 return m;
238}
239
240
242template<typename T>
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)
246{
247 mat<T> m(3,3);
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;
251
252 return m;
253}
254
256template <typename T>
257const mat<T> translate_44(const T&x, const T &y, const T&z)
258{
259 mat<T> m(4,4);
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;
264 return m;
265}
266
268template <typename T>
269const mat<T> translate_44(const vec<T> &v)
270{
271 mat<T> m(4,4);
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;
276 return m;
277}
278
280template <typename T>
281const mat<T> scale_44(const T&sx, const T &sy, const T&sz)
282{
283 mat<T> m(4,4);
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;
288 return m;
289}
290
291template<typename T>
292const mat<T> scale_44(const cgv::math::vec<T> s)
293{
294 assert(s.size() == 3);
295 return scale_44(s(0),s(1),s(2));
296}
297
299template <typename T>
300const mat<T> scale_44(const T&s)
301{
302 mat<T> m(4,4);
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;
307 return m;
308}
309
310
311
313template<typename T>
314const mat<T> rotatex_44(const T& angle)
315{
316 T angler = angle*(T)3.14159/(T)180.0;
317 mat<T> m(4,4);
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;
324 return m;
325}
326
328template<typename T>
329const mat<T> rotatey_44(const T& angle)
330{
331 T angler=angle*(T)3.14159/(T)180.0;
332 mat<T> m(4,4);
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;
339 return m;
340}
341
343template<typename T>
344const mat<T> rotatez_44(const T& angle)
345{
346 T angler=angle*(T)3.14159/(T)180.0;
347 mat<T> m(4,4);
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;
354 return m;
355}
356
357
358template<typename T>
359const mat<T> rotate_44(const T &dirx, const T &diry, const T&dirz,
360 const T& angle)
361{
362
363 T angler = angle*(T)3.14159/(T)180.0;
364 mat<T> m(4,4);
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);
370
371
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);
375
376
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);
380
381 m(3,0)= (T)0;
382 m(3,1)= (T)0;
383 m(3,2)= (T)0;
384 m(0,3)= (T)0;
385 m(1,3)= (T)0;
386 m(2,3)= (T)0;
387 m(3,3)= (T)1;
388 return m;
389}
390
391
392template<typename T>
393const mat<T> rotate_33(const cgv::math::vec<T>& dir, const T& angle)
394{
395
396 assert(dir.size() == 3);
397 cgv::math::vec<T> vdir =dir;
398 vdir.normalize();
399 return rotate_33<T>(vdir(0),vdir(1),vdir(2), angle);
400}
401
402template<typename T>
403const mat<T> rotate_44(const cgv::math::vec<T>& dir, const T& angle)
404{
405
406 assert(dir.size() == 3);
407 cgv::math::vec<T> vdir =dir;
408 vdir.normalize();
409 return rotate_44<T>(vdir(0),vdir(1),vdir(2), angle);
410}
411
412
414template<typename T>
415const mat<T> rotate_euler_44(const T& yaw, const T& pitch,const T& roll)
416{
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);
426 mat<T> m(4,4);
427
428 m(0,0) = cosr*cosy - sinr*sinp*siny;
429 m(0,1) = -sinr*cosp;
430 m(0,2) = cosr*siny + sinr*sinp*cosy;
431 m(0,3) = 0;
432
433 m(1,0) = sinr*cosy + cosr*sinp*siny;
434 m(1,1) = cosr*cosp;
435 m(1,2) = sinr*siny - cosr*sinp*cosy;
436 m(1,3) = 0;
437
438 m(2,0) = -cosp*siny;
439 m(2,1) = sinp;
440 m(2,2) = cosp*cosy;
441 m(2,3) = 0;
442
443 m(3,0) = m(3,1)= m(3,2) =0;
444 m(3,3) = 1;
445 return m;
446}
447
448
450template<typename T>
451const mat<T> shearxy_44(const T &shx, const T &shy)
452{
453 mat<T> m(4,4);
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;
458 return m;
459}
460
461
463template<typename T>
464const mat<T> shearxz_44(const T&shx, const T&shz)
465{
466 mat<T> m(4,4);
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;
471 return m;
472}
473
475template<typename T>
476const mat<T> shearyz_44(const T&shy, const T&shz)
477{
478 mat<T> m(4,4);
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;
483 return m;
484}
485
486
488template<typename T>
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)
492{
493 mat<T> m(4,4);
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;
498 return m;
499}
500
501
502
503
504
506template<typename T>
507const mat<T> perspective_44(const T& fovy, const T&aspect, const T& znear,
508 const T& zfar)
509{
510 T fovyr = (T)(fovy*3.14159/180.0);
511 T f = (T)(cos(fovyr/2.0f)/sin(fovyr/2.0f));
512 mat<T> m(4,4);
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;
518 return m;
519}
520
522template <typename T>
523mat<T> viewport_44(const T& xoff, const T yoff, const T& width,
524 const T& height)
525{
526 mat<T> m(4,4);
527 T a = width/(T)2.0;
528 T b = height/(T)2.0;
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;
533 return m;
534}
535
536
538template<typename T>
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)
542{
543 vec<T> center(centerx,centery,centerz);
544 vec<T> eye(eyex,eyey,eyez);
545 vec<T> up(upx,upy,upz);
546
547 vec<T> f = normalize(center-eye);
548 up=normalize(up);
549 vec<T> s = normalize(cross(f,up));
550 vec<T> u = normalize(cross(s,f));
551
552 mat<T> m(4,4);
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);
558 return m;
559}
560
561template<typename T>
562const mat<T> look_at_44(vec<T> eye, vec<T> center, vec<T> up)
563{
564
565
566 vec<T> f = normalize(center-eye);
567 up=normalize(up);
568 vec<T> s = normalize(cross(f,up));
569 vec<T> u = normalize(cross(s,f));
570
571 mat<T> m(4,4);
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);
577 return m;
578}
579
581template<typename T>
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)
585{
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);
592 mat<T> m(4,4);
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;
597 return m;
598}
599
601template<typename T>
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)
605{
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);
612 mat<T> m(4,4);
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;
617 return m;
618}
619
620
622template<typename T>
623const mat<T> ortho2d_44(const T& left, const T&right,
624 const T& bottom, const T& top)
625{
626 return ortho_44<T>(left,right,bottom,top,(T)-1.0,(T)1.0);
627}
628
629
631template<typename T>
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)
633{
634 mat<T> m(4,4);
635 T sx, sy;
636 T tx, ty;
637 sx = viewport[2] / width;
638 sy = viewport[3] / height;
639 tx = (T)(viewport[2] + 2.0 * (viewport[0] - x)) / width;
640 if(flipy)
641 ty = (T)(viewport[3] + 2.0 * (viewport[1] - (viewport[3]-y))) / height;
642 else
643 ty = (T)(viewport[3] + 2.0 * (viewport[1] - y)) / height;
644
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;
650}
651
652//extract rotation angles from combined rotation matrix
653template <typename T>
654void decompose_R_2_RxRyRz(const mat<T>& R33,T &angle_x, T& angle_y, T& angle_z)
655{
656
657 angle_y = asin( R33(0,2)); /* Calculate Y-axis angle */
658 T C = cos( angle_y );
659 T trx,atry;
660 angle_y *= (T)(180/3.14159);
661 if ( std::abs( C ) > (T)0.005 ) /* Gimbal lock? */
662 {
663 trx = R33(2,2) / C; /* No, so get X-axis angle */
664 atry = -R33(1,2) / C;
665 angle_x = atan2( atry, trx ) * (T)(180/3.14159);
666 trx = R33(0,0) / C; /* Get Z-axis angle */
667 atry = -R33(0,1) / C;
668 angle_z = atan2( atry, trx ) * (T)(180/3.14159);
669 }
670 else /* Gimbal lock has occurred */
671 {
672 angle_x = 0; /* Set X-axis angle to zero */
673 trx = R33(1,1); /* And calculate Z-axis angle */
674 atry = R33(1,0);
675 angle_z = atan2( atry, trx ) * (T)(180/3.14159);
676 }
677
678 /* return only positive angles in [0,360] */
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;
682 //std::cout << angle_x << " "<< angle_y << " " <<angle_z <<std::endl;
683}
684
685
686
687template <typename T>
688const mat<T> extract_frustrum_planes(const mat<T>& modelviewprojection)
689{
690 mat<T> frustrum_planes(4,6);
691
692 frustrum_planes.set_col(0,modelviewprojection.row(3)-modelviewprojection.row(0));//right
693 frustrum_planes.set_col(1,modelviewprojection.row(3)+modelviewprojection.row(0));//left
694 frustrum_planes.set_col(2,modelviewprojection.row(3)-modelviewprojection.row(1));//top
695 frustrum_planes.set_col(3,modelviewprojection.row(3)+modelviewprojection.row(1));//bottom
696 frustrum_planes.set_col(4,modelviewprojection.row(3)-modelviewprojection.row(2));//far
697 frustrum_planes.set_col(5,modelviewprojection.row(3)+modelviewprojection.row(2));//near
698
699 // Normalize all planes
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;
703
704}
705
706}
707}
708
709
A column vector class.
Definition vec.h:28
unsigned size() const
number of elements
Definition vec.h:59
void normalize()
normalize the vector using the L2-Norm
Definition vec.h:588
the cgv namespace
Definition print.h:11