pub struct Transform3D<T>{ /* private fields */ }Expand description
Transform3D represents a 3D transformation (rotation + translation) When the glam feature is enabled, it uses glam’s optimized types internally
Implementations§
Source§impl Transform3D<f32>
impl Transform3D<f32>
Sourcepub const fn identity() -> Transform3D<f32>
pub const fn identity() -> Transform3D<f32>
Creates the identity transform during const evaluation.
Sourcepub const fn from_translation_euler_xyz(
translation: [Length; 3],
rotation: [Angle; 3],
) -> Transform3D<f32>
pub const fn from_translation_euler_xyz( translation: [Length; 3], rotation: [Angle; 3], ) -> Transform3D<f32>
Creates a transform from unit-typed translation and XYZ Euler angles.
rotation is [roll_x, pitch_y, yaw_z]. Rotations are applied X, then Y, then Z,
producing Rz * Ry * Rx for column vectors. Translation is applied last.
Const unit values use their SI base representation: meters and radians.
Sourcepub const fn compose(self, rhs: Transform3D<f32>) -> Transform3D<f32>
pub const fn compose(self, rhs: Transform3D<f32>) -> Transform3D<f32>
Composes self with rhs during const evaluation.
The returned transform applies rhs first and then self, matching self * rhs.
Source§impl Transform3D<f64>
impl Transform3D<f64>
Sourcepub const fn identity() -> Transform3D<f64>
pub const fn identity() -> Transform3D<f64>
Creates the identity transform during const evaluation.
Sourcepub const fn from_translation_euler_xyz(
translation: [Length; 3],
rotation: [Angle; 3],
) -> Transform3D<f64>
pub const fn from_translation_euler_xyz( translation: [Length; 3], rotation: [Angle; 3], ) -> Transform3D<f64>
Creates a transform from unit-typed translation and XYZ Euler angles.
rotation is [roll_x, pitch_y, yaw_z]. Rotations are applied X, then Y, then Z,
producing Rz * Ry * Rx for column vectors. Translation is applied last.
Const unit values use their SI base representation: meters and radians.
Sourcepub const fn compose(self, rhs: Transform3D<f64>) -> Transform3D<f64>
pub const fn compose(self, rhs: Transform3D<f64>) -> Transform3D<f64>
Composes self with rhs during const evaluation.
The returned transform applies rhs first and then self, matching self * rhs.
Source§impl<T> Transform3D<T>
impl<T> Transform3D<T>
Sourcepub fn from_matrix(mat: [[T; 4]; 4]) -> Transform3D<T>
pub fn from_matrix(mat: [[T; 4]; 4]) -> Transform3D<T>
Creates a homogeneous 4x4 transform indexed as mat[row][column].
Each inner array is a row; points are column vectors (p_out = mat * p_in).
Translation is [mat[0][3], mat[1][3], mat[2][3]]; the last row must be [0, 0, 0, 1].
The convention is backend-independent: callers must not transpose for glam.
Glam/Rerun adapters repack into columns internally; the fallback stores rows directly.
Nalgebra/faer adapters copy by (row, column), independent of storage order.
Examples found in repository?
6fn main() {
7 println!("Cu Transform - CuMsg Pattern Demo");
8 println!("=================================");
9 println!();
10
11 // Create a transform tree
12 let mut tree = TransformTree::<f32>::new();
13 let clock = RobotClock::default();
14
15 // Create transforms using the new CuMsg pattern
16 println!("Creating transforms with CuMsg...");
17
18 // World to base transform
19 let transform1 = Transform3D::from_matrix([
20 [1.0f32, 0.0, 0.0, 0.0], // Column-major: each inner array is a column
21 [0.0, 1.0, 0.0, 0.0],
22 [0.0, 0.0, 1.0, 0.0],
23 [1.0, 0.0, 0.0, 1.0], // Translation (1, 0, 0)
24 ]);
25
26 let frame_transform = FrameTransform::new(
27 transform1,
28 FrameIdString::from("world").expect("Frame name too long"),
29 FrameIdString::from("base").expect("Frame name too long"),
30 );
31 let mut sft = StampedFrameTransform::new(Some(frame_transform));
32 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
33
34 // Add to tree using the new API
35 tree.add_transform(&sft).expect("Failed to add transform");
36 println!(" Added world->base transform at t=1s");
37
38 // Base to arm transform
39 let transform2 = Transform3D::from_matrix([
40 [0.0, 1.0, 0.0, 0.0], // 90-degree rotation around Z
41 [-1.0, 0.0, 0.0, 0.0],
42 [0.0, 0.0, 1.0, 0.0],
43 [0.5, 0.0, 0.0, 1.0], // Translation (0.5, 0, 0)
44 ]);
45
46 let msg2 = FrameTransform::new(
47 transform2,
48 FrameIdString::from("base").expect("Frame name too long"),
49 FrameIdString::from("arm").expect("Frame name too long"),
50 );
51 let mut sft = StampedFrameTransform::new(Some(msg2));
52 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
53
54 tree.add_transform(&sft).expect("Failed to add transform");
55 println!(" Added base->arm transform at t=1s");
56
57 // Demonstrate using time ranges for a broadcast
58 println!("\nBroadcasting multiple transforms with time range...");
59
60 // Create multiple transforms at different times
61 let times = [
62 CuTime::from_nanos(2_000_000_000), // 2 seconds
63 CuTime::from_nanos(2_100_000_000), // 2.1 seconds
64 CuTime::from_nanos(2_200_000_000),
65 ];
66
67 for (i, &time) in times.iter().enumerate() {
68 let x_translation = 1.0 + (i as f32) * 0.1;
69 let transform = Transform3D::from_matrix([
70 [1.0, 0.0, 0.0, 0.0],
71 [0.0, 1.0, 0.0, 0.0],
72 [0.0, 0.0, 1.0, 0.0],
73 [x_translation, 0.0, 0.0, 1.0],
74 ]);
75
76 let msg = FrameTransform::new(
77 transform,
78 FrameIdString::from("world").expect("Frame name too long"),
79 FrameIdString::from("base").expect("Frame name too long"),
80 );
81 let mut sft = StampedFrameTransform::new(Some(msg));
82
83 // For a broadcast with multiple transforms, use Range
84 if i == 0 {
85 sft.tov = Tov::Range(cu29::clock::CuTimeRange {
86 start: times[0],
87 end: *times.last().unwrap(),
88 });
89 } else {
90 sft.tov = Tov::Time(time);
91 }
92
93 tree.add_transform(&sft).expect("Failed to add transform");
94 }
95
96 println!(" Added 3 transforms with time range 2.0s - 2.2s");
97
98 // Query the tree
99 println!("\nQuerying transforms...");
100
101 let result = tree.lookup_transform("world", "arm", CuTime::from_nanos(1_000_000_000), &clock);
102 match result {
103 Ok(transform) => {
104 let mat = transform.to_matrix();
105 println!(
106 " World->arm at t=1s: translation=({:.2}, {:.2}, {:.2})",
107 mat[0][3], mat[1][3], mat[2][3]
108 );
109 }
110 Err(e) => println!(" Error: {e}"),
111 }
112
113 // Query velocity (requires transforms at multiple times)
114 let velocity = tree.lookup_velocity("world", "base", CuTime::from_nanos(2_100_000_000), &clock);
115 match velocity {
116 Ok(vel) => {
117 println!(
118 " World->base velocity at t=2.1s: linear=({:.2}, {:.2}, {:.2}) m/s",
119 vel.linear[0], vel.linear[1], vel.linear[2]
120 );
121 }
122 Err(e) => println!(" Error computing velocity: {e}"),
123 }
124
125 println!("\nKey advantages of CuMsg pattern:");
126 println!("- Integrates with Copper message system");
127 println!("- Timestamps handled by CuMsg metadata (Tov)");
128 println!("- Supports time ranges for broadcasts");
129}More examples
9fn main() {
10 // Example using the typed transform approach
11 println!("Cu Transform - New Typed Approach Demo");
12 println!("=====================================");
13
14 // Create a buffer for world -> robot transforms
15 let mut world_to_robot_buffer: TypedTransformBuffer<f32, WorldFrame, RobotFrame, 10> =
16 TypedTransformBuffer::new();
17
18 // Create a transform message
19 let transform = Transform3D::from_matrix([
20 [1.0, 0.0, 0.0, 1.0], // X translation
21 [0.0, 1.0, 0.0, 2.0], // Y translation
22 [0.0, 0.0, 1.0, 0.0],
23 [0.0, 0.0, 0.0, 1.0],
24 ]);
25
26 let world_to_robot_msg = TypedTransform::new(transform, CuTime::from_nanos(1000));
27
28 println!(
29 "Created transform from {} to {}",
30 world_to_robot_msg.parent_name(),
31 world_to_robot_msg.child_name()
32 );
33 if let Some(t) = world_to_robot_msg.transform() {
34 let mat = t.to_matrix();
35 println!(
36 " Translation: [{}, {}, {}]",
37 mat[0][3], mat[1][3], mat[2][3]
38 );
39 }
40
41 // Add to buffer
42 world_to_robot_buffer.add_transform(world_to_robot_msg);
43
44 // Create second transform
45 let transform2 = Transform3D::from_matrix([
46 [1.0, 0.0, 0.0, 2.0], // X translation
47 [0.0, 1.0, 0.0, 4.0], // Y translation
48 [0.0, 0.0, 1.0, 0.0],
49 [0.0, 0.0, 0.0, 1.0],
50 ]);
51
52 let world_to_robot_msg2 = TypedTransform::new(transform2, CuTime::from_nanos(2000));
53 world_to_robot_buffer.add_transform(world_to_robot_msg2);
54
55 // Query the buffer
56 if let Some(latest) = world_to_robot_buffer.get_latest_transform() {
57 println!(
58 "\nLatest transform at time {}:",
59 latest.timestamp().unwrap().as_nanos()
60 );
61 if let Some(t) = latest.transform() {
62 let mat = t.to_matrix();
63 println!(
64 " Translation: [{}, {}, {}]",
65 mat[0][3], mat[1][3], mat[2][3]
66 );
67 }
68 }
69
70 // Query closest to a specific time
71 if let Some(closest) = world_to_robot_buffer.get_closest_transform(CuTime::from_nanos(1500)) {
72 println!("\nClosest transform to time 1500:");
73 println!(" Actual time: {}", closest.timestamp().unwrap().as_nanos());
74 if let Some(t) = closest.transform() {
75 let mat = t.to_matrix();
76 println!(
77 " Translation: [{}, {}, {}]",
78 mat[0][3], mat[1][3], mat[2][3]
79 );
80 }
81 }
82
83 // Demonstrate time range
84 if let Some(range) = world_to_robot_buffer.get_time_range() {
85 println!(
86 "\nTime range: {} to {}",
87 range.start.as_nanos(),
88 range.end.as_nanos()
89 );
90 }
91
92 // Demonstrate velocity computation
93 if let Some(latest) = world_to_robot_buffer.get_latest_transform()
94 && let Some(closest) = world_to_robot_buffer.get_closest_transform(CuTime::from_nanos(1000))
95 && let Some(velocity) = latest.compute_velocity(closest)
96 {
97 println!("\nVelocity computation:");
98 println!(
99 " Linear velocity: [{}, {}, {}]",
100 velocity.linear[0], velocity.linear[1], velocity.linear[2]
101 );
102 }
103
104 // Demonstrate the stringly typed version of the API.
105 println!("\n\nConstant-Size Buffer Demo");
106 println!("===========================================");
107
108 let mut const_buffer: ConstTransformBuffer<f32, 5> = ConstTransformBuffer::new();
109
110 // Add some stamped transforms
111 let stamped_transform = StampedTransform {
112 transform,
113 stamp: CuTime::from_nanos(1000),
114 parent_frame: "world".try_into().unwrap(),
115 child_frame: "robot".try_into().unwrap(),
116 };
117
118 const_buffer.add_transform(stamped_transform);
119
120 if let Some(latest_stamped) = const_buffer.get_latest_transform() {
121 println!("Latest transform in constant buffer:");
122 println!(
123 " From: {} to: {}",
124 latest_stamped.parent_frame, latest_stamped.child_frame
125 );
126 println!(" Time: {}", latest_stamped.stamp.as_nanos());
127 let mat = latest_stamped.transform.to_matrix();
128 println!(
129 " Translation: [{}, {}, {}]",
130 mat[0][3], mat[1][3], mat[2][3]
131 );
132 }
133
134 println!("\nThis buffer is stack-allocated with capacity 5 - no heap allocation!");
135
136 // Demonstrate the StampedFrameTransform pattern with TransformTree
137 println!("\n\nStampedFrameTransform Pattern Demo");
138 println!("================================");
139
140 let mut tree = TransformTree::<f32>::new();
141
142 // Create a CuMsg with TransformMsg
143 let frame_transform = FrameTransform::new(
144 transform,
145 FrameIdString::from("world").expect("Frame name too long"),
146 FrameIdString::from("robot").expect("Frame name too long"),
147 );
148
149 let mut sft = StampedFrameTransform::new(Some(frame_transform));
150 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
151
152 // Add using the new API
153 tree.add_transform(&sft).expect("Failed to add transform");
154 println!("Added transform using CuMsg<TransformMsg> pattern");
155
156 // Query the transform
157 let robot_clock = cu29::clock::RobotClock::default();
158 let result = tree.lookup_transform(
159 "world",
160 "robot",
161 CuTime::from_nanos(1_000_000_000),
162 &robot_clock,
163 );
164
165 match result {
166 Ok(transform) => {
167 let mat = transform.to_matrix();
168 println!(
169 "Retrieved transform: translation=({:.2}, {:.2}, {:.2})",
170 mat[0][3], mat[1][3], mat[2][3]
171 );
172 }
173 Err(e) => println!("Error: {e}"),
174 }
175}Sourcepub fn to_matrix(self) -> [[T; 4]; 4]
pub fn to_matrix(self) -> [[T; 4]; 4]
Returns a homogeneous 4x4 matrix indexed as mat[row][column].
Each inner array is a row, with translation in the last column, regardless of backend.
Uses the same column-vector convention as Self::from_matrix.
Examples found in repository?
6fn main() {
7 println!("Cu Transform - CuMsg Pattern Demo");
8 println!("=================================");
9 println!();
10
11 // Create a transform tree
12 let mut tree = TransformTree::<f32>::new();
13 let clock = RobotClock::default();
14
15 // Create transforms using the new CuMsg pattern
16 println!("Creating transforms with CuMsg...");
17
18 // World to base transform
19 let transform1 = Transform3D::from_matrix([
20 [1.0f32, 0.0, 0.0, 0.0], // Column-major: each inner array is a column
21 [0.0, 1.0, 0.0, 0.0],
22 [0.0, 0.0, 1.0, 0.0],
23 [1.0, 0.0, 0.0, 1.0], // Translation (1, 0, 0)
24 ]);
25
26 let frame_transform = FrameTransform::new(
27 transform1,
28 FrameIdString::from("world").expect("Frame name too long"),
29 FrameIdString::from("base").expect("Frame name too long"),
30 );
31 let mut sft = StampedFrameTransform::new(Some(frame_transform));
32 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
33
34 // Add to tree using the new API
35 tree.add_transform(&sft).expect("Failed to add transform");
36 println!(" Added world->base transform at t=1s");
37
38 // Base to arm transform
39 let transform2 = Transform3D::from_matrix([
40 [0.0, 1.0, 0.0, 0.0], // 90-degree rotation around Z
41 [-1.0, 0.0, 0.0, 0.0],
42 [0.0, 0.0, 1.0, 0.0],
43 [0.5, 0.0, 0.0, 1.0], // Translation (0.5, 0, 0)
44 ]);
45
46 let msg2 = FrameTransform::new(
47 transform2,
48 FrameIdString::from("base").expect("Frame name too long"),
49 FrameIdString::from("arm").expect("Frame name too long"),
50 );
51 let mut sft = StampedFrameTransform::new(Some(msg2));
52 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
53
54 tree.add_transform(&sft).expect("Failed to add transform");
55 println!(" Added base->arm transform at t=1s");
56
57 // Demonstrate using time ranges for a broadcast
58 println!("\nBroadcasting multiple transforms with time range...");
59
60 // Create multiple transforms at different times
61 let times = [
62 CuTime::from_nanos(2_000_000_000), // 2 seconds
63 CuTime::from_nanos(2_100_000_000), // 2.1 seconds
64 CuTime::from_nanos(2_200_000_000),
65 ];
66
67 for (i, &time) in times.iter().enumerate() {
68 let x_translation = 1.0 + (i as f32) * 0.1;
69 let transform = Transform3D::from_matrix([
70 [1.0, 0.0, 0.0, 0.0],
71 [0.0, 1.0, 0.0, 0.0],
72 [0.0, 0.0, 1.0, 0.0],
73 [x_translation, 0.0, 0.0, 1.0],
74 ]);
75
76 let msg = FrameTransform::new(
77 transform,
78 FrameIdString::from("world").expect("Frame name too long"),
79 FrameIdString::from("base").expect("Frame name too long"),
80 );
81 let mut sft = StampedFrameTransform::new(Some(msg));
82
83 // For a broadcast with multiple transforms, use Range
84 if i == 0 {
85 sft.tov = Tov::Range(cu29::clock::CuTimeRange {
86 start: times[0],
87 end: *times.last().unwrap(),
88 });
89 } else {
90 sft.tov = Tov::Time(time);
91 }
92
93 tree.add_transform(&sft).expect("Failed to add transform");
94 }
95
96 println!(" Added 3 transforms with time range 2.0s - 2.2s");
97
98 // Query the tree
99 println!("\nQuerying transforms...");
100
101 let result = tree.lookup_transform("world", "arm", CuTime::from_nanos(1_000_000_000), &clock);
102 match result {
103 Ok(transform) => {
104 let mat = transform.to_matrix();
105 println!(
106 " World->arm at t=1s: translation=({:.2}, {:.2}, {:.2})",
107 mat[0][3], mat[1][3], mat[2][3]
108 );
109 }
110 Err(e) => println!(" Error: {e}"),
111 }
112
113 // Query velocity (requires transforms at multiple times)
114 let velocity = tree.lookup_velocity("world", "base", CuTime::from_nanos(2_100_000_000), &clock);
115 match velocity {
116 Ok(vel) => {
117 println!(
118 " World->base velocity at t=2.1s: linear=({:.2}, {:.2}, {:.2}) m/s",
119 vel.linear[0], vel.linear[1], vel.linear[2]
120 );
121 }
122 Err(e) => println!(" Error computing velocity: {e}"),
123 }
124
125 println!("\nKey advantages of CuMsg pattern:");
126 println!("- Integrates with Copper message system");
127 println!("- Timestamps handled by CuMsg metadata (Tov)");
128 println!("- Supports time ranges for broadcasts");
129}More examples
9fn main() {
10 // Example using the typed transform approach
11 println!("Cu Transform - New Typed Approach Demo");
12 println!("=====================================");
13
14 // Create a buffer for world -> robot transforms
15 let mut world_to_robot_buffer: TypedTransformBuffer<f32, WorldFrame, RobotFrame, 10> =
16 TypedTransformBuffer::new();
17
18 // Create a transform message
19 let transform = Transform3D::from_matrix([
20 [1.0, 0.0, 0.0, 1.0], // X translation
21 [0.0, 1.0, 0.0, 2.0], // Y translation
22 [0.0, 0.0, 1.0, 0.0],
23 [0.0, 0.0, 0.0, 1.0],
24 ]);
25
26 let world_to_robot_msg = TypedTransform::new(transform, CuTime::from_nanos(1000));
27
28 println!(
29 "Created transform from {} to {}",
30 world_to_robot_msg.parent_name(),
31 world_to_robot_msg.child_name()
32 );
33 if let Some(t) = world_to_robot_msg.transform() {
34 let mat = t.to_matrix();
35 println!(
36 " Translation: [{}, {}, {}]",
37 mat[0][3], mat[1][3], mat[2][3]
38 );
39 }
40
41 // Add to buffer
42 world_to_robot_buffer.add_transform(world_to_robot_msg);
43
44 // Create second transform
45 let transform2 = Transform3D::from_matrix([
46 [1.0, 0.0, 0.0, 2.0], // X translation
47 [0.0, 1.0, 0.0, 4.0], // Y translation
48 [0.0, 0.0, 1.0, 0.0],
49 [0.0, 0.0, 0.0, 1.0],
50 ]);
51
52 let world_to_robot_msg2 = TypedTransform::new(transform2, CuTime::from_nanos(2000));
53 world_to_robot_buffer.add_transform(world_to_robot_msg2);
54
55 // Query the buffer
56 if let Some(latest) = world_to_robot_buffer.get_latest_transform() {
57 println!(
58 "\nLatest transform at time {}:",
59 latest.timestamp().unwrap().as_nanos()
60 );
61 if let Some(t) = latest.transform() {
62 let mat = t.to_matrix();
63 println!(
64 " Translation: [{}, {}, {}]",
65 mat[0][3], mat[1][3], mat[2][3]
66 );
67 }
68 }
69
70 // Query closest to a specific time
71 if let Some(closest) = world_to_robot_buffer.get_closest_transform(CuTime::from_nanos(1500)) {
72 println!("\nClosest transform to time 1500:");
73 println!(" Actual time: {}", closest.timestamp().unwrap().as_nanos());
74 if let Some(t) = closest.transform() {
75 let mat = t.to_matrix();
76 println!(
77 " Translation: [{}, {}, {}]",
78 mat[0][3], mat[1][3], mat[2][3]
79 );
80 }
81 }
82
83 // Demonstrate time range
84 if let Some(range) = world_to_robot_buffer.get_time_range() {
85 println!(
86 "\nTime range: {} to {}",
87 range.start.as_nanos(),
88 range.end.as_nanos()
89 );
90 }
91
92 // Demonstrate velocity computation
93 if let Some(latest) = world_to_robot_buffer.get_latest_transform()
94 && let Some(closest) = world_to_robot_buffer.get_closest_transform(CuTime::from_nanos(1000))
95 && let Some(velocity) = latest.compute_velocity(closest)
96 {
97 println!("\nVelocity computation:");
98 println!(
99 " Linear velocity: [{}, {}, {}]",
100 velocity.linear[0], velocity.linear[1], velocity.linear[2]
101 );
102 }
103
104 // Demonstrate the stringly typed version of the API.
105 println!("\n\nConstant-Size Buffer Demo");
106 println!("===========================================");
107
108 let mut const_buffer: ConstTransformBuffer<f32, 5> = ConstTransformBuffer::new();
109
110 // Add some stamped transforms
111 let stamped_transform = StampedTransform {
112 transform,
113 stamp: CuTime::from_nanos(1000),
114 parent_frame: "world".try_into().unwrap(),
115 child_frame: "robot".try_into().unwrap(),
116 };
117
118 const_buffer.add_transform(stamped_transform);
119
120 if let Some(latest_stamped) = const_buffer.get_latest_transform() {
121 println!("Latest transform in constant buffer:");
122 println!(
123 " From: {} to: {}",
124 latest_stamped.parent_frame, latest_stamped.child_frame
125 );
126 println!(" Time: {}", latest_stamped.stamp.as_nanos());
127 let mat = latest_stamped.transform.to_matrix();
128 println!(
129 " Translation: [{}, {}, {}]",
130 mat[0][3], mat[1][3], mat[2][3]
131 );
132 }
133
134 println!("\nThis buffer is stack-allocated with capacity 5 - no heap allocation!");
135
136 // Demonstrate the StampedFrameTransform pattern with TransformTree
137 println!("\n\nStampedFrameTransform Pattern Demo");
138 println!("================================");
139
140 let mut tree = TransformTree::<f32>::new();
141
142 // Create a CuMsg with TransformMsg
143 let frame_transform = FrameTransform::new(
144 transform,
145 FrameIdString::from("world").expect("Frame name too long"),
146 FrameIdString::from("robot").expect("Frame name too long"),
147 );
148
149 let mut sft = StampedFrameTransform::new(Some(frame_transform));
150 sft.tov = Tov::Time(CuTime::from_nanos(1_000_000_000)); // 1 second
151
152 // Add using the new API
153 tree.add_transform(&sft).expect("Failed to add transform");
154 println!("Added transform using CuMsg<TransformMsg> pattern");
155
156 // Query the transform
157 let robot_clock = cu29::clock::RobotClock::default();
158 let result = tree.lookup_transform(
159 "world",
160 "robot",
161 CuTime::from_nanos(1_000_000_000),
162 &robot_clock,
163 );
164
165 match result {
166 Ok(transform) => {
167 let mat = transform.to_matrix();
168 println!(
169 "Retrieved transform: translation=({:.2}, {:.2}, {:.2})",
170 mat[0][3], mat[1][3], mat[2][3]
171 );
172 }
173 Err(e) => println!("Error: {e}"),
174 }
175}Source§impl Transform3D<f32>
impl Transform3D<f32>
Source§impl Transform3D<f64>
impl Transform3D<f64>
Source§impl Transform3D<f32>
impl Transform3D<f32>
Sourcepub fn position(&self) -> Point3<Length>
pub fn position(&self) -> Point3<Length>
The translation as a point: where the pose sits in its parent frame.
Sourcepub fn transform_point(&self, p: Point3<Length>) -> Point3<Length>
pub fn transform_point(&self, p: Point3<Length>) -> Point3<Length>
p mapped through the transform: rotation, then translation.
Sourcepub fn transform_vector(&self, v: Point3<Length>) -> Point3<Length>
pub fn transform_vector(&self, v: Point3<Length>) -> Point3<Length>
v mapped through the rotation only, for directions and
offsets.
Sourcepub fn transform_points<const N: usize>(
&self,
points: &mut Point3Soa<Length, N>,
)
pub fn transform_points<const N: usize>( &self, points: &mut Point3Soa<Length, N>, )
Every point in the set mapped through the transform, in place.
May differ from Self::transform_point by a rounding step.
Source§impl Transform3D<f64>
impl Transform3D<f64>
Sourcepub fn position(&self) -> Point3<Length>
pub fn position(&self) -> Point3<Length>
The translation as a point: where the pose sits in its parent frame.
Sourcepub fn transform_point(&self, p: Point3<Length>) -> Point3<Length>
pub fn transform_point(&self, p: Point3<Length>) -> Point3<Length>
p mapped through the transform: rotation, then translation.
Sourcepub fn transform_vector(&self, v: Point3<Length>) -> Point3<Length>
pub fn transform_vector(&self, v: Point3<Length>) -> Point3<Length>
v mapped through the rotation only, for directions and
offsets.
Sourcepub fn transform_points<const N: usize>(
&self,
points: &mut Point3Soa<Length, N>,
)
pub fn transform_points<const N: usize>( &self, points: &mut Point3Soa<Length, N>, )
Every point in the set mapped through the transform, in place.
May differ from Self::transform_point by a rounding step.
Source§impl Transform3D<f32>
impl Transform3D<f32>
Sourcepub fn inverse(&self) -> Transform3D<f32>
pub fn inverse(&self) -> Transform3D<f32>
Computes the inverse of this transformation matrix.
Source§impl Transform3D<f64>
impl Transform3D<f64>
Sourcepub fn inverse(&self) -> Transform3D<f64>
pub fn inverse(&self) -> Transform3D<f64>
Computes the inverse of this transformation matrix.
Trait Implementations§
Source§impl<T> Clone for Transform3D<T>
impl<T> Clone for Transform3D<T>
Source§fn clone(&self) -> Transform3D<T>
fn clone(&self) -> Transform3D<T>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<T> Copy for Transform3D<T>
Source§impl<T> Debug for Transform3D<T>
impl<T> Debug for Transform3D<T>
Source§impl<T> Decode<()> for Transform3D<T>
impl<T> Decode<()> for Transform3D<T>
Source§fn decode<D>(decoder: &mut D) -> Result<Transform3D<T>, DecodeError>
fn decode<D>(decoder: &mut D) -> Result<Transform3D<T>, DecodeError>
Source§impl<T> Default for Transform3D<T>
impl<T> Default for Transform3D<T>
Source§fn default() -> Transform3D<T>
fn default() -> Transform3D<T>
Source§impl<'de, T> Deserialize<'de> for Transform3D<T>
impl<'de, T> Deserialize<'de> for Transform3D<T>
Source§fn deserialize<D>(
deserializer: D,
) -> Result<Transform3D<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Transform3D<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl<T> Encode for Transform3D<T>
impl<T> Encode for Transform3D<T>
Source§impl HasInverse<f32> for Transform3D<f32>
impl HasInverse<f32> for Transform3D<f32>
Source§impl HasInverse<f64> for Transform3D<f64>
impl HasInverse<f64> for Transform3D<f64>
Source§impl Mul for Transform3D<f32>
impl Mul for Transform3D<f32>
Source§type Output = Transform3D<f32>
type Output = Transform3D<f32>
* operator.Source§fn mul(self, rhs: Transform3D<f32>) -> <Transform3D<f32> as Mul>::Output
fn mul(self, rhs: Transform3D<f32>) -> <Transform3D<f32> as Mul>::Output
* operation. Read moreSource§impl Mul for Transform3D<f64>
impl Mul for Transform3D<f64>
Source§type Output = Transform3D<f64>
type Output = Transform3D<f64>
* operator.Source§fn mul(self, rhs: Transform3D<f64>) -> <Transform3D<f64> as Mul>::Output
fn mul(self, rhs: Transform3D<f64>) -> <Transform3D<f64> as Mul>::Output
* operation. Read moreSource§impl Mul for &Transform3D<f32>
Reference implementations for f32
impl Mul for &Transform3D<f32>
Reference implementations for f32
Source§type Output = Transform3D<f32>
type Output = Transform3D<f32>
* operator.Source§fn mul(self, rhs: &Transform3D<f32>) -> <&Transform3D<f32> as Mul>::Output
fn mul(self, rhs: &Transform3D<f32>) -> <&Transform3D<f32> as Mul>::Output
* operation. Read moreSource§impl Mul for &Transform3D<f64>
Reference implementations for f64
impl Mul for &Transform3D<f64>
Reference implementations for f64
Source§type Output = Transform3D<f64>
type Output = Transform3D<f64>
* operator.Source§fn mul(self, rhs: &Transform3D<f64>) -> <&Transform3D<f64> as Mul>::Output
fn mul(self, rhs: &Transform3D<f64>) -> <&Transform3D<f64> as Mul>::Output
* operation. Read moreSource§impl Mul<&Transform3D<f32>> for Transform3D<f32>
impl Mul<&Transform3D<f32>> for Transform3D<f32>
Source§type Output = Transform3D<f32>
type Output = Transform3D<f32>
* operator.Source§fn mul(
self,
rhs: &Transform3D<f32>,
) -> <Transform3D<f32> as Mul<&Transform3D<f32>>>::Output
fn mul( self, rhs: &Transform3D<f32>, ) -> <Transform3D<f32> as Mul<&Transform3D<f32>>>::Output
* operation. Read moreSource§impl Mul<&Transform3D<f64>> for Transform3D<f64>
impl Mul<&Transform3D<f64>> for Transform3D<f64>
Source§type Output = Transform3D<f64>
type Output = Transform3D<f64>
* operator.Source§fn mul(
self,
rhs: &Transform3D<f64>,
) -> <Transform3D<f64> as Mul<&Transform3D<f64>>>::Output
fn mul( self, rhs: &Transform3D<f64>, ) -> <Transform3D<f64> as Mul<&Transform3D<f64>>>::Output
* operation. Read moreSource§impl Mul<Transform3D<f32>> for &Transform3D<f32>
impl Mul<Transform3D<f32>> for &Transform3D<f32>
Source§type Output = Transform3D<f32>
type Output = Transform3D<f32>
* operator.Source§fn mul(
self,
rhs: Transform3D<f32>,
) -> <&Transform3D<f32> as Mul<Transform3D<f32>>>::Output
fn mul( self, rhs: Transform3D<f32>, ) -> <&Transform3D<f32> as Mul<Transform3D<f32>>>::Output
* operation. Read moreSource§impl Mul<Transform3D<f64>> for &Transform3D<f64>
impl Mul<Transform3D<f64>> for &Transform3D<f64>
Source§type Output = Transform3D<f64>
type Output = Transform3D<f64>
* operator.Source§fn mul(
self,
rhs: Transform3D<f64>,
) -> <&Transform3D<f64> as Mul<Transform3D<f64>>>::Output
fn mul( self, rhs: Transform3D<f64>, ) -> <&Transform3D<f64> as Mul<Transform3D<f64>>>::Output
* operation. Read moreSource§impl<T> Serialize for Transform3D<T>
impl<T> Serialize for Transform3D<T>
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Auto Trait Implementations§
impl<T> Freeze for Transform3D<T>where
TransformInner<T>: Freeze,
impl<T> RefUnwindSafe for Transform3D<T>where
TransformInner<T>: RefUnwindSafe,
impl<T> Send for Transform3D<T>where
TransformInner<T>: Send,
impl<T> Sync for Transform3D<T>where
TransformInner<T>: Sync,
impl<T> Unpin for Transform3D<T>where
TransformInner<T>: Unpin,
impl<T> UnsafeUnpin for Transform3D<T>where
TransformInner<T>: UnsafeUnpin,
impl<T> UnwindSafe for Transform3D<T>where
TransformInner<T>: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CuMsgPayload for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> ElementType for T
impl<T> ElementType for T
impl<T> GetTypeRegistration for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more