use nalgebra::{Point3, Rotation3, Vector3};
use parry3d_f64::shape::TriMesh;
pub fn get_bounds(mesh: &TriMesh) -> (f64, f64, f64, f64, f64, f64) {
let aabb = mesh.local_aabb();
(
aabb.mins.x,
aabb.maxs.x,
aabb.mins.y,
aabb.maxs.y,
aabb.mins.z,
aabb.maxs.z,
)
}
pub fn transform_mesh(mesh: &TriMesh, heel: f64, trim: f64, pivot: Point3<f64>) -> TriMesh {
let heel_rad = heel.to_radians();
let trim_rad = trim.to_radians();
let rot_x = Rotation3::from_axis_angle(&Vector3::x_axis(), heel_rad);
let rot_y = Rotation3::from_axis_angle(&Vector3::y_axis(), trim_rad);
let rotation = rot_y * rot_x;
let new_vertices: Vec<Point3<f64>> = mesh
.vertices()
.iter()
.map(|v| {
let relative = v - pivot;
let rotated = rotation * relative;
pivot + rotated
})
.collect();
let indices: Vec<[u32; 3]> = mesh
.indices()
.iter()
.map(|idx| [idx[0], idx[1], idx[2]])
.collect();
TriMesh::new(new_vertices, indices).expect("Failed to create transformed mesh")
}
pub fn transform_point(
point: Point3<f64>,
heel: f64,
trim: f64,
pivot: Point3<f64>,
) -> Point3<f64> {
let heel_rad = heel.to_radians();
let trim_rad = trim.to_radians();
let rot_x = Rotation3::from_axis_angle(&Vector3::x_axis(), heel_rad);
let rot_y = Rotation3::from_axis_angle(&Vector3::y_axis(), trim_rad);
let rotation = rot_y * rot_x;
let relative = point - pivot;
let rotated = rotation * relative;
pivot + rotated
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transform_point_identity() {
let point = Point3::new(1.0, 2.0, 3.0);
let pivot = Point3::new(0.0, 0.0, 0.0);
let result = transform_point(point, 0.0, 0.0, pivot);
assert!((result - point).norm() < 1e-10);
}
#[test]
fn test_transform_point_heel_90() {
let point = Point3::new(0.0, 1.0, 0.0);
let pivot = Point3::new(0.0, 0.0, 0.0);
let result = transform_point(point, 90.0, 0.0, pivot);
assert!((result.x).abs() < 1e-6);
assert!((result.y).abs() < 1e-6);
assert!((result.z - 1.0).abs() < 1e-6);
}
}