Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aabb example using macroquad #257

Merged
merged 30 commits into from
Sep 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
44c81cc
example for projection (+ bug detected)
Vrixyz Jul 31, 2024
9526e75
simpler project example
Vrixyz Jul 31, 2024
113046d
use lissajous trajectory + small polish pass
Vrixyz Jul 31, 2024
ed6a112
zoom in
Vrixyz Aug 14, 2024
8c09f1a
Merge branch 'master' into projection_example
Vrixyz Aug 14, 2024
b181c65
scrape plane intersection
Vrixyz Aug 14, 2024
2a68514
expose cuboid::to_trimesh for parry2d + add 2d example for projectpoint
Vrixyz Aug 14, 2024
065f6b6
fix local point inside the shape
Vrixyz Aug 14, 2024
174f012
common macroquad code in their example
Vrixyz Aug 14, 2024
3955d44
use a shaded cube for project_point2d too.
Vrixyz Aug 14, 2024
4bbe298
lighter cube
Vrixyz Sep 3, 2024
2dcadc9
fix plane intersection code with common code
Vrixyz Sep 3, 2024
d61b05b
removed a few unused variables
Vrixyz Sep 3, 2024
8ab7b5c
2d examples use common macroquad code
Vrixyz Sep 3, 2024
8057422
add example for convex hull
Vrixyz Sep 3, 2024
feda1a6
3d example for convex hull
Vrixyz Sep 3, 2024
39d7f8e
3d example for convex hull
Vrixyz Sep 3, 2024
aa711e6
add example for aabb2d
Vrixyz Sep 3, 2024
335639f
example for aabb in 3d
Vrixyz Sep 3, 2024
35c557f
remove a few unused code
Vrixyz Sep 3, 2024
607ac1f
simpler aabb 3d function
Vrixyz Sep 4, 2024
1027b09
Merge branch 'master' into convex_hull_example
Vrixyz Sep 13, 2024
5e1b424
add back a space for diff
Vrixyz Sep 13, 2024
c1b6502
removed a wrong file
Vrixyz Sep 13, 2024
211d724
fix conflict again
Vrixyz Sep 13, 2024
9736146
Merge branch 'convex_hull_example' into example_aabb
Vrixyz Sep 13, 2024
0996ff0
Merge branch 'master' into convex_hull_example
Vrixyz Sep 13, 2024
5d13605
Merge branch 'convex_hull_example' into example_aabb
Vrixyz Sep 13, 2024
d9d5865
fixed use of common_macroquad
Vrixyz Sep 13, 2024
f956053
Merge remote-tracking branch 'upstream/master' into example_aabb
Vrixyz Sep 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 95 additions & 30 deletions crates/parry2d/examples/aabb2d.rs
Original file line number Diff line number Diff line change
@@ -1,36 +1,101 @@
mod common_macroquad2d;

extern crate nalgebra as na;

use common_macroquad2d::{draw_polyline, lissajous_2d, mquad_from_na, na_from_mquad};
use macroquad::prelude::*;
use na::Isometry2;
use parry2d::bounding_volume::BoundingVolume;
use parry2d::bounding_volume::{Aabb, BoundingVolume};
use parry2d::shape::Ball;

