From 74baed98f08f9c5c90ec6290c519b27087fd19a4 Mon Sep 17 00:00:00 2001 From: Thierry Berger Date: Thu, 19 Jun 2025 16:52:13 +0200 Subject: [PATCH] add failing test from #289 --- assets/tests/1.obj | 20 +++++++++++++ assets/tests/2.obj | 20 +++++++++++++ src/query/gjk/gjk.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 assets/tests/1.obj create mode 100644 assets/tests/2.obj diff --git a/assets/tests/1.obj b/assets/tests/1.obj new file mode 100644 index 00000000..b22b60aa --- /dev/null +++ b/assets/tests/1.obj @@ -0,0 +1,20 @@ +v -1175 365.31871795654297 0 +v -1175 1940 0 +v -1055 1940 0 +v -1055 469.7380065917969 0 +v -1175 1940 2800 +v -1175 365.31871795654297 2800 +v -1055 469.7380065917969 2800 +v -1055 1940 2800 +f 1 2 3 +f 3 4 1 +f 5 6 7 +f 7 8 5 +f 8 7 4 +f 4 3 8 +f 5 8 3 +f 3 2 5 +f 6 5 2 +f 2 1 6 +f 7 6 1 +f 1 4 7 diff --git a/assets/tests/2.obj b/assets/tests/2.obj new file mode 100644 index 00000000..f4b9f06c --- /dev/null +++ b/assets/tests/2.obj @@ -0,0 +1,20 @@ +v 955.3556823730468 2060 0 +v -1175 206.24834060668945 0 +v -1175 365.31871795654297 0 +v 772.5498962402344 2060 0 +v -1175 206.24834060668945 2800 +v 955.3556823730468 2060 2800 +v 772.5498962402344 2060 2800 +v -1175 365.31871795654297 2800 +f 1 2 3 +f 3 4 1 +f 5 6 7 +f 7 8 5 +f 8 7 4 +f 4 3 8 +f 5 8 3 +f 3 2 5 +f 6 5 2 +f 2 1 6 +f 7 6 1 +f 1 4 7 diff --git a/src/query/gjk/gjk.rs b/src/query/gjk/gjk.rs index 9c9efe7f..45254310 100644 --- a/src/query/gjk/gjk.rs +++ b/src/query/gjk/gjk.rs @@ -391,3 +391,71 @@ fn result(simplex: &VoronoiSimplex, prev: bool) -> (Point, Point) { res } } + +#[cfg(test)] +#[cfg(feature = "dim3")] +#[cfg(feature = "wavefront")] +mod test { + use crate::math::{Isometry, Real}; + use crate::shape::{TriMesh, TriMeshFlags}; + use crate::transformation::intersect_meshes_with_tolerances; + use alloc::vec::Vec; + use nalgebra::Point3; + use obj::Obj; + use obj::ObjData; + use std::path::PathBuf; + + fn load_trimesh_from_obj(objfile: &str) -> TriMesh { + let Obj { + data: ObjData { + position, objects, .. + }, + .. + } = Obj::load(objfile).unwrap(); + + let mesh = TriMesh::with_flags( + position + .iter() + .map(|v| Point3::new(v[0] as Real, v[1] as Real, v[2] as Real)) + .collect::>(), + objects[0].groups[0] + .polys + .iter() + .map(|p| [p.0[0].0 as u32, p.0[1].0 as u32, p.0[2].0 as u32]) + .collect::>(), + TriMeshFlags::all(), + ); + + mesh.unwrap() + } + + #[test] + fn test_mesh_intersection_2() { + let colliders = vec!["../../assets/tests/1.obj", "../../assets/tests/2.obj"]; + + let mesh_a = load_trimesh_from_obj(&colliders[0]); + let mesh_b = load_trimesh_from_obj(&colliders[1]); + + //mesh_a.to_obj_file(&PathBuf::from(format!("../../assets/tests/1.obj"))); + //mesh_b.to_obj_file(&PathBuf::from(format!("../../assets/tests/2.obj"))); + + let mut tolerance = crate::transformation::MeshIntersectionTolerances::default(); + tolerance.global_insertion_epsilon = 0.001; + tolerance.angle_epsilon = (0.1 as Real).to_radians(); + + let mut result = intersect_meshes_with_tolerances( + &Isometry::identity(), + &mesh_a, + false, + &Isometry::translation(0.0, 0.0, 0.0), + &mesh_b, + false, + tolerance, + ) + .unwrap(); + + if let Some(result) = result { + let _ = result.to_obj_file(&PathBuf::from("intersection_test_result.obj")); + } + } +}