Move Vectormath main
C++20 game and graphics mathematics
Loading...
Searching...
No Matches
RigidTransform3.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4
8
9namespace mv::math
10{
11 // Transform/composition equations cross-checked against RTM 2.3.1 qvf.h
12 // (MIT); Compose uses Move's explicit application-order contract.
13 template <typename T>
14 requires std::is_floating_point_v<T>
16 {
17 public:
18 using Component = T;
19
21
24 Rotation_(rotation), Translation_(translation)
25 {
26 }
27
29 {
30 return RigidTransform3();
31 }
32
34 {
35 return Rotation_;
36 }
37
39 {
40 return Translation_;
41 }
42
44 {
45 const Rotation3<T> inverseRotation = Rotation_.Inverse();
46 return RigidTransform3(
47 inverseRotation, Rotate(inverseRotation, Translation_ * T(-1)));
48 }
49
50 [[nodiscard]] friend bool operator==(
51 const RigidTransform3& left, const RigidTransform3& right) noexcept
52 {
53 return left.Rotation_ == right.Rotation_ &&
54 left.Translation_ == right.Translation_;
55 }
56
57 private:
58 Rotation3<T> Rotation_{};
59 Vec3<T> Translation_{};
60 };
61
64
65 template <typename T>
66 requires std::is_floating_point_v<T>
68 const RigidTransform3<T>& transform, const Vec3<T>& vector) noexcept
69 {
70 return Rotate(transform.Rotation(), vector);
71 }
72
73 template <typename T>
74 requires std::is_floating_point_v<T>
76 const RigidTransform3<T>& transform, const Point3<T>& point) noexcept
77 {
79 Rotate(transform.Rotation(), point.Vector()) +
80 transform.Translation());
81 }
82
83 template <typename T>
84 requires std::is_floating_point_v<T>
87 const Direction3<T>& direction) noexcept
88 {
89 return Rotate(transform.Rotation(), direction);
90 }
91
92 template <typename T>
93 requires std::is_floating_point_v<T>
95 const RigidTransform3<T>& transform, const Normal3<T>& normal) noexcept
96 {
97 return Rotate(transform.Rotation(), normal);
98 }
99
100 template <typename T>
101 requires std::is_floating_point_v<T>
104 const RigidTransform3<T>& second) noexcept
105 {
106 return RigidTransform3<T>(
107 second.Rotation() * first.Rotation(),
108 Rotate(second.Rotation(), first.Translation()) +
109 second.Translation());
110 }
111} // namespace mv::math
112
113static_assert(sizeof(mv::math::RigidTransform3f) == 32);
114static_assert(alignof(mv::math::RigidTransform3f) == 16);
115static_assert(std::is_trivially_copyable_v<mv::math::RigidTransform3f>);
116static_assert(std::is_standard_layout_v<mv::math::RigidTransform3f>);
117static_assert(sizeof(mv::math::RigidTransform3d) == 64);
118static_assert(alignof(mv::math::RigidTransform3d) == 32);
119static_assert(std::is_trivially_copyable_v<mv::math::RigidTransform3d>);
120static_assert(std::is_standard_layout_v<mv::math::RigidTransform3d>);
static Point3 FromVector(const Vec3< T > &value) noexcept
Definition Point3.hpp:28
static RigidTransform3 Identity() noexcept
const Vec3< T > & Translation() const noexcept
constexpr RigidTransform3() noexcept=default
constexpr const Rotation3< T > & Rotation() const noexcept
RigidTransform3 Inverse() const noexcept
friend bool operator==(const RigidTransform3 &left, const RigidTransform3 &right) noexcept
Vec3< T > TransformVector(const AffineTransform3< T > &transform, const Vec3< T > &vector) noexcept
RigidTransform3< float > RigidTransform3f
Normal3< T > TransformNormal(const RigidTransform3< T > &transform, const Normal3< T > &normal) noexcept
AffineTransform3< T > Compose(const AffineTransform3< T > &first, const AffineTransform3< T > &second) noexcept
Direction3< T > TransformDirection(const RigidTransform3< T > &transform, const Direction3< T > &direction) noexcept
Vec3< T > TransformPoint(const AffineTransform3< T > &transform, const Vec3< T > &point) noexcept
RigidTransform3< double > RigidTransform3d
Vec3< T > Rotate(const Rotation3< T > &rotation, const Vec3< T > &vector) noexcept