17 #ifndef IGNITION_MATH_MATRIX4_HH_ 18 #define IGNITION_MATH_MATRIX4_HH_ 25 #include <ignition/math/config.hh> 32 inline namespace IGNITION_MATH_VERSION_NAMESPACE {
48 memset(this->data, 0,
sizeof(this->data[0][0])*16);
55 memcpy(this->data, _m.data,
sizeof(this->data[0][0])*16);
75 public:
Matrix4(T _v00, T _v01, T _v02, T _v03,
76 T _v10, T _v11, T _v12, T _v13,
77 T _v20, T _v21, T _v22, T _v23,
78 T _v30, T _v31, T _v32, T _v33)
80 this->Set(_v00, _v01, _v02, _v03,
81 _v10, _v11, _v12, _v13,
82 _v20, _v21, _v22, _v23,
83 _v30, _v31, _v32, _v33);
92 this->Set(1 - 2*qt.
Y()*qt.
Y() - 2 *qt.
Z()*qt.
Z(),
93 2 * qt.
X()*qt.
Y() - 2*qt.
Z()*qt.
W(),
94 2 * qt.
X() * qt.
Z() + 2 * qt.
Y() * qt.
W(),
97 2 * qt.
X() * qt.
Y() + 2 * qt.
Z() * qt.
W(),
98 1 - 2*qt.
X()*qt.
X() - 2 * qt.
Z()*qt.
Z(),
99 2 * qt.
Y() * qt.
Z() - 2 * qt.
X() * qt.
W(),
102 2 * qt.
X() * qt.
Z() - 2 * qt.
Y() * qt.
W(),
103 2 * qt.
Y() * qt.
Z() + 2 * qt.
X() * qt.
W(),
104 1 - 2 * qt.
X()*qt.
X() - 2 * qt.
Y()*qt.
Y(),
114 this->SetTranslation(_pose.
Pos());
138 T _v00, T _v01, T _v02, T _v03,
139 T _v10, T _v11, T _v12, T _v13,
140 T _v20, T _v21, T _v22, T _v23,
141 T _v30, T _v31, T _v32, T _v33)
143 this->data[0][0] = _v00;
144 this->data[0][1] = _v01;
145 this->data[0][2] = _v02;
146 this->data[0][3] = _v03;
148 this->data[1][0] = _v10;
149 this->data[1][1] = _v11;
150 this->data[1][2] = _v12;
151 this->data[1][3] = _v13;
153 this->data[2][0] = _v20;
154 this->data[2][1] = _v21;
155 this->data[2][2] = _v22;
156 this->data[2][3] = _v23;
158 this->data[3][0] = _v30;
159 this->data[3][1] = _v31;
160 this->data[3][2] = _v32;
161 this->data[3][3] = _v33;
173 this->data[0][0] = _axis.
X()*_axis.
X()*C + c;
174 this->data[0][1] = _axis.
X()*_axis.
Y()*C - _axis.
Z()*s;
175 this->data[0][2] = _axis.
X()*_axis.
Z()*C + _axis.
Y()*s;
177 this->data[1][0] = _axis.
Y()*_axis.
X()*C + _axis.
Z()*s;
178 this->data[1][1] = _axis.
Y()*_axis.
Y()*C + c;
179 this->data[1][2] = _axis.
Y()*_axis.
Z()*C - _axis.
X()*s;
181 this->data[2][0] = _axis.
Z()*_axis.
X()*C - _axis.
Y()*s;
182 this->data[2][1] = _axis.
Z()*_axis.
Y()*C + _axis.
X()*s;
183 this->data[2][2] = _axis.
Z()*_axis.
Z()*C + c;
193 this->SetTranslation(_t);
200 this->data[0][3] = _t.
X();
201 this->data[1][3] = _t.
Y();
202 this->data[2][3] = _t.
Z();
212 Translate(T _x, T _y, T _z)
214 this->SetTranslation(_x, _y, _z);
223 this->data[0][3] = _x;
224 this->data[1][3] = _y;
225 this->data[2][3] = _z;
232 return Vector3<T>(this->data[0][3], this->data[1][3], this->data[2][3]);
239 return Vector3<T>(this->data[0][0], this->data[1][1], this->data[2][2]);
249 T trace = this->data[0][0] + this->data[1][1] + this->data[2][2];
253 root = sqrt(trace + 1.0);
255 root = 1.0 / (2.0 * root);
256 q.
X((this->data[2][1] - this->data[1][2]) * root);
257 q.
Y((this->data[0][2] - this->data[2][0]) * root);
258 q.
Z((this->data[1][0] - this->data[0][1]) * root);
262 static unsigned int s_iNext[3] = {1, 2, 0};
264 if (this->data[1][1] > this->data[0][0])
266 if (this->data[2][2] > this->data[i][i])
268 unsigned int j = s_iNext[i];
269 unsigned int k = s_iNext[j];
271 root = sqrt(this->data[i][i] - this->data[j][j] -
272 this->data[k][k] + 1.0);
276 root = 1.0 / (2.0 * root);
277 b = (this->data[j][i] + this->data[i][j]) * root;
278 c = (this->data[k][i] + this->data[i][k]) * root;
283 case 0: q.
X(a);
break;
284 case 1: q.
Y(a);
break;
285 case 2: q.
Z(a);
break;
290 case 0: q.
X(b);
break;
291 case 1: q.
Y(b);
break;
292 case 2: q.
Z(b);
break;
297 case 0: q.
X(c);
break;
298 case 1: q.
Y(c);
break;
299 case 2: q.
Z(c);
break;
302 q.
W((this->data[k][j] - this->data[j][k]) * root);
317 T m31 = this->data[2][0];
318 T m11 = this->data[0][0];
319 T m12 = this->data[0][1];
320 T m13 = this->data[0][2];
321 T m32 = this->data[2][1];
322 T m33 = this->data[2][2];
323 T m21 = this->data[1][0];
325 if (std::abs(m31) >= 1.0)
334 euler.
X(atan2(m12, m13));
335 euler2.
X(atan2(m12, m13));
341 euler.
X(atan2(-m12, -m13));
342 euler2.
X(atan2(-m12, -m13));
350 euler.
X(atan2(m32 / cos(euler.
Y()), m33 / cos(euler.
Y())));
351 euler2.
X(atan2(m32 / cos(euler2.
Y()), m33 / cos(euler2.
Y())));
353 euler.
Z(atan2(m21 / cos(euler.
Y()), m11 / cos(euler.
Y())));
354 euler2.
Z(atan2(m21 / cos(euler2.
Y()), m11 / cos(euler2.
Y())));
367 return Pose3<T>(this->Translation(), this->Rotation());
374 this->data[0][0] = _s.
X();
375 this->data[1][1] = _s.
Y();
376 this->data[2][2] = _s.
Z();
377 this->data[3][3] = 1.0;
384 public:
void Scale(T _x, T _y, T _z)
386 this->data[0][0] = _x;
387 this->data[1][1] = _y;
388 this->data[2][2] = _z;
389 this->data[3][3] = 1.0;
396 return equal(this->data[3][0], static_cast<T>(0)) &&
397 equal(this->data[3][1], static_cast<T>(0)) &&
398 equal(this->data[3][2], static_cast<T>(0)) &&
399 equal(this->data[3][3], static_cast<T>(1));
412 if (this->IsAffine())
414 return Vector3<T>(this->data[0][0]*_v.X() + this->data[0][1]*_v.Y() +
415 this->data[0][2]*_v.Z() + this->data[0][3],
416 this->data[1][0]*_v.X() + this->data[1][1]*_v.Y() +
417 this->data[1][2]*_v.Z() + this->data[1][3],
418 this->data[2][0]*_v.X() + this->data[2][1]*_v.Y() +
419 this->data[2][2]*_v.Z() + this->data[2][3]);
435 if (!this->IsAffine())
438 _result.
Set(this->data[0][0]*_v.
X() + this->data[0][1]*_v.
Y() +
439 this->data[0][2]*_v.
Z() + this->data[0][3],
440 this->data[1][0]*_v.
X() + this->data[1][1]*_v.
Y() +
441 this->data[1][2]*_v.
Z() + this->data[1][3],
442 this->data[2][0]*_v.
X() + this->data[2][1]*_v.
Y() +
443 this->data[2][2]*_v.
Z() + this->data[2][3]);
451 T v0, v1, v2, v3, v4, v5, t00, t10, t20, t30;
453 v0 = this->data[2][0]*this->data[3][1]
454 - this->data[2][1]*this->data[3][0];
455 v1 = this->data[2][0]*this->data[3][2]
456 - this->data[2][2]*this->data[3][0];
457 v2 = this->data[2][0]*this->data[3][3]
458 - this->data[2][3]*this->data[3][0];
459 v3 = this->data[2][1]*this->data[3][2]
460 - this->data[2][2]*this->data[3][1];
461 v4 = this->data[2][1]*this->data[3][3]
462 - this->data[2][3]*this->data[3][1];
463 v5 = this->data[2][2]*this->data[3][3]
464 - this->data[2][3]*this->data[3][2];
466 t00 = v5*this->data[1][1] - v4*this->data[1][2] + v3*this->data[1][3];
467 t10 = -v5*this->data[1][0] + v2*this->data[1][2] - v1*this->data[1][3];
468 t20 = v4*this->data[1][0] - v2*this->data[1][1] + v0*this->data[1][3];
469 t30 = -v3*this->data[1][0] + v1*this->data[1][1] - v0*this->data[1][2];
471 return t00 * this->data[0][0]
472 + t10 * this->data[0][1]
473 + t20 * this->data[0][2]
474 + t30 * this->data[0][3];
482 T v0, v1, v2, v3, v4, v5, t00, t10, t20, t30;
485 v0 = this->data[2][0]*this->data[3][1] -
486 this->data[2][1]*this->data[3][0];
487 v1 = this->data[2][0]*this->data[3][2] -
488 this->data[2][2]*this->data[3][0];
489 v2 = this->data[2][0]*this->data[3][3] -
490 this->data[2][3]*this->data[3][0];
491 v3 = this->data[2][1]*this->data[3][2] -
492 this->data[2][2]*this->data[3][1];
493 v4 = this->data[2][1]*this->data[3][3] -
494 this->data[2][3]*this->data[3][1];
495 v5 = this->data[2][2]*this->data[3][3] -
496 this->data[2][3]*this->data[3][2];
498 t00 = +(v5*this->data[1][1] -
499 v4*this->data[1][2] + v3*this->data[1][3]);
500 t10 = -(v5*this->data[1][0] -
501 v2*this->data[1][2] + v1*this->data[1][3]);
502 t20 = +(v4*this->data[1][0] -
503 v2*this->data[1][1] + v0*this->data[1][3]);
504 t30 = -(v3*this->data[1][0] -
505 v1*this->data[1][1] + v0*this->data[1][2]);
507 T invDet = 1 / (t00 * this->data[0][0] + t10 * this->data[0][1] +
508 t20 * this->data[0][2] + t30 * this->data[0][3]);
510 r(0, 0) = t00 * invDet;
511 r(1, 0) = t10 * invDet;
512 r(2, 0) = t20 * invDet;
513 r(3, 0) = t30 * invDet;
515 r(0, 1) = -(v5*this->data[0][1] -
516 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
517 r(1, 1) = +(v5*this->data[0][0] -
518 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
519 r(2, 1) = -(v4*this->data[0][0] -
520 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
521 r(3, 1) = +(v3*this->data[0][0] -
522 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
524 v0 = this->data[1][0]*this->data[3][1] -
525 this->data[1][1]*this->data[3][0];
526 v1 = this->data[1][0]*this->data[3][2] -
527 this->data[1][2]*this->data[3][0];
528 v2 = this->data[1][0]*this->data[3][3] -
529 this->data[1][3]*this->data[3][0];
530 v3 = this->data[1][1]*this->data[3][2] -
531 this->data[1][2]*this->data[3][1];
532 v4 = this->data[1][1]*this->data[3][3] -
533 this->data[1][3]*this->data[3][1];
534 v5 = this->data[1][2]*this->data[3][3] -
535 this->data[1][3]*this->data[3][2];
537 r(0, 2) = +(v5*this->data[0][1] -
538 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
539 r(1, 2) = -(v5*this->data[0][0] -
540 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
541 r(2, 2) = +(v4*this->data[0][0] -
542 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
543 r(3, 2) = -(v3*this->data[0][0] -
544 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
546 v0 = this->data[2][1]*this->data[1][0] -
547 this->data[2][0]*this->data[1][1];
548 v1 = this->data[2][2]*this->data[1][0] -
549 this->data[2][0]*this->data[1][2];
550 v2 = this->data[2][3]*this->data[1][0] -
551 this->data[2][0]*this->data[1][3];
552 v3 = this->data[2][2]*this->data[1][1] -
553 this->data[2][1]*this->data[1][2];
554 v4 = this->data[2][3]*this->data[1][1] -
555 this->data[2][1]*this->data[1][3];
556 v5 = this->data[2][3]*this->data[1][2] -
557 this->data[2][2]*this->data[1][3];
559 r(0, 3) = -(v5*this->data[0][1] -
560 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
561 r(1, 3) = +(v5*this->data[0][0] -
562 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
563 r(2, 3) = -(v4*this->data[0][0] -
564 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
565 r(3, 3) = +(v3*this->data[0][0] -
566 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
574 std::swap(this->data[0][1], this->data[1][0]);
575 std::swap(this->data[0][2], this->data[2][0]);
576 std::swap(this->data[0][3], this->data[3][0]);
577 std::swap(this->data[1][2], this->data[2][1]);
578 std::swap(this->data[1][3], this->data[3][1]);
579 std::swap(this->data[2][3], this->data[3][2]);
587 this->data[0][0], this->data[1][0], this->data[2][0], this->data[3][0],
588 this->data[0][1], this->data[1][1], this->data[2][1], this->data[3][1],
589 this->data[0][2], this->data[1][2], this->data[2][2], this->data[3][2],
590 this->data[0][3], this->data[1][3], this->data[2][3], this->data[3][3]);
598 memcpy(this->data, _mat.data,
sizeof(this->data[0][0])*16);
607 this->data[0][0] = _mat(0, 0);
608 this->data[0][1] = _mat(0, 1);
609 this->data[0][2] = _mat(0, 2);
611 this->data[1][0] = _mat(1, 0);
612 this->data[1][1] = _mat(1, 1);
613 this->data[1][2] = _mat(1, 2);
615 this->data[2][0] = _mat(2, 0);
616 this->data[2][1] = _mat(2, 1);
617 this->data[2][2] = _mat(2, 2);
628 this->data[0][0] * _m2(0, 0) +
629 this->data[0][1] * _m2(1, 0) +
630 this->data[0][2] * _m2(2, 0) +
631 this->data[0][3] * _m2(3, 0),
633 this->data[0][0] * _m2(0, 1) +
634 this->data[0][1] * _m2(1, 1) +
635 this->data[0][2] * _m2(2, 1) +
636 this->data[0][3] * _m2(3, 1),
638 this->data[0][0] * _m2(0, 2) +
639 this->data[0][1] * _m2(1, 2) +
640 this->data[0][2] * _m2(2, 2) +
641 this->data[0][3] * _m2(3, 2),
643 this->data[0][0] * _m2(0, 3) +
644 this->data[0][1] * _m2(1, 3) +
645 this->data[0][2] * _m2(2, 3) +
646 this->data[0][3] * _m2(3, 3),
648 this->data[1][0] * _m2(0, 0) +
649 this->data[1][1] * _m2(1, 0) +
650 this->data[1][2] * _m2(2, 0) +
651 this->data[1][3] * _m2(3, 0),
653 this->data[1][0] * _m2(0, 1) +
654 this->data[1][1] * _m2(1, 1) +
655 this->data[1][2] * _m2(2, 1) +
656 this->data[1][3] * _m2(3, 1),
658 this->data[1][0] * _m2(0, 2) +
659 this->data[1][1] * _m2(1, 2) +
660 this->data[1][2] * _m2(2, 2) +
661 this->data[1][3] * _m2(3, 2),
663 this->data[1][0] * _m2(0, 3) +
664 this->data[1][1] * _m2(1, 3) +
665 this->data[1][2] * _m2(2, 3) +
666 this->data[1][3] * _m2(3, 3),
668 this->data[2][0] * _m2(0, 0) +
669 this->data[2][1] * _m2(1, 0) +
670 this->data[2][2] * _m2(2, 0) +
671 this->data[2][3] * _m2(3, 0),
673 this->data[2][0] * _m2(0, 1) +
674 this->data[2][1] * _m2(1, 1) +
675 this->data[2][2] * _m2(2, 1) +
676 this->data[2][3] * _m2(3, 1),
678 this->data[2][0] * _m2(0, 2) +
679 this->data[2][1] * _m2(1, 2) +
680 this->data[2][2] * _m2(2, 2) +
681 this->data[2][3] * _m2(3, 2),
683 this->data[2][0] * _m2(0, 3) +
684 this->data[2][1] * _m2(1, 3) +
685 this->data[2][2] * _m2(2, 3) +
686 this->data[2][3] * _m2(3, 3),
688 this->data[3][0] * _m2(0, 0) +
689 this->data[3][1] * _m2(1, 0) +
690 this->data[3][2] * _m2(2, 0) +
691 this->data[3][3] * _m2(3, 0),
693 this->data[3][0] * _m2(0, 1) +
694 this->data[3][1] * _m2(1, 1) +
695 this->data[3][2] * _m2(2, 1) +
696 this->data[3][3] * _m2(3, 1),
698 this->data[3][0] * _m2(0, 2) +
699 this->data[3][1] * _m2(1, 2) +
700 this->data[3][2] * _m2(2, 2) +
701 this->data[3][3] * _m2(3, 2),
703 this->data[3][0] * _m2(0, 3) +
704 this->data[3][1] * _m2(1, 3) +
705 this->data[3][2] * _m2(2, 3) +
706 this->data[3][3] * _m2(3, 3));
715 this->data[0][0]*_vec.
X() + this->data[0][1]*_vec.
Y() +
716 this->data[0][2]*_vec.
Z() + this->data[0][3],
717 this->data[1][0]*_vec.
X() + this->data[1][1]*_vec.
Y() +
718 this->data[1][2]*_vec.
Z() + this->data[1][3],
719 this->data[2][0]*_vec.
X() + this->data[2][1]*_vec.
Y() +
720 this->data[2][2]*_vec.
Z() + this->data[2][3]);
730 const size_t _col)
const 743 public:
inline T &
operator()(
const size_t _row,
const size_t _col)
756 return equal<T>(this->data[0][0], _m(0, 0), _tol)
757 && equal<T>(this->data[0][1], _m(0, 1), _tol)
758 && equal<T>(this->data[0][2], _m(0, 2), _tol)
759 && equal<T>(this->data[0][3], _m(0, 3), _tol)
760 && equal<T>(this->data[1][0], _m(1, 0), _tol)
761 && equal<T>(this->data[1][1], _m(1, 1), _tol)
762 && equal<T>(this->data[1][2], _m(1, 2), _tol)
763 && equal<T>(this->data[1][3], _m(1, 3), _tol)
764 && equal<T>(this->data[2][0], _m(2, 0), _tol)
765 && equal<T>(this->data[2][1], _m(2, 1), _tol)
766 && equal<T>(this->data[2][2], _m(2, 2), _tol)
767 && equal<T>(this->data[2][3], _m(2, 3), _tol)
768 && equal<T>(this->data[3][0], _m(3, 0), _tol)
769 && equal<T>(this->data[3][1], _m(3, 1), _tol)
770 && equal<T>(this->data[3][2], _m(3, 2), _tol)
771 && equal<T>(this->data[3][3], _m(3, 3), _tol);
780 return this->Equal(_m, static_cast<T>(1e-6));
788 return !(*
this == _m);
826 _in.
setf(std::ios_base::skipws);
828 _in >> d[0] >> d[1] >> d[2] >> d[3]
829 >> d[4] >> d[5] >> d[6] >> d[7]
830 >> d[8] >> d[9] >> d[10] >> d[11]
831 >> d[12] >> d[13] >> d[14] >> d[15];
833 _m.
Set(d[0], d[1], d[2], d[3],
834 d[4], d[5], d[6], d[7],
835 d[8], d[9], d[10], d[11],
836 d[12], d[13], d[14], d[15]);
853 auto front = _target - _eye;
874 auto left = up.Cross(front);
883 up = (front.Cross(left)).Normalize();
886 front.X(), left.X(), up.X(), _eye.X(),
887 front.Y(), left.Y(), up.Y(), _eye.Y(),
888 front.Z(), left.Z(), up.Z(), _eye.Z(),
893 private: T data[4][4];
const Matrix4< T > & operator=(const Matrix3< T > &_mat)
Equal operator for 3x3 matrix.
Definition: Matrix4.hh:605
void SetTranslation(T _x, T _y, T _z)
Set the translational values [ (0, 3) (1, 3) (2, 3) ].
Definition: Matrix4.hh:221
const T & W() const
Get the w component.
Definition: Quaternion.hh:949
Matrix4< T > Transposed() const
Return the transpose of this matrix.
Definition: Matrix4.hh:584
void Set(T _x=0, T _y=0, T _z=0)
Set the contents of the vector.
Definition: Vector3.hh:179
static const Matrix4< T > Zero
Zero matrix.
Definition: Matrix4.hh:43
const T & Z() const
Get the z component.
Definition: Quaternion.hh:970
T precision(const T &_a, const unsigned int &_precision)
get value at a specified precision
Definition: Helpers.hh:580
static const static double const static double const static double const static double const static float const static float const static float const static float const static uint16_t const static uint16_t const static uint16_t const static uint16_t const static int16_t const static int16_t const static int16_t const static int16_t const static uint32_t const static uint32_t const static uint32_t const static uint32_t const static int32_t const static int32_t const static int32_t const static int32_t const static uint64_t const static uint64_t const static uint64_t const static uint64_t const static int64_t const static int64_t const static int64_t const int64_t T clamp(T _v, T _min, T _max)
Simple clamping function.
Definition: Helpers.hh:396
bool Equal(const Matrix4 &_m, const T &_tol) const
Equality test with tolerance.
Definition: Matrix4.hh:754
Quaternion< T > Rotation() const
Get the rotation as a quaternion.
Definition: Matrix4.hh:244
Vector3< T > Translation() const
Get the translational values as a Vector3.
Definition: Matrix4.hh:230
void Normalize()
Normalize the quaternion.
Definition: Quaternion.hh:224
Vector3< T > operator*(const Vector3< T > &_vec) const
Multiplication operator.
Definition: Matrix4.hh:712
void Scale(T _x, T _y, T _z)
Set the scale.
Definition: Matrix4.hh:384
Matrix4< int > Matrix4i
Definition: Matrix4.hh:910
Encapsulates a position and rotation in three space.
Definition: Pose3.hh:34
void Scale(const Vector3< T > &_s)
Set the scale.
Definition: Matrix4.hh:372
const T & operator()(const size_t _row, const size_t _col) const
Get the value at the specified row, column index.
Definition: Matrix4.hh:729
bool operator!=(const Matrix4< T > &_m) const
Inequality test operator.
Definition: Matrix4.hh:786
virtual ~Matrix4()
Destructor.
Definition: Matrix4.hh:118
const T & X() const
Get the x component.
Definition: Quaternion.hh:956
Vector3< T > Scale() const
Get the scale values as a Vector3<T>
Definition: Matrix4.hh:237
A 4x4 matrix class.
Definition: Matrix4.hh:37
Matrix4()
Constructor.
Definition: Matrix4.hh:46
bool equal(const T &_a, const T &_b, const T &_epsilon=T(1e-6))
check if two values are equal, within a tolerance
Definition: Helpers.hh:546
void Set(T _v00, T _v01, T _v02, T _v03, T _v10, T _v11, T _v12, T _v13, T _v20, T _v21, T _v22, T _v23, T _v30, T _v31, T _v32, T _v33)
Change the values.
Definition: Matrix4.hh:137
const T & Y() const
Get the y component.
Definition: Quaternion.hh:963
T X() const
Get the x value.
Definition: Vector3.hh:648
T Z() const
Get the z value.
Definition: Vector3.hh:662
bool operator==(const Matrix4< T > &_m) const
Equality operator.
Definition: Matrix4.hh:778
Matrix4(const Matrix4< T > &_m)
Copy constructor.
Definition: Matrix4.hh:53
T Y() const
Get the y value.
Definition: Vector3.hh:655
Matrix4< float > Matrix4f
Definition: Matrix4.hh:912
friend std::ostream & operator<<(std::ostream &_out, const Matrix4< T > &_m)
Stream insertion operator.
Definition: Matrix4.hh:795
Matrix4< double > Matrix4d
Definition: Matrix4.hh:911
A 3x3 matrix class.
Definition: Matrix3.hh:39
Matrix4(const Quaternion< T > &_q)
Construct Matrix4 from a quaternion.
Definition: Matrix4.hh:88
T & operator()(const size_t _row, const size_t _col)
Get a mutable version the value at the specified row, column index.
Definition: Matrix4.hh:743
static const size_t IGN_ZERO_SIZE_T
size_t type with a value of 0
Definition: Helpers.hh:217
void Axis(const Vector3< T > &_axis, T _angle)
Set the upper-left 3x3 matrix from an axis and angle.
Definition: Matrix4.hh:167
friend std::istream & operator>>(std::istream &_in, Matrix4< T > &_m)
Stream extraction operator.
Definition: Matrix4.hh:822
bool IsAffine() const
Return true if the matrix is affine.
Definition: Matrix4.hh:394
Matrix4< T > Inverse() const
Return the inverse matrix. This is a non-destructive operation.
Definition: Matrix4.hh:480
Vector3 Normalize()
Normalize the vector length.
Definition: Vector3.hh:133
void SetTranslation(const Vector3< T > &_t)
Set the translational values [ (0, 3) (1, 3) (2, 3) ].
Definition: Matrix4.hh:198
Matrix4< T > operator*(const Matrix4< T > &_m2) const
Multiplication operator.
Definition: Matrix4.hh:625
Matrix4(const Pose3< T > &_pose)
Construct Matrix4 from a math::Pose3.
Definition: Matrix4.hh:112
The Vector3 class represents the generic vector containing 3 elements. Since it's commonly used to ke...
Definition: Vector3.hh:40
Pose3< T > Pose() const
Get the transformation as math::Pose.
Definition: Matrix4.hh:365
Matrix4(T _v00, T _v01, T _v02, T _v03, T _v10, T _v11, T _v12, T _v13, T _v20, T _v21, T _v22, T _v23, T _v30, T _v31, T _v32, T _v33)
Constructor.
Definition: Matrix4.hh:75
const Vector3< T > & Pos() const
Get the position.
Definition: Pose3.hh:349
void Transpose()
Transpose this matrix.
Definition: Matrix4.hh:572
Matrix4< T > & operator=(const Matrix4< T > &_mat)
Equal operator. this = _mat.
Definition: Matrix4.hh:596
static const size_t IGN_THREE_SIZE_T
size_t type with a value of 3
Definition: Helpers.hh:226
static const Matrix4< T > Identity
Identity matrix.
Definition: Matrix4.hh:40
bool TransformAffine(const Vector3< T > &_v, Vector3< T > &_result) const
Perform an affine transformation.
Definition: Matrix4.hh:432
A quaternion class.
Definition: Matrix3.hh:34
#define IGN_PI
Define IGN_PI, IGN_PI_2, and IGN_PI_4. This was put here for Windows support.
Definition: Helpers.hh:174
static Matrix4< T > LookAt(const Vector3< T > &_eye, const Vector3< T > &_target, const Vector3< T > &_up=Vector3< T >::UnitZ)
Get transform which translates to _eye and rotates the X axis so it faces the _target. The rotation is such that Z axis is in the _up direction, if possible. The coordinate system is right-handed,.
Definition: Matrix4.hh:849
T Determinant() const
Return the determinant of the matrix.
Definition: Matrix4.hh:449
Vector3< T > EulerRotation(bool _firstSolution) const
Get the rotation as a Euler angles.
Definition: Matrix4.hh:312