Move benchmark demos into their own directory.
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = [ "build/rapier2d", "build/rapier_testbed2d", "examples2d",
|
members = [ "build/rapier2d", "build/rapier_testbed2d", "examples2d",
|
||||||
"build/rapier3d", "build/rapier_testbed3d", "examples3d" ]
|
"build/rapier3d", "build/rapier_testbed3d", "examples3d", "benchmarks3d" ]
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
#wrapped2d = { git = "https://github.com/Bastacyclop/rust_box2d.git" }
|
#wrapped2d = { git = "https://github.com/Bastacyclop/rust_box2d.git" }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
debug = false
|
debug = true
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
#opt-level = 1
|
#opt-level = 1
|
||||||
#lto = true
|
#lto = true
|
||||||
|
|||||||
27
benchmarks3d/Cargo.toml
Normal file
27
benchmarks3d/Cargo.toml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[package]
|
||||||
|
name = "rapier-benchmarks-3d"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = [ "Sébastien Crozet <developer@crozet.re>" ]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
parallel = [ "rapier3d/parallel", "rapier_testbed3d/parallel" ]
|
||||||
|
simd-stable = [ "rapier3d/simd-stable" ]
|
||||||
|
simd-nightly = [ "rapier3d/simd-nightly" ]
|
||||||
|
other-backends = [ "rapier_testbed3d/other-backends" ]
|
||||||
|
enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rand = "0.7"
|
||||||
|
Inflector = "0.11"
|
||||||
|
nalgebra = "0.22"
|
||||||
|
|
||||||
|
[dependencies.rapier_testbed3d]
|
||||||
|
path = "../build/rapier_testbed3d"
|
||||||
|
|
||||||
|
[dependencies.rapier3d]
|
||||||
|
path = "../build/rapier3d"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "all_benchmarks3"
|
||||||
|
path = "all_benchmarks3.rs"
|
||||||
91
benchmarks3d/all_benchmarks3.rs
Normal file
91
benchmarks3d/all_benchmarks3.rs
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
extern crate nalgebra as na;
|
||||||
|
|
||||||
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
|
use inflector::Inflector;
|
||||||
|
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
mod balls3;
|
||||||
|
mod boxes3;
|
||||||
|
mod capsules3;
|
||||||
|
mod compound3;
|
||||||
|
mod heightfield3;
|
||||||
|
mod joint_ball3;
|
||||||
|
mod joint_fixed3;
|
||||||
|
mod joint_prismatic3;
|
||||||
|
mod joint_revolute3;
|
||||||
|
mod keva3;
|
||||||
|
mod pyramid3;
|
||||||
|
mod stacks3;
|
||||||
|
mod trimesh3;
|
||||||
|
|
||||||
|
enum Command {
|
||||||
|
Run(String),
|
||||||
|
List,
|
||||||
|
RunAll,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_command_line() -> Command {
|
||||||
|
let mut args = std::env::args();
|
||||||
|
|
||||||
|
while let Some(arg) = args.next() {
|
||||||
|
if &arg[..] == "--example" {
|
||||||
|
return Command::Run(args.next().unwrap_or(String::new()));
|
||||||
|
} else if &arg[..] == "--list" {
|
||||||
|
return Command::List;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Command::RunAll
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let command = parse_command_line();
|
||||||
|
|
||||||
|
let mut builders: Vec<(_, fn(&mut Testbed))> = vec![
|
||||||
|
("Balls", balls3::init_world),
|
||||||
|
("Boxes", boxes3::init_world),
|
||||||
|
("Capsules", capsules3::init_world),
|
||||||
|
("Compound", compound3::init_world),
|
||||||
|
("Heightfield", heightfield3::init_world),
|
||||||
|
("Stacks", stacks3::init_world),
|
||||||
|
("Pyramid", pyramid3::init_world),
|
||||||
|
("Trimesh", trimesh3::init_world),
|
||||||
|
("Joint ball", joint_ball3::init_world),
|
||||||
|
("Joint fixed", joint_fixed3::init_world),
|
||||||
|
("Joint revolute", joint_revolute3::init_world),
|
||||||
|
("Joint prismatic", joint_prismatic3::init_world),
|
||||||
|
("Keva tower", keva3::init_world),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Lexicographic sort, with stress tests moved at the end of the list.
|
||||||
|
builders.sort_by(|a, b| match (a.0.starts_with("("), b.0.starts_with("(")) {
|
||||||
|
(true, true) | (false, false) => a.0.cmp(b.0),
|
||||||
|
(true, false) => Ordering::Greater,
|
||||||
|
(false, true) => Ordering::Less,
|
||||||
|
});
|
||||||
|
|
||||||
|
match command {
|
||||||
|
Command::Run(demo) => {
|
||||||
|
if let Some(i) = builders
|
||||||
|
.iter()
|
||||||
|
.position(|builder| builder.0.to_camel_case().as_str() == demo.as_str())
|
||||||
|
{
|
||||||
|
Testbed::from_builders(0, vec![builders[i]]).run()
|
||||||
|
} else {
|
||||||
|
eprintln!("Invalid example to run provided: '{}'", demo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Command::RunAll => Testbed::from_builders(0, builders).run(),
|
||||||
|
Command::List => {
|
||||||
|
for builder in &builders {
|
||||||
|
println!("{}", builder.0.to_camel_case())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
benchmarks3d/balls3.rs
Normal file
58
benchmarks3d/balls3.rs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
use na::Point3;
|
||||||
|
use rapier3d::dynamics::{BodyStatus, JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the balls
|
||||||
|
*/
|
||||||
|
let num = 20;
|
||||||
|
let rad = 1.0;
|
||||||
|
|
||||||
|
let shift = rad * 2.0 + 1.0;
|
||||||
|
let centerx = shift * (num as f32) / 2.0;
|
||||||
|
let centery = shift / 2.0;
|
||||||
|
let centerz = shift * (num as f32) / 2.0;
|
||||||
|
|
||||||
|
for i in 0..num {
|
||||||
|
for j in 0usize..num {
|
||||||
|
for k in 0..num {
|
||||||
|
let x = i as f32 * shift - centerx;
|
||||||
|
let y = j as f32 * shift + centery;
|
||||||
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
|
let status = if j == 0 {
|
||||||
|
BodyStatus::Static
|
||||||
|
} else {
|
||||||
|
BodyStatus::Dynamic
|
||||||
|
};
|
||||||
|
let density = 0.477;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new(status).translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::ball(rad).density(density).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Balls", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
@@ -47,7 +47,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::capsule_y(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
76
benchmarks3d/compound3.rs
Normal file
76
benchmarks3d/compound3.rs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
use na::Point3;
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = 200.1;
|
||||||
|
let ground_height = 0.1;
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
|
.translation(0.0, -ground_height, 0.0)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let num = 8;
|
||||||
|
let rad = 0.2;
|
||||||
|
|
||||||
|
let shift = rad * 4.0 + rad;
|
||||||
|
let centerx = shift * (num / 2) as f32;
|
||||||
|
let centery = shift / 2.0;
|
||||||
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
|
let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
|
||||||
|
|
||||||
|
for j in 0usize..25 {
|
||||||
|
for i in 0..num {
|
||||||
|
for k in 0usize..num {
|
||||||
|
let x = i as f32 * shift * 5.0 - centerx + offset;
|
||||||
|
let y = j as f32 * (shift * 5.0) + centery + 3.0;
|
||||||
|
let z = k as f32 * shift * 2.0 - centerz + offset;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider1 = ColliderBuilder::cuboid(rad * 10.0, rad, rad).build();
|
||||||
|
let collider2 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
|
.translation(rad * 10.0, rad * 10.0, 0.0)
|
||||||
|
.build();
|
||||||
|
let collider3 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
|
.translation(-rad * 10.0, rad * 10.0, 0.0)
|
||||||
|
.build();
|
||||||
|
colliders.insert(collider1, handle, &mut bodies);
|
||||||
|
colliders.insert(collider2, handle, &mut bodies);
|
||||||
|
colliders.insert(collider3, handle, &mut bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset -= 0.05 * rad * (num as f32 - 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
78
benchmarks3d/heightfield3.rs
Normal file
78
benchmarks3d/heightfield3.rs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
use na::{DMatrix, Point3, Vector3};
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = Vector3::new(200.0, 1.0, 200.0);
|
||||||
|
let nsubdivs = 20;
|
||||||
|
|
||||||
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
|
if i == 0 || i == nsubdivs || j == 0 || j == nsubdivs {
|
||||||
|
10.0
|
||||||
|
} else {
|
||||||
|
let x = i as f32 * ground_size.x / (nsubdivs as f32);
|
||||||
|
let z = j as f32 * ground_size.z / (nsubdivs as f32);
|
||||||
|
x.sin() + z.cos()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let num = 8;
|
||||||
|
let rad = 1.0;
|
||||||
|
|
||||||
|
let shift = rad * 2.0 + rad;
|
||||||
|
let centerx = shift * (num / 2) as f32;
|
||||||
|
let centery = shift / 2.0;
|
||||||
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
|
for j in 0usize..47 {
|
||||||
|
for i in 0..num {
|
||||||
|
for k in 0usize..num {
|
||||||
|
let x = i as f32 * shift - centerx;
|
||||||
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
|
if j % 2 == 0 {
|
||||||
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
} else {
|
||||||
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(fk * shift, 0.0, fi * shift)
|
.translation(fk * shift, 0.0, fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
@@ -45,7 +45,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(x + fk * shift, y, z + fi * shift)
|
.translation(x + fk * shift, y, z + fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
@@ -48,9 +48,7 @@ pub fn build_block(
|
|||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z)
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert(collider, handle, bodies);
|
||||||
|
|
||||||
testbed.set_body_color(handle, color0);
|
testbed.set_body_color(handle, color0);
|
||||||
@@ -73,9 +71,7 @@ pub fn build_block(
|
|||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z)
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert(collider, handle, bodies);
|
||||||
testbed.set_body_color(handle, color0);
|
testbed.set_body_color(handle, color0);
|
||||||
std::mem::swap(&mut color0, &mut color1);
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
@@ -28,9 +28,7 @@ fn create_pyramid(
|
|||||||
let rigid_body_handle = bodies.insert(rigid_body);
|
let rigid_body_handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z)
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, rigid_body_handle, bodies);
|
colliders.insert(collider, rigid_body_handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
191
benchmarks3d/stacks3.rs
Normal file
191
benchmarks3d/stacks3.rs
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
use na::{Point3, Translation3, UnitQuaternion, Vector3};
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
fn create_tower_circle(
|
||||||
|
bodies: &mut RigidBodySet,
|
||||||
|
colliders: &mut ColliderSet,
|
||||||
|
offset: Vector3<f32>,
|
||||||
|
stack_height: usize,
|
||||||
|
nsubdivs: usize,
|
||||||
|
half_extents: Vector3<f32>,
|
||||||
|
) {
|
||||||
|
let ang_step = std::f32::consts::PI * 2.0 / nsubdivs as f32;
|
||||||
|
let radius = 1.3 * nsubdivs as f32 * half_extents.x / std::f32::consts::PI;
|
||||||
|
|
||||||
|
let shift = half_extents * 2.0;
|
||||||
|
for i in 0usize..stack_height {
|
||||||
|
for j in 0..nsubdivs {
|
||||||
|
let fj = j as f32;
|
||||||
|
let fi = i as f32;
|
||||||
|
let y = fi * shift.y;
|
||||||
|
let pos = Translation3::from(offset)
|
||||||
|
* UnitQuaternion::new(Vector3::y() * (fi / 2.0 + fj) * ang_step)
|
||||||
|
* Translation3::new(0.0, y, radius);
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().position(pos).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider =
|
||||||
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
|
colliders.insert(collider, handle, bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_wall(
|
||||||
|
bodies: &mut RigidBodySet,
|
||||||
|
colliders: &mut ColliderSet,
|
||||||
|
offset: Vector3<f32>,
|
||||||
|
stack_height: usize,
|
||||||
|
half_extents: Vector3<f32>,
|
||||||
|
) {
|
||||||
|
let shift = half_extents * 2.0;
|
||||||
|
for i in 0usize..stack_height {
|
||||||
|
for j in i..stack_height {
|
||||||
|
let fj = j as f32;
|
||||||
|
let fi = i as f32;
|
||||||
|
let x = offset.x;
|
||||||
|
let y = fi * shift.y + offset.y;
|
||||||
|
let z = (fi * shift.z / 2.0) + (fj - fi) * shift.z + offset.z
|
||||||
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider =
|
||||||
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
|
colliders.insert(collider, handle, bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_pyramid(
|
||||||
|
bodies: &mut RigidBodySet,
|
||||||
|
colliders: &mut ColliderSet,
|
||||||
|
offset: Vector3<f32>,
|
||||||
|
stack_height: usize,
|
||||||
|
half_extents: Vector3<f32>,
|
||||||
|
) {
|
||||||
|
let shift = half_extents * 2.0;
|
||||||
|
|
||||||
|
for i in 0usize..stack_height {
|
||||||
|
for j in i..stack_height {
|
||||||
|
for k in i..stack_height {
|
||||||
|
let fi = i as f32;
|
||||||
|
let fj = j as f32;
|
||||||
|
let fk = k as f32;
|
||||||
|
let x = (fi * shift.x / 2.0) + (fk - fi) * shift.x + offset.x
|
||||||
|
- stack_height as f32 * half_extents.x;
|
||||||
|
let y = fi * shift.y + offset.y;
|
||||||
|
let z = (fi * shift.z / 2.0) + (fj - fi) * shift.z + offset.z
|
||||||
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider =
|
||||||
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
|
colliders.insert(collider, handle, bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = 200.0;
|
||||||
|
let ground_height = 0.1;
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
|
.translation(0.0, -ground_height, 0.0)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let cube_size = 1.0;
|
||||||
|
let hext = Vector3::repeat(cube_size);
|
||||||
|
let bottomy = cube_size * 50.0;
|
||||||
|
create_pyramid(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(-110.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_pyramid(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(-80.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_pyramid(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(-50.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_pyramid(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(-20.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_wall(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(-2.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_wall(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(4.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_wall(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(10.0, bottomy, 0.0),
|
||||||
|
12,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
create_tower_circle(
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
Vector3::new(25.0, bottomy, 0.0),
|
||||||
|
8,
|
||||||
|
24,
|
||||||
|
hext,
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
88
benchmarks3d/trimesh3.rs
Normal file
88
benchmarks3d/trimesh3.rs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
use na::Point3;
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = 200.0f32;
|
||||||
|
let ground_height = 1.0;
|
||||||
|
let nsubdivs = 20;
|
||||||
|
|
||||||
|
let quad = rapier3d::ncollide::procedural::quad(ground_size, ground_size, nsubdivs, nsubdivs);
|
||||||
|
let indices = quad
|
||||||
|
.flat_indices()
|
||||||
|
.chunks(3)
|
||||||
|
.map(|is| Point3::new(is[0], is[2], is[1]))
|
||||||
|
.collect();
|
||||||
|
let mut vertices = quad.coords;
|
||||||
|
|
||||||
|
// ncollide generates a quad with `z` as the normal.
|
||||||
|
// so we switch z and y here and set a random altitude at each point.
|
||||||
|
for p in vertices.iter_mut() {
|
||||||
|
p.z = p.y;
|
||||||
|
p.y = (p.x.sin() + p.z.cos()) * ground_height;
|
||||||
|
|
||||||
|
if p.x.abs() == ground_size / 2.0 || p.z.abs() == ground_size / 2.0 {
|
||||||
|
p.y = 10.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::trimesh(vertices, indices).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let num = 8;
|
||||||
|
let rad = 1.0;
|
||||||
|
|
||||||
|
let shift = rad * 2.0 + rad;
|
||||||
|
let centerx = shift * (num / 2) as f32;
|
||||||
|
let centery = shift / 2.0;
|
||||||
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
|
for j in 0usize..47 {
|
||||||
|
for i in 0..num {
|
||||||
|
for k in 0usize..num {
|
||||||
|
let x = i as f32 * shift - centerx;
|
||||||
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
|
if j % 2 == 0 {
|
||||||
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
} else {
|
||||||
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(0.0, 10.0)
|
.translation(0.0, 10.0)
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(rigid_body);
|
let handle = physics.bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert(collider, handle, &mut physics.bodies);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new(status).translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new(status).translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,9 +56,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad * 1.5, rad)
|
let collider = ColliderBuilder::capsule_y(rad * 1.5, rad).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -50,10 +50,10 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(fk * shift, -fi * shift)
|
.translation(fk * shift, -fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,9 +54,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(-10.0 * rad, 1.5 + 0.8)
|
.translation(-10.0 * rad, 1.5 + 0.8)
|
||||||
.build();
|
.build();
|
||||||
let platform_handle = bodies.insert(platform_body);
|
let platform_handle = bodies.insert(platform_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad * 10.0, rad)
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, platform_handle, &mut bodies);
|
colliders.insert(collider, platform_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
||||||
@@ -58,7 +58,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Solid cube attached to the sensor which
|
// Solid cube attached to the sensor which
|
||||||
// other colliders can touch.
|
// other colliders can touch.
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, sensor_handle, &mut bodies);
|
colliders.insert(collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
// We create a collider desc without density because we don't
|
// We create a collider desc without density because we don't
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(fk * shift, -fi * shift)
|
.translation(fk * shift, -fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(x + fk * shift, y - fi * shift)
|
.translation(x + fk * shift, y - fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(0.0, 10.0, 0.0)
|
.translation(0.0, 10.0, 0.0)
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(rigid_body);
|
let handle = physics.bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert(collider, handle, &mut physics.bodies);
|
||||||
|
|||||||
@@ -11,24 +11,17 @@ use rapier_testbed3d::Testbed;
|
|||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
mod add_remove3;
|
mod add_remove3;
|
||||||
mod balls3;
|
|
||||||
mod boxes3;
|
|
||||||
mod capsules3;
|
|
||||||
mod compound3;
|
mod compound3;
|
||||||
mod debug_boxes3;
|
mod debug_boxes3;
|
||||||
mod debug_triangle3;
|
mod debug_triangle3;
|
||||||
mod domino3;
|
mod domino3;
|
||||||
mod heightfield3;
|
mod heightfield3;
|
||||||
mod joints3;
|
mod joints3;
|
||||||
mod kinematic3;
|
mod keva3;
|
||||||
mod pyramid3;
|
mod platform3;
|
||||||
|
mod primitives3;
|
||||||
mod sensor3;
|
mod sensor3;
|
||||||
mod stacks3;
|
mod stacks3;
|
||||||
mod stress_joint_ball3;
|
|
||||||
mod stress_joint_fixed3;
|
|
||||||
mod stress_joint_prismatic3;
|
|
||||||
mod stress_joint_revolute3;
|
|
||||||
mod stress_keva3;
|
|
||||||
mod trimesh3;
|
mod trimesh3;
|
||||||
|
|
||||||
fn demo_name_from_command_line() -> Option<String> {
|
fn demo_name_from_command_line() -> Option<String> {
|
||||||
@@ -69,31 +62,18 @@ pub fn main() {
|
|||||||
|
|
||||||
let mut builders: Vec<(_, fn(&mut Testbed))> = vec![
|
let mut builders: Vec<(_, fn(&mut Testbed))> = vec![
|
||||||
("Add remove", add_remove3::init_world),
|
("Add remove", add_remove3::init_world),
|
||||||
("Balls", balls3::init_world),
|
("Primitives", primitives3::init_world),
|
||||||
("Boxes", boxes3::init_world),
|
|
||||||
("Capsules", capsules3::init_world),
|
|
||||||
("Compound", compound3::init_world),
|
("Compound", compound3::init_world),
|
||||||
("Domino", domino3::init_world),
|
("Domino", domino3::init_world),
|
||||||
("Heightfield", heightfield3::init_world),
|
("Heightfield", heightfield3::init_world),
|
||||||
("Joints", joints3::init_world),
|
("Joints", joints3::init_world),
|
||||||
("Kinematic", kinematic3::init_world),
|
("Platform", platform3::init_world),
|
||||||
("Stacks", stacks3::init_world),
|
("Stacks", stacks3::init_world),
|
||||||
("Pyramid", pyramid3::init_world),
|
|
||||||
("Sensor", sensor3::init_world),
|
("Sensor", sensor3::init_world),
|
||||||
("Trimesh", trimesh3::init_world),
|
("Trimesh", trimesh3::init_world),
|
||||||
|
("Keva tower", keva3::init_world),
|
||||||
("(Debug) boxes", debug_boxes3::init_world),
|
("(Debug) boxes", debug_boxes3::init_world),
|
||||||
("(Debug) triangle", debug_triangle3::init_world),
|
("(Debug) triangle", debug_triangle3::init_world),
|
||||||
("(Stress test) joint ball", stress_joint_ball3::init_world),
|
|
||||||
("(Stress test) joint fixed", stress_joint_fixed3::init_world),
|
|
||||||
(
|
|
||||||
"(Stress test) joint revolute",
|
|
||||||
stress_joint_revolute3::init_world,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"(Stress test) joint prismatic",
|
|
||||||
stress_joint_prismatic3::init_world,
|
|
||||||
),
|
|
||||||
("(Stress test) keva tower", stress_keva3::init_world),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// Lexicographic sort, with stress tests moved at the end of the list.
|
// Lexicographic sort, with stress tests moved at the end of the list.
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
use na::Point3;
|
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
|
||||||
/*
|
|
||||||
* World
|
|
||||||
*/
|
|
||||||
let mut bodies = RigidBodySet::new();
|
|
||||||
let mut colliders = ColliderSet::new();
|
|
||||||
let joints = JointSet::new();
|
|
||||||
|
|
||||||
let rb = RigidBodyBuilder::new_dynamic().build();
|
|
||||||
let co = ColliderBuilder::cuboid(0.5, 0.5, 0.5).build();
|
|
||||||
let h = bodies.insert(rb);
|
|
||||||
colliders.insert(co, h, &mut bodies);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set up the testbed.
|
|
||||||
*/
|
|
||||||
testbed.set_world(bodies, colliders, joints);
|
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let testbed = Testbed::from_builders(0, vec![("Balls", init_world)]);
|
|
||||||
testbed.run()
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = 200.1;
|
let ground_size = 50.0;
|
||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
@@ -37,7 +37,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
|
let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
|
||||||
|
|
||||||
for j in 0usize..25 {
|
for j in 0usize..15 {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
for k in 0usize..num {
|
for k in 0usize..num {
|
||||||
let x = i as f32 * shift * 5.0 - centerx + offset;
|
let x = i as f32 * shift * 5.0 - centerx + offset;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(2.0, 0.1, 1.0).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(2.0, 0.1, 1.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(20.0, 0.1, 1.0).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(20.0, 0.1, 1.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -58,9 +58,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* rot;
|
* rot;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().position(position).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().position(position).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(thickness, width * 2.0, width)
|
let collider = ColliderBuilder::cuboid(thickness, width * 2.0, width).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
testbed.set_body_color(handle, colors[i % 2]);
|
testbed.set_body_color(handle, colors[i % 2]);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector3::new(200.0, 1.0, 200.0);
|
let ground_size = Vector3::new(100.0, 1.0, 100.0);
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
@@ -43,7 +43,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let centery = shift / 2.0;
|
let centery = shift / 2.0;
|
||||||
let centerz = shift * (num / 2) as f32;
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
for j in 0usize..47 {
|
for j in 0usize..20 {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
for k in 0usize..num {
|
for k in 0usize..num {
|
||||||
let x = i as f32 * shift - centerx;
|
let x = i as f32 * shift - centerx;
|
||||||
@@ -55,10 +55,10 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ fn create_fixed_joints(
|
|||||||
.translation(origin.x + fk * shift, origin.y, origin.z + fi * shift)
|
.translation(origin.x + fk * shift, origin.y, origin.z + fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert(collider, child_handle, bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
@@ -205,7 +205,7 @@ fn create_ball_joints(
|
|||||||
.translation(fk * shift, 0.0, fi * shift)
|
.translation(fk * shift, 0.0, fi * shift)
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert(collider, child_handle, bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
|
|||||||
144
examples3d/keva3.rs
Normal file
144
examples3d/keva3.rs
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
use na::{Point3, Vector3};
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn build_block(
|
||||||
|
testbed: &mut Testbed,
|
||||||
|
bodies: &mut RigidBodySet,
|
||||||
|
colliders: &mut ColliderSet,
|
||||||
|
half_extents: Vector3<f32>,
|
||||||
|
shift: Vector3<f32>,
|
||||||
|
mut numx: usize,
|
||||||
|
numy: usize,
|
||||||
|
mut numz: usize,
|
||||||
|
) {
|
||||||
|
let dimensions = [half_extents.xyz(), half_extents.zyx()];
|
||||||
|
let block_width = 2.0 * half_extents.z * numx as f32;
|
||||||
|
let block_height = 2.0 * half_extents.y * numy as f32;
|
||||||
|
let spacing = (half_extents.z * numx as f32 - half_extents.x) / (numz as f32 - 1.0);
|
||||||
|
let mut color0 = Point3::new(0.7, 0.5, 0.9);
|
||||||
|
let mut color1 = Point3::new(0.6, 1.0, 0.6);
|
||||||
|
|
||||||
|
for i in 0..numy {
|
||||||
|
std::mem::swap(&mut numx, &mut numz);
|
||||||
|
let dim = dimensions[i % 2];
|
||||||
|
let y = dim.y * i as f32 * 2.0;
|
||||||
|
|
||||||
|
for j in 0..numx {
|
||||||
|
let x = if i % 2 == 0 {
|
||||||
|
spacing * j as f32 * 2.0
|
||||||
|
} else {
|
||||||
|
dim.x * j as f32 * 2.0
|
||||||
|
};
|
||||||
|
|
||||||
|
for k in 0..numz {
|
||||||
|
let z = if i % 2 == 0 {
|
||||||
|
dim.z * k as f32 * 2.0
|
||||||
|
} else {
|
||||||
|
spacing * k as f32 * 2.0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(
|
||||||
|
x + dim.x + shift.x,
|
||||||
|
y + dim.y + shift.y,
|
||||||
|
z + dim.z + shift.z,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
|
colliders.insert(collider, handle, bodies);
|
||||||
|
|
||||||
|
testbed.set_body_color(handle, color0);
|
||||||
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the top.
|
||||||
|
let dim = half_extents.zxy();
|
||||||
|
|
||||||
|
for i in 0..(block_width / (dim.x as f32 * 2.0)) as usize {
|
||||||
|
for j in 0..(block_width / (dim.z as f32 * 2.0)) as usize {
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(
|
||||||
|
i as f32 * dim.x * 2.0 + dim.x + shift.x,
|
||||||
|
dim.y + shift.y + block_height,
|
||||||
|
j as f32 * dim.z * 2.0 + dim.z + shift.z,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
|
colliders.insert(collider, handle, bodies);
|
||||||
|
testbed.set_body_color(handle, color0);
|
||||||
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = 50.0;
|
||||||
|
let ground_height = 0.1;
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
|
.translation(0.0, -ground_height, 0.0)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let half_extents = Vector3::new(0.02, 0.1, 0.4) / 2.0 * 10.0;
|
||||||
|
let mut block_height = 0.0;
|
||||||
|
// These should only be set to odd values otherwise
|
||||||
|
// the blocks won't align in the nicest way.
|
||||||
|
let numy = [0, 9, 13, 17, 21, 41];
|
||||||
|
let mut num_blocks_built = 0;
|
||||||
|
|
||||||
|
for i in (1..=5).rev() {
|
||||||
|
let numx = i;
|
||||||
|
let numy = numy[i];
|
||||||
|
let numz = numx * 3 + 1;
|
||||||
|
let block_width = numx as f32 * half_extents.z * 2.0;
|
||||||
|
build_block(
|
||||||
|
testbed,
|
||||||
|
&mut bodies,
|
||||||
|
&mut colliders,
|
||||||
|
half_extents,
|
||||||
|
Vector3::new(-block_width / 2.0, block_height, -block_width / 2.0),
|
||||||
|
numx,
|
||||||
|
numy,
|
||||||
|
numz,
|
||||||
|
);
|
||||||
|
block_height += numy as f32 * half_extents.y * 2.0 + half_extents.x * 2.0;
|
||||||
|
num_blocks_built += numx * numy * numz;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Num keva blocks: {}", num_blocks_built);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
@@ -45,7 +45,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -58,9 +58,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
.translation(0.0, 1.5 + 0.8, -10.0 * rad)
|
.translation(0.0, 1.5 + 0.8, -10.0 * rad)
|
||||||
.build();
|
.build();
|
||||||
let platform_handle = bodies.insert(platform_body);
|
let platform_handle = bodies.insert(platform_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad * 10.0, rad, rad * 10.0)
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad, rad * 10.0).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, platform_handle, &mut bodies);
|
colliders.insert(collider, platform_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
75
examples3d/primitives3.rs
Normal file
75
examples3d/primitives3.rs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
use na::Point3;
|
||||||
|
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
||||||
|
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
||||||
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
|
/*
|
||||||
|
* World
|
||||||
|
*/
|
||||||
|
let mut bodies = RigidBodySet::new();
|
||||||
|
let mut colliders = ColliderSet::new();
|
||||||
|
let joints = JointSet::new();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ground
|
||||||
|
*/
|
||||||
|
let ground_size = 100.1;
|
||||||
|
let ground_height = 0.1;
|
||||||
|
|
||||||
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
|
.translation(0.0, -ground_height, 0.0)
|
||||||
|
.build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the cubes
|
||||||
|
*/
|
||||||
|
let num = 8;
|
||||||
|
let rad = 1.0;
|
||||||
|
|
||||||
|
let shift = rad * 2.0 + rad;
|
||||||
|
let centerx = shift * (num / 2) as f32;
|
||||||
|
let centery = shift / 2.0;
|
||||||
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
|
let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
|
||||||
|
|
||||||
|
for j in 0usize..20 {
|
||||||
|
for i in 0..num {
|
||||||
|
for k in 0usize..num {
|
||||||
|
let x = i as f32 * shift - centerx + offset;
|
||||||
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
let z = k as f32 * shift - centerz + offset;
|
||||||
|
|
||||||
|
// Build the rigid body.
|
||||||
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
|
let collider = match j % 2 {
|
||||||
|
0 => ColliderBuilder::cuboid(rad, rad, rad).build(),
|
||||||
|
1 => ColliderBuilder::ball(rad).build(),
|
||||||
|
// 2 => ColliderBuilder::capsule_y(rad, rad).build(),
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset -= 0.05 * rad * (num as f32 - 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the testbed.
|
||||||
|
*/
|
||||||
|
testbed.set_world(bodies, colliders, joints);
|
||||||
|
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
|
||||||
|
testbed.run()
|
||||||
|
}
|
||||||
@@ -43,7 +43,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
||||||
@@ -56,13 +56,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Rigid body so that the sensor can move.
|
// Rigid body so that the sensor can move.
|
||||||
let sensor = RigidBodyBuilder::new_dynamic()
|
let sensor = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 10.0, 0.0)
|
.translation(0.0, 5.0, 0.0)
|
||||||
.build();
|
.build();
|
||||||
let sensor_handle = bodies.insert(sensor);
|
let sensor_handle = bodies.insert(sensor);
|
||||||
|
|
||||||
// Solid cube attached to the sensor which
|
// Solid cube attached to the sensor which
|
||||||
// other colliders can touch.
|
// other colliders can touch.
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, sensor_handle, &mut bodies);
|
colliders.insert(collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
// We create a collider desc without density because we don't
|
// We create a collider desc without density because we don't
|
||||||
|
|||||||
@@ -27,9 +27,8 @@ fn create_tower_circle(
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().position(pos).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().position(pos).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z)
|
let collider =
|
||||||
.density(1.0)
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,9 +54,8 @@ fn create_wall(
|
|||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z)
|
let collider =
|
||||||
.density(1.0)
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,9 +86,7 @@ fn create_pyramid(
|
|||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z)
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
.density(1.0)
|
|
||||||
.build();
|
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,27 +120,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let cube_size = 1.0;
|
let cube_size = 1.0;
|
||||||
let hext = Vector3::repeat(cube_size);
|
let hext = Vector3::repeat(cube_size);
|
||||||
let bottomy = cube_size * 50.0;
|
let bottomy = cube_size * 50.0;
|
||||||
create_pyramid(
|
|
||||||
&mut bodies,
|
|
||||||
&mut colliders,
|
|
||||||
Vector3::new(-110.0, bottomy, 0.0),
|
|
||||||
12,
|
|
||||||
hext,
|
|
||||||
);
|
|
||||||
create_pyramid(
|
|
||||||
&mut bodies,
|
|
||||||
&mut colliders,
|
|
||||||
Vector3::new(-80.0, bottomy, 0.0),
|
|
||||||
12,
|
|
||||||
hext,
|
|
||||||
);
|
|
||||||
create_pyramid(
|
|
||||||
&mut bodies,
|
|
||||||
&mut colliders,
|
|
||||||
Vector3::new(-50.0, bottomy, 0.0),
|
|
||||||
12,
|
|
||||||
hext,
|
|
||||||
);
|
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = 200.0f32;
|
let ground_size = 100.0f32;
|
||||||
let ground_height = 1.0;
|
let ground_height = 1.0;
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let centery = shift / 2.0;
|
let centery = shift / 2.0;
|
||||||
let centerz = shift * (num / 2) as f32;
|
let centerz = shift * (num / 2) as f32;
|
||||||
|
|
||||||
for j in 0usize..47 {
|
for j in 0usize..20 {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
for k in 0usize..num {
|
for k in 0usize..num {
|
||||||
let x = i as f32 * shift - centerx;
|
let x = i as f32 * shift - centerx;
|
||||||
@@ -65,10 +65,10 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).density(1.0).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).density(1.0).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ pub struct ColliderBuilder {
|
|||||||
/// The shape of the collider to be built.
|
/// The shape of the collider to be built.
|
||||||
pub shape: Shape,
|
pub shape: Shape,
|
||||||
/// The density of the collider to be built.
|
/// The density of the collider to be built.
|
||||||
pub density: f32,
|
density: Option<f32>,
|
||||||
/// The friction coefficient of the collider to be built.
|
/// The friction coefficient of the collider to be built.
|
||||||
pub friction: f32,
|
pub friction: f32,
|
||||||
/// The restitution coefficient of the collider to be built.
|
/// The restitution coefficient of the collider to be built.
|
||||||
@@ -228,7 +228,7 @@ impl ColliderBuilder {
|
|||||||
pub fn new(shape: Shape) -> Self {
|
pub fn new(shape: Shape) -> Self {
|
||||||
Self {
|
Self {
|
||||||
shape,
|
shape,
|
||||||
density: 1.0,
|
density: None,
|
||||||
friction: Self::default_friction(),
|
friction: Self::default_friction(),
|
||||||
restitution: 0.0,
|
restitution: 0.0,
|
||||||
delta: Isometry::identity(),
|
delta: Isometry::identity(),
|
||||||
@@ -236,6 +236,12 @@ impl ColliderBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The density of the collider being built.
|
||||||
|
pub fn get_density(&self) -> f32 {
|
||||||
|
let default_density = if self.is_sensor { 0.0 } else { 1.0 };
|
||||||
|
self.density.unwrap_or(default_density)
|
||||||
|
}
|
||||||
|
|
||||||
/// Initialize a new collider builder with a ball shape defined by its radius.
|
/// Initialize a new collider builder with a ball shape defined by its radius.
|
||||||
pub fn ball(radius: f32) -> Self {
|
pub fn ball(radius: f32) -> Self {
|
||||||
Self::new(Shape::Ball(Ball::new(radius)))
|
Self::new(Shape::Ball(Ball::new(radius)))
|
||||||
@@ -349,7 +355,7 @@ impl ColliderBuilder {
|
|||||||
|
|
||||||
/// Sets the density of the collider this builder will build.
|
/// Sets the density of the collider this builder will build.
|
||||||
pub fn density(mut self, density: f32) -> Self {
|
pub fn density(mut self, density: f32) -> Self {
|
||||||
self.density = density;
|
self.density = Some(density);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,9 +401,11 @@ impl ColliderBuilder {
|
|||||||
|
|
||||||
/// Buildes a new collider attached to the given rigid-body.
|
/// Buildes a new collider attached to the given rigid-body.
|
||||||
pub fn build(&self) -> Collider {
|
pub fn build(&self) -> Collider {
|
||||||
|
let density = self.get_density();
|
||||||
|
|
||||||
Collider {
|
Collider {
|
||||||
shape: self.shape.clone(),
|
shape: self.shape.clone(),
|
||||||
density: self.density,
|
density,
|
||||||
friction: self.friction,
|
friction: self.friction,
|
||||||
restitution: self.restitution,
|
restitution: self.restitution,
|
||||||
delta: self.delta,
|
delta: self.delta,
|
||||||
|
|||||||
Reference in New Issue
Block a user