20 using namespace Utils;
46 SLMat3 (
const T M0,
const T M3,
const T M6,
47 const T M1,
const T M4,
const T M7,
48 const T M2,
const T M5,
const T M8);
67 void m (
int i, T val) {assert(i>=0 && i<9); _m[i] = val;}
70 const T*
m ()
const {
return _m;}
71 T
m (
int i)
const {assert(i>=0 && i<9);
return _m[i];}
86 operator const T*()
const {
return _m;}
87 operator T* (){
return _m;}
88 T& operator ()(
SLint row,
SLint col) {
return _m[3*col+row];}
89 const T& operator ()(
SLint row,
SLint col)
const {
return _m[3*col+row];}
95 const T axisx,
const T axisy,
const T axisz);
96 void rotation (
const T zAngleRAD,
const T yAngleRAD,
const T xAngleRAD);
99 void scale (
const T sx,
const T sy,
const T sz);
126 static void swap (T& a, T& b) {T t; t=a; a=b; b=t;}
149 _m[0]=M0; _m[3]=M3; _m[6]=M6;
150 _m[1]=M1; _m[4]=M4; _m[7]=M7;
151 _m[2]=M2; _m[5]=M5; _m[8]=M8;
157 rotation(angleDEG, axisx, axisy, axisz);
163 rotation(angleDEG, axis);
177 fromEulerAnglesXYZ(angleXRAD,
187 _m[0]=A.
_m[0]; _m[3]=A.
_m[3]; _m[6]=A.
_m[6];
188 _m[1]=A.
_m[1]; _m[4]=A.
_m[4]; _m[7]=A.
_m[7];
189 _m[2]=A.
_m[2]; _m[5]=A.
_m[5]; _m[8]=A.
_m[8];
196 for (
int i=0; i<9; ++i) _m[i] = a[i];
204 _m[1]+A.
_m[1], _m[4]+A.
_m[4], _m[7]+A.
_m[7],
205 _m[2]+A.
_m[2], _m[5]+A.
_m[5], _m[8]+A.
_m[8]);
214 _m[1]-A.
_m[1], _m[4]-A.
_m[4], _m[7]-A.
_m[7],
215 _m[2]-A.
_m[2], _m[5]-A.
_m[5], _m[8]-A.
_m[8]);
224 _m[0]*A.
_m[3] + _m[3]*A.
_m[4] + _m[6]*A.
_m[5],
225 _m[0]*A.
_m[6] + _m[3]*A.
_m[7] + _m[6]*A.
_m[8],
226 _m[1]*A.
_m[0] + _m[4]*A.
_m[1] + _m[7]*A.
_m[2],
227 _m[1]*A.
_m[3] + _m[4]*A.
_m[4] + _m[7]*A.
_m[5],
228 _m[1]*A.
_m[6] + _m[4]*A.
_m[7] + _m[7]*A.
_m[8],
229 _m[2]*A.
_m[0] + _m[5]*A.
_m[1] + _m[8]*A.
_m[2],
230 _m[2]*A.
_m[3] + _m[5]*A.
_m[4] + _m[8]*A.
_m[5],
231 _m[2]*A.
_m[6] + _m[5]*A.
_m[7] + _m[8]*A.
_m[8]);
239 setMatrix(_m[0]*A.
_m[0] + _m[3]*A.
_m[1] + _m[6]*A.
_m[2],
240 _m[0]*A.
_m[3] + _m[3]*A.
_m[4] + _m[6]*A.
_m[5],
241 _m[0]*A.
_m[6] + _m[3]*A.
_m[7] + _m[6]*A.
_m[8],
242 _m[1]*A.
_m[0] + _m[4]*A.
_m[1] + _m[7]*A.
_m[2],
243 _m[1]*A.
_m[3] + _m[4]*A.
_m[4] + _m[7]*A.
_m[5],
244 _m[1]*A.
_m[6] + _m[4]*A.
_m[7] + _m[7]*A.
_m[8],
245 _m[2]*A.
_m[0] + _m[5]*A.
_m[1] + _m[8]*A.
_m[2],
246 _m[2]*A.
_m[3] + _m[5]*A.
_m[4] + _m[8]*A.
_m[5],
247 _m[2]*A.
_m[6] + _m[5]*A.
_m[7] + _m[8]*A.
_m[8]);
255 NewV.
x = _m[0]*v.
x + _m[3]*v.
y + _m[6]*v.
z;
256 NewV.
y = _m[1]*v.
x + _m[4]*v.
y + _m[7]*v.
z;
257 NewV.
z = _m[2]*v.
x + _m[5]*v.
y + _m[8]*v.
z;
264 SLMat3<T> NewM(_m[0] * a, _m[3] * a, _m[6] * a,
265 _m[1] * a, _m[4] * a, _m[7] * a,
266 _m[2] * a, _m[5] * a, _m[8] * a);
274 for (
int i=0; i<9; ++i) _m[i] *= a;
282 SLMat3<T> NewM(_m[0] / a, _m[3] / a, _m[6] / a,
283 _m[1] / a, _m[4] / a, _m[7] / a,
284 _m[2] / a, _m[5] / a, _m[8] / a);
292 for (
int i=0; i<9; ++i) _m[i] /= a;
301 for (
int i=0; i<9; ++i) _m[i] = A.
_m[i];
307 for (
int i=0; i<9; ++i) _m[i] = A->
_m[i];
313 for (
int i=0; i<9; ++i) _m[i] = M[i];
321 _m[0]=M0; _m[3]=M3; _m[6]=M6;
322 _m[1]=M1; _m[4]=M4; _m[7]=M7;
323 _m[2]=M2; _m[5]=M5; _m[8]=M8;
332 _m[1]=_m[2]=_m[3]=_m[5]=_m[6]=_m[7]=0;
358 setMatrix(inverted());
368 if (fabs(d) < FLT_EPSILON)
370 SLMATH_LOG(
"3x3-Matrix is singular. Inversion impossible.");
375 i.
_m[0] = _m[4]*_m[8] - _m[7]*_m[5];
376 i.
_m[1] = _m[7]*_m[2] - _m[1]*_m[8];
377 i.
_m[2] = _m[1]*_m[5] - _m[4]*_m[2];
378 i.
_m[3] = _m[6]*_m[5] - _m[3]*_m[8];
379 i.
_m[4] = _m[0]*_m[8] - _m[6]*_m[2];
380 i.
_m[5] = _m[3]*_m[2] - _m[0]*_m[5];
381 i.
_m[6] = _m[3]*_m[7] - _m[6]*_m[4];
382 i.
_m[7] = _m[6]*_m[1] - _m[0]*_m[7];
383 i.
_m[8] = _m[0]*_m[4] - _m[3]*_m[1];
394 rotation(angleDEG, axis.
x, axis.
y, axis.
z);
399 const T axisx,
const T axisy,
const T axisz)
401 T angleRAD = (T)angleDEG *
DEG2RAD;
402 T ca = (T)cos(angleRAD);
403 T sa = (T)sin(angleRAD);
405 if (axisx==1 && axisy==0 && axisz==0)
406 { _m[0]=1; _m[3]=0; _m[6]=0;
407 _m[1]=0; _m[4]=ca; _m[7]=-sa;
408 _m[2]=0; _m[5]=sa; _m[8]=ca;
410 else if (axisx==0 && axisy==1 && axisz==0)
411 { _m[0]=ca; _m[3]=0; _m[6]=sa;
412 _m[1]=0; _m[4]=1; _m[7]=0;
413 _m[2]=-sa; _m[5]=0; _m[8]=ca;
415 else if (axisx==0 && axisy==0 && axisz==1)
416 { _m[0]=ca; _m[3]=-sa; _m[6]=0;
417 _m[1]=sa; _m[4]=ca; _m[7]=0;
418 _m[2]=0; _m[5]=0; _m[8]=1;
422 T l = axisx*axisx + axisy*axisy + axisz*axisz;
424 x=axisx, y=axisy, z=axisz;
425 if ((l > T(1.0001) || l < T(0.9999)) && l!=0)
429 T xy=x*y, yz=y*z, xz=x*z, xx=x*x, yy=y*y, zz=z*z;
430 _m[0]=xx + ca*(1-xx); _m[3]=xy - xy*ca - z*sa; _m[6]=xz - xz*ca + y*sa;
431 _m[1]=xy - xy*ca + z*sa; _m[4]=yy + ca*(1-yy); _m[7]=yz - yz*ca - x*sa;
432 _m[2]=xz - xz*ca - y*sa; _m[5]=yz - yz*ca + x*sa; _m[8]=zz + ca*(1-zz);
444 T Cx = (T)cos(xAngleRAD); T Sx = (T)sin(xAngleRAD);
445 T Cy = (T)cos(yAngleRAD); T Sy = (T)sin(yAngleRAD);
446 T Cz = (T)cos(zAngleRAD); T Sz = (T)sin(zAngleRAD);
452 _m[1] = (Sx * Sy * Cz) + (Cx * Sz);
453 _m[4] = -(Sx * Sy * Sz) + (Cx * Cz);
456 _m[2] = -(Cx * Sy * Cz) + (Sx * Sz);
457 _m[5] = (Cx * Sy * Sz) + (Sx * Cz);
464 _m[0]=sx; _m[3]=0; _m[6]=0;
465 _m[1]=0; _m[4]=sy; _m[7]=0;
466 _m[2]=0; _m[5]=0; _m[8]=sz;
472 _m[0]=
s.x; _m[3]=0; _m[6]=0;
473 _m[1]=0; _m[4]=
s.y; _m[7]=0;
474 _m[2]=0; _m[5]=0; _m[8]=
s.z;
480 _m[0]=
s; _m[3]=0; _m[6]=0;
481 _m[1]=0; _m[4]=
s; _m[7]=0;
482 _m[2]=0; _m[5]=0; _m[8]=
s;
488 return _m[0] + _m[4] + _m[8];
495 return _m[0]*(_m[4]*_m[8] - _m[7]*_m[5]) -
496 _m[3]*(_m[1]*_m[8] - _m[7]*_m[2]) +
497 _m[6]*(_m[1]*_m[5] - _m[4]*_m[2]);
506 template <
typename T>
532 T cs = ((T)0.5) * (tr - (T)1);
533 T angleRAD = acos(cs);
539 axis.
x = _m[5] - _m[7];
540 axis.
y = _m[6] - _m[2];
541 axis.
z = _m[1] - _m[3];
554 axis.
x = ((T)0.5)*sqrt((T)1 + _m[0] - _m[4] - _m[8]);
555 halfInverse = ((T)0.5)/axis.
x;
556 axis.
y = halfInverse*_m[3];
557 axis.
z = halfInverse*_m[6];
562 axis.
z = ((T)0.5)*sqrt((T)1 + _m[8] - _m[0] - _m[4]);
563 halfInverse = ((T)0.5)/axis.
z;
564 axis.
x = halfInverse*_m[6];
565 axis.
y = halfInverse*_m[7];
574 axis.
y = ((T)0.5)*sqrt((T)1 + _m[4] - _m[0] - _m[8]);
575 halfInverse = ((T)0.5)/axis.
y;
576 axis.
x = halfInverse*_m[3];
577 axis.
z = halfInverse*_m[7];
582 axis.
z = ((T)0.5)*sqrt((T)1 + _m[8] - _m[0] - _m[4]);
583 halfInverse = ((T)0.5)/axis.
z;
584 axis.
x = halfInverse*_m[6];
585 axis.
y = halfInverse*_m[7];
615 Cy = (T)sqrt(1.0 - Sy*Sy);
620 T factor = (T)1.0 / Cy;
634 zRotRAD = atan2f(Sz, Cz);
635 yRotRAD = atan2f(Sy, Cy);
636 xRotRAD = atan2f(Sx, Cx);
652 Cy = (T)sqrt(1.0 - Sy*Sy);
657 T factor = (T)1.0 / Cy;
671 zRotRAD = atan2f(Sz, Cz);
672 yRotRAD = atan2f(Sy, Cy);
673 xRotRAD = atan2f(Sx, Cx);
687 T s1 = sin(angleX1RAD), c1 = cos(angleX1RAD);
688 T s2 = sin(angleY2RAD), c2 = cos(angleY2RAD);
689 T s3 = sin(angleZ3RAD), c3 = cos(angleZ3RAD);
691 _m[0]=(T) (c2*c3); _m[3]=(T)-(c2*s3); _m[6] =(T) s2;
692 _m[1]=(T) (s1*s2*c3) + (c1*s3); _m[4]=(T)-(s1*s2*s3) + (c1*c3); _m[7] =(T)-(c2*s1);
693 _m[2]=(T)-(c1*s2*c3) + (s1*s3); _m[5]=(T) (c1*s2*s3) + (s1*c3); _m[8] =(T) (c1*c2);
706 T s1 = sin(angleZ1RAD), c1 = cos(angleZ1RAD);
707 T s2 = sin(angleY2RAD), c2 = cos(angleY2RAD);
708 T s3 = sin(angleX3RAD), c3 = cos(angleX3RAD);
710 _m[0]=(T) (c1*c2); _m[3]=(T) (c1*s2*s3) - (c3*s1); _m[6] =(T) (s1*s3) + (c1*c3*s2);
711 _m[1]=(T) (c2*s1); _m[4]=(T) (c1*c3) + (s1*s2*s3); _m[7] =(T) (c3*s1*s2) - (c1*s3);
712 _m[2]=(T)-s2; _m[5]=(T) (c2*s3); _m[8] =(T) (c2*c3);
725 T s1 = sin(angleZ1RAD), c1 = cos(angleZ1RAD);
726 T s2 = sin(angleX2RAD), c2 = cos(angleX2RAD);
727 T s3 = sin(angleZ3RAD), c3 = cos(angleZ3RAD);
729 _m[0]=(T)( c1*c3 - s1*c2*s3); _m[3]=(T)( s1*c3 + c1*c2*s3); _m[6] =(T)( s2*s3);
730 _m[1]=(T)(-c1*s3 - s1*c2*c3); _m[4]=(T)( c1*c2*c3 - s1*s3); _m[7] =(T)( s2*c3);
731 _m[2]=(T)( s1*s2); _m[5]=(T)(-c1*s2); _m[8] =(T)( c2);
741 SLMATH_LOG(
"% 3.3f % 3.3f % 3.3f", _m[0],_m[3],_m[6]);
742 SLMATH_LOG(
"% 3.3f % 3.3f % 3.3f", _m[1],_m[4],_m[7]);
743 SLMATH_LOG(
"% 3.3f % 3.3f % 3.3f", _m[2],_m[5],_m[8]);
SLMat3< SLdouble > SLMat3d
SLMat3< SLfloat > SLMat3f
3x3 matrix template class
SLMat3()
Sets identity matrix.
SLMat3< T > operator/(T a) const
scalar division
void toEulerAnglesZYX(T &zRotRAD, T &yRotRAD, T &xRotRAD)
SLMat3(const SLMat3 &A)
Sets mat by other SLMat3.
void scale(const SLVec3< T > &s)
void rotation(const T angleDEG, const SLVec3< T > &axis)
Sets the rotation components
void transpose()
Transposes the matrix.
void rotation(const T zAngleRAD, const T yAngleRAD, const T xAngleRAD)
void rotation(const T angleDEG, const T axisx, const T axisy, const T axisz)
SLMat3(const T angleXRAD, const T angleYRAD, const T angleZRAD)
Sets rotation matrix from Euler angles in radians.
T det() const
det returns the determinant
SLMat3< T > transposed() const
Returns the transposed of the matrix and leaves the itself unchanged.
SLMat3(const T scale_xyz)
Sets uniform scaling matrix.
void setMatrix(const SLMat3 &A)
SLMat3< T > operator+(const SLMat3 &A) const
void scale(const T sx, const T sy, const T sz)
Sets the scaling components.
SLMat3< T > operator-(const SLMat3 &A) const
void fromEulerAnglesZYX(const T angleZ1RAD, const T angleY2RAD, const T angleX3RAD)
SLMat3< T > & operator=(const SLMat3 &A)
SLMat3(const T angleDEG, const SLVec3< T > axis)
Sets rotate matrix.
void toAngleAxis(T &angleDEG, SLVec3< T > &axis) const
Conversion to axis and angle in radians.
void print(const SLchar *str) const
void setMatrix(const T *M)
void setMatrix(T M0, T M3, T M6, T M1, T M4, T M7, T M2, T M5, T M8)
SLMat3< T > & operator*=(const SLMat3 &A)
SLMat3< T > operator*(const SLMat3 &A) const
SLMat3(const T angleDEG, const T axis_x, const T axis_y, const T axis_z)
Sets rotate matrix from axis & angle.
void fromEulerAnglesXYZ(const T angleXRAD, const T angleYRAD, const T angleZRAD)
SLMat3< T > inverted()
Returns the inverse of the matrix and leaves itself unchanged.
void invert()
Inverts the matrix.
SLMat3< T > & operator/=(T a)
scalar division
SLMat3(const T M0, const T M3, const T M6, const T M1, const T M4, const T M7, const T M2, const T M5, const T M8)
Sets matrix by components.
void fromEulerAnglesZXZ(const T angleZ1RAD, const T angleX2RAD, const T angleZ2RAD)
static void swap(T &a, T &b)
void setMatrix(const SLMat3 *A)
void toEulerAnglesXYZ(T &xRotRAD, T &yRotRAD, T &zRotRAD)
The SLScene class represents the top level instance holding the scene structure.
3D vector template class for standard 3D vector algebra.
Utils provides utilities for string & file handling, logging and math functions.
static const float DEG2RAD
static const float RAD2DEG