fn main() {
/*
* Initialize the shapes.
*/
let ball1 = Ball::new(0.5);
let ball2 = Ball::new(1.0);

let ball1_pos = Isometry2::translation(0.0, 1.0);
let ball2_pos = Isometry2::identity();

/*
* Compute their axis-aligned bounding boxes.
*/
let aabb_ball1 = ball1.aabb(&ball1_pos);
let aabb_ball2 = ball2.aabb(&ball2_pos);

// Merge the two boxes.
let bounding_aabb = aabb_ball1.merged(&aabb_ball2);

// Enlarge the ball2 aabb.
let loose_aabb_ball2 = aabb_ball2.loosened(1.0);

// Intersection and inclusion tests.
assert!(aabb_ball1.intersects(&aabb_ball2));
assert!(bounding_aabb.contains(&aabb_ball1));
assert!(bounding_aabb.contains(&aabb_ball2));
assert!(!aabb_ball2.contains(&bounding_aabb));
assert!(!aabb_ball1.contains(&bounding_aabb));
assert!(loose_aabb_ball2.contains(&aabb_ball2));
const RENDER_SCALE: f32 = 30.0;

#[macroquad::main("parry2d::utils::point_in_poly2d")]
async fn main() {
let render_pos = Vec2::new(300.0, 300.0);

loop {
let elapsed_time = get_time() as f32 * 0.7;
clear_background(BLACK);

/*
* Initialize the shapes.
*/
let ball1 = Ball::new(0.5);
let ball2 = Ball::new(1.0);

let ball1_pos = na_from_mquad(lissajous_2d(elapsed_time)) * 5f32;
let ball2_pos = Isometry2::identity();

/*
* Compute their axis-aligned bounding boxes.
*/
let aabb_ball1 = ball1.aabb(&ball1_pos.into());
let aabb_ball2 = ball2.aabb(&ball2_pos);

// Merge the two boxes.
let bounding_aabb = aabb_ball1.merged(&aabb_ball2);

// Enlarge the ball2 aabb.
let loose_aabb_ball2 = aabb_ball2.loosened(2f32);

// Intersection test
let color = if aabb_ball1.intersects(&aabb_ball2) {
RED
} else {
GREEN
};

assert!(bounding_aabb.contains(&aabb_ball1));
assert!(bounding_aabb.contains(&aabb_ball2));
assert!(loose_aabb_ball2.contains(&aabb_ball2));

let ball1_translation = mquad_from_na(ball1_pos.coords.into()) * RENDER_SCALE + render_pos;
draw_circle(
ball1_translation.x,
ball1_translation.y,
ball1.radius * RENDER_SCALE,
color,
);
let ball2_translation =
mquad_from_na(ball2_pos.translation.vector.into()) * RENDER_SCALE + render_pos;
draw_circle(
ball2_translation.x,
ball2_translation.y,
ball2.radius * RENDER_SCALE,
color,
);

draw_aabb(aabb_ball1, render_pos, color);
draw_aabb(aabb_ball2, render_pos, color);
draw_aabb(bounding_aabb, render_pos, YELLOW);

// Inclusion test
let color_included: Color = if loose_aabb_ball2.contains(&aabb_ball1) {
BLUE
} else {
MAGENTA
};
draw_aabb(loose_aabb_ball2, render_pos, color_included);
next_frame().await
}
}

fn draw_aabb(aabb: Aabb, offset: Vec2, color: Color) {
let mins = mquad_from_na(aabb.mins) * RENDER_SCALE + offset;
let maxs = mquad_from_na(aabb.maxs) * RENDER_SCALE + offset;

let line = vec![
Vec2::new(mins.x, mins.y),
Vec2::new(mins.x, maxs.y),
Vec2::new(maxs.x, maxs.y),
Vec2::new(maxs.x, mins.y),
Vec2::new(mins.x, mins.y),
];
let drawable_line = line
.iter()
.zip(line.iter().cycle().skip(1).take(line.len()))
.map(|item| (item.0.clone(), item.1.clone()))
.collect();
draw_polyline(drawable_line, color);
}
108 changes: 78 additions & 30 deletions crates/parry3d/examples/aabb3d.rs
Original file line number Diff line number Diff line change
@@ -1,36 +1,84 @@
mod common_macroquad3d;

extern crate nalgebra as na;

use common_macroquad3d::{lissajous_3d, mquad_from_na, na_from_mquad};
use macroquad::prelude::*;
use na::Isometry3;
use parry3d::bounding_volume::BoundingVolume;
use parry3d::bounding_volume::{Aabb, BoundingVolume};
use parry3d::shape::Ball;

fn main() {
/*
* Initialize the shapes.
*/
let ball1 = Ball::new(0.5);
let ball2 = Ball::new(1.0);

let ball1_pos = Isometry3::translation(0.0, 1.0, 0.0);
let ball2_pos = Isometry3::identity(); // Identity matrix.

/*
* Compute their axis-aligned bounding boxes.
*/
let aabb_ball1 = ball1.aabb(&ball1_pos);
let aabb_ball2 = ball2.aabb(&ball2_pos);

// Merge the two boxes.
let bounding_aabb = aabb_ball1.merged(&aabb_ball2);

// Enlarge the ball2 aabb.
let loose_aabb_ball2 = aabb_ball2.loosened(1.0);

// Intersection and inclusion tests.
assert!(aabb_ball1.intersects(&aabb_ball2));
assert!(bounding_aabb.contains(&aabb_ball1));
assert!(bounding_aabb.contains(&aabb_ball2));
assert!(!aabb_ball2.contains(&bounding_aabb));
assert!(!aabb_ball1.contains(&bounding_aabb));
assert!(loose_aabb_ball2.contains(&aabb_ball2));
#[macroquad::main("parry2d::utils::point_in_poly2d")]
async fn main() {
let camera_pos = Vec3::new(8f32, 8f32, 12f32);

loop {
let elapsed_time = get_time() as f32 * 0.7;
clear_background(BLACK);
// Initialize 3D camera.
set_camera(&Camera3D {
position: camera_pos,
up: Vec3::new(0f32, 1f32, 0f32),
target: Vec3::new(0.5f32, 0f32, 0.5f32),
..Default::default()
});

/*
* Initialize the shapes.
*/
let ball1 = Ball::new(0.5);
let ball2 = Ball::new(1.0);

let ball1_pos = na_from_mquad(lissajous_3d(elapsed_time)) * 4f32;
let ball2_pos = Isometry3::identity();

/*
* Compute their axis-aligned bounding boxes.
*/
let aabb_ball1 = ball1.aabb(&ball1_pos.into());
let aabb_ball2 = ball2.aabb(&ball2_pos);

// Merge the two boxes.
let bounding_aabb = aabb_ball1.merged(&aabb_ball2);

// Enlarge the ball2 aabb.
let loose_aabb_ball2 = aabb_ball2.loosened(2.25f32);

// Intersection and inclusion tests.
let color = if aabb_ball1.intersects(&aabb_ball2) {
RED
} else {
GREEN
};

assert!(bounding_aabb.contains(&aabb_ball1));
assert!(bounding_aabb.contains(&aabb_ball2));
assert!(loose_aabb_ball2.contains(&aabb_ball2));

let ball1_translation = mquad_from_na(ball1_pos.coords.into());
draw_sphere(ball1_translation, ball1.radius, None, color);
let ball2_translation = mquad_from_na(ball2_pos.translation.vector.into());
draw_sphere(ball2_translation, ball2.radius, None, color);

draw_aabb(aabb_ball1, color);
draw_aabb(aabb_ball2, color);
draw_aabb(bounding_aabb, YELLOW);

let color_included: Color = if loose_aabb_ball2.contains(&aabb_ball1) {
BLUE
} else {
MAGENTA
};
draw_aabb(loose_aabb_ball2, color_included);
next_frame().await
}
}

fn draw_aabb(aabb: Aabb, color: Color) {
let size = aabb.maxs - aabb.mins;
draw_cube_wires(
mquad_from_na(aabb.maxs - size / 2f32),
mquad_from_na(size.into()),
color,
);
}