dimforge / rapier

2D and 3D physics engines focused on performance.
https://rapier.rs
Apache License 2.0
3.99k stars 249 forks source link

Downward raycasts sometimes go through heightfield #165

Open mpartel opened 3 years ago

mpartel commented 3 years ago

When I cast rays against a heightfield, they sometimes fail to hit.

Repro here: https://github.com/dimforge/rapier/compare/master...mpartel:heightfield-bug?expand=1

Output:

$ cargo run --release --bin all_examples3 -- --example Heightfield
[...]
Failed to hit ground on attempt 6170 with ray Ray { origin: Point { coords: Matrix { data: [5.0, 10.0, 2.63113] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 11725 with ray Ray { origin: Point { coords: Matrix { data: [9.50162, 10.0, 5.0] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 12340 with ray Ray { origin: Point { coords: Matrix { data: [10.0, 10.0, 5.26226] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 23450 with ray Ray { origin: Point { coords: Matrix { data: [19.00324, 10.0, 10.0] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 37020 with ray Ray { origin: Point { coords: Matrix { data: [30.0, 10.0, 15.78678] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 43190 with ray Ray { origin: Point { coords: Matrix { data: [35.0, 10.0, 18.41791] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }
Failed to hit ground on attempt 49360 with ray Ray { origin: Point { coords: Matrix { data: [40.0, 10.0, 21.04904] } }, dir: Matrix { data: [0.0, -1.0, 0.0] } }

Note that each case has a coordinate divisible by 5 = the subdivision side length.

mpartel commented 3 years ago

Converting the HeightField to a TriMesh seems to work around the problem.

HeightField also doesn't seem to support any shapecasts yet, but TriMesh does.