Skip to content

Unexpected AabbCast2d aabb_collision_at with small max distance value #17703

Open
@bread-mountain4

Description

@bread-mountain4

Bevy version

0.15.1

[Optional] Relevant system information

  • Arch Linux
  • rustc 1.84.1 (e71f9a9a9 2025-01-27)

What you did

I have some code that uses raycast2d over short distances that I expect to be similar to if I translated the aabb2 then did an intersection check.

What went wrong

I am getting some unexpected results with these raycasts. I get an unexpected value of a collision at distance 0.0 for two Aabb2ds that should be sufficiently far apart.

Here's a small unit test I wrote to do the raycast some other ways that do pass, then the last call I expected to be a None but it's a Some(0.0). The numbers were pulled directly from a live run of the program when the raycast2d returned an unexpected answer.

#[test]
fn test_debug() {
    let movement_amount = 0.974444;

    let window = Aabb2d {
        min: Vec2::new(-26.197449, -21.058212),
        max: Vec2::new(323.80255, 278.94177),
    };
    let side = Aabb2d {
        min: Vec2::new(472.0, -320.0),
        max: Vec2::new(473.0, 320.0),
    };

    assert_eq!(false, window.intersects(&side));
    assert_eq!(false, side.intersects(&window));

    let mut window_new = window.clone();
    window_new.translate_by(Vec2::new(movement_amount, 0.0));
    assert_eq!(false, window_new.intersects(&side));
    assert_eq!(false, side.intersects(&window_new));

    let window_new_new = Aabb2d {
        min: window.min + Vec2::new(movement_amount, 0.0),
        max: window.max + Vec2::new(movement_amount, 0.0),
    };

    assert_eq!(false, window_new_new.intersects(&side));
    assert_eq!(false, side.intersects(&window_new_new));

    let ray_direction = Dir2::new(Vec2::new(1.0, 0.0)).unwrap();
    let ray_towards_boundary_intersections = Ray2d::new(window.center(), ray_direction);
    let bounds_check_ray_cast =
        AabbCast2d::from_ray(window, ray_towards_boundary_intersections, movement_amount);

    let res = bounds_check_ray_cast.aabb_collision_at(side);
    assert_eq!(None, res);
}
---- collisions::tests::test_debug stdout ----
thread 'collisions::tests::test_debug' panicked at scroll_2d/src/collisions/tests.rs:234:5:
assertion `left == right` failed
  left: None
 right: Some(0.0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-MathFundamental domain-agnostic mathematical operationsC-BugAn unexpected or incorrect behaviorD-StraightforwardSimple bug fixes and API improvements, docs, test and examplesS-Needs-InvestigationThis issue requires detective work to figure out what's going wrong

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions