aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-10-27 09:57:26 +0100
committerGitHub <noreply@github.com>2020-10-27 09:57:26 +0100
commit93153f5d93358e83c8a4ca2b7195bf9aae95ffb9 (patch)
tree16ccb1aedc30d5c09d59e6ee5c7faa987e67b202
parentf8acf6a5e9d3ba537dac6502b0e0541236b418c5 (diff)
parentffbc3c02c7d328d5c48a3efb84d35f5911f1880b (diff)
downloadrapier-93153f5d93358e83c8a4ca2b7195bf9aae95ffb9.tar.gz
rapier-93153f5d93358e83c8a4ca2b7195bf9aae95ffb9.tar.bz2
rapier-93153f5d93358e83c8a4ca2b7195bf9aae95ffb9.zip
Merge pull request #41 from dimforge/cylinder
Add cylinder and cone support + use a trait-object for shapes.
-rw-r--r--.github/workflows/rapier-ci-bench.yml4
-rw-r--r--Cargo.toml5
-rw-r--r--benchmarks2d/Cargo.toml2
-rw-r--r--benchmarks3d/Cargo.toml2
-rw-r--r--build/rapier2d/Cargo.toml16
-rw-r--r--build/rapier3d/Cargo.toml17
-rw-r--r--build/rapier_testbed2d/Cargo.toml10
-rw-r--r--build/rapier_testbed3d/Cargo.toml14
-rw-r--r--examples2d/Cargo.toml2
-rw-r--r--examples3d/Cargo.toml2
-rw-r--r--examples3d/all_examples3.rs2
-rw-r--r--examples3d/debug_cylinder3.rs65
-rw-r--r--examples3d/heightfield3.rs18
-rw-r--r--examples3d/primitives3.rs27
-rw-r--r--examples3d/trimesh3.rs18
-rw-r--r--src/dynamics/mass_properties.rs4
-rw-r--r--src/dynamics/mass_properties_capsule.rs23
-rw-r--r--src/dynamics/mass_properties_cone.rs29
-rw-r--r--src/dynamics/mass_properties_cylinder.rs40
-rw-r--r--src/dynamics/mass_properties_polygon.rs2
-rw-r--r--src/dynamics/mod.rs3
-rw-r--r--src/dynamics/rigid_body.rs3
-rw-r--r--src/geometry/broad_phase_multi_sap.rs16
-rw-r--r--src/geometry/capsule.rs86
-rw-r--r--src/geometry/collider.rs378
-rw-r--r--src/geometry/contact.rs21
-rw-r--r--src/geometry/contact_generator/ball_convex_contact_generator.rs23
-rw-r--r--src/geometry/contact_generator/capsule_capsule_contact_generator.rs39
-rw-r--r--src/geometry/contact_generator/contact_dispatcher.rs76
-rw-r--r--src/geometry/contact_generator/contact_generator.rs8
-rw-r--r--src/geometry/contact_generator/cuboid_capsule_contact_generator.rs11
-rw-r--r--src/geometry/contact_generator/cuboid_cuboid_contact_generator.rs4
-rw-r--r--src/geometry/contact_generator/cuboid_triangle_contact_generator.rs8
-rw-r--r--src/geometry/contact_generator/heightfield_shape_contact_generator.rs39
-rw-r--r--src/geometry/contact_generator/mod.rs13
-rw-r--r--src/geometry/contact_generator/pfm_pfm_contact_generator.rs119
-rw-r--r--src/geometry/contact_generator/polygon_polygon_contact_generator.rs35
-rw-r--r--src/geometry/contact_generator/trimesh_shape_contact_generator.rs11
-rw-r--r--src/geometry/mod.rs27
-rw-r--r--src/geometry/narrow_phase.rs12
-rw-r--r--src/geometry/polygon.rs2
-rw-r--r--src/geometry/polygonal_feature_map.rs132
-rw-r--r--src/geometry/polyhedron_feature3d.rs155
-rw-r--r--src/geometry/proximity_detector/ball_convex_proximity_detector.rs20
-rw-r--r--src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs4
-rw-r--r--src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs8
-rw-r--r--src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs29
-rw-r--r--src/geometry/proximity_detector/proximity_detector.rs8
-rw-r--r--src/geometry/proximity_detector/proximity_dispatcher.rs40
-rw-r--r--src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs11
-rw-r--r--src/geometry/round_cylinder.rs107
-rw-r--r--src/geometry/sat.rs105
-rw-r--r--src/geometry/shape.rs390
-rw-r--r--src/geometry/trimesh.rs45
-rw-r--r--src/lib.rs1
-rw-r--r--src/pipeline/query_pipeline.rs12
-rw-r--r--src/utils.rs6
-rw-r--r--src_testbed/box2d_backend.rs76
-rw-r--r--src_testbed/engine.rs88
-rw-r--r--src_testbed/nphysics_backend.rs51
-rw-r--r--src_testbed/objects/cone.rs74
-rw-r--r--src_testbed/objects/cylinder.rs74
-rw-r--r--src_testbed/objects/mod.rs2
-rw-r--r--src_testbed/objects/node.rs18
-rw-r--r--src_testbed/physx_backend.rs45
-rw-r--r--src_testbed/testbed.rs4
66 files changed, 2102 insertions, 639 deletions
diff --git a/.github/workflows/rapier-ci-bench.yml b/.github/workflows/rapier-ci-bench.yml
index 9cce1b2..6c4f007 100644
--- a/.github/workflows/rapier-ci-bench.yml
+++ b/.github/workflows/rapier-ci-bench.yml
@@ -18,15 +18,17 @@ jobs:
BENCHBOT_TARGET_COMMIT: ${{ github.event.pull_request.head.sha }}
BENCHBOT_SHA: ${{ github.sha }}
BENCHBOT_HEAD_REF: ${{github.head_ref}}
+ BENCHBOT_OTHER_BACKENDS: false
runs-on: ubuntu-latest
steps:
- name: Find commit SHA
if: github.ref == 'refs/heads/master'
run: |
echo "::set-env name=BENCHBOT_TARGET_COMMIT::$BENCHBOT_SHA"
+ echo "::set-env name=BENCHBOT_OTHER_BACKENDS::true"
- name: Send 3D bench message
shell: bash
run: curl -u $BENCHBOT_AMQP_USER:$BENCHBOT_AMQP_PASS
-i -H "content-type:application/json" -X POST
https://$BENCHBOT_AMQP_HOST/api/exchanges/$BENCHBOT_AMQP_VHOST//publish
- -d'{"properties":{},"routing_key":"benchmark","payload":"{ \"repository\":\"https://github.com/'$BENCHBOT_TARGET_REPO'\", \"branch\":\"'$GITHUB_REF'\", \"commit\":\"'$BENCHBOT_TARGET_COMMIT'\" }","payload_encoding":"string"}' \ No newline at end of file
+ -d'{"properties":{},"routing_key":"benchmark","payload":"{ \"repository\":\"https://github.com/'$BENCHBOT_TARGET_REPO'\", \"branch\":\"'$GITHUB_REF'\", \"commit\":\"'$BENCHBOT_TARGET_COMMIT'\", \"other_backends\":'$BENCHBOT_OTHER_BACKENDS' }","payload_encoding":"string"}' \ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index 944fa40..cfb166a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,6 +5,11 @@ members = [ "build/rapier2d", "build/rapier_testbed2d", "examples2d", "benchmark
[patch.crates-io]
#wrapped2d = { git = "https://github.com/Bastacyclop/rust_box2d.git" }
#simba = { path = "../simba" }
+#ncollide2d = { path = "../ncollide/build/ncollide2d" }
+#ncollide3d = { path = "../ncollide/build/ncollide3d" }
+#nphysics2d = { path = "../nphysics/build/nphysics2d" }
+#nphysics3d = { path = "../nphysics/build/nphysics3d" }
+#kiss3d = { path = "../kiss3d" }
[profile.release]
#debug = true
diff --git a/benchmarks2d/Cargo.toml b/benchmarks2d/Cargo.toml
index b1ee8db..90a6326 100644
--- a/benchmarks2d/Cargo.toml
+++ b/benchmarks2d/Cargo.toml
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier2d/enhanced-determinism" ]
[dependencies]
rand = "0.7"
Inflector = "0.11"
-nalgebra = "0.22"
+nalgebra = "0.23"
[dependencies.rapier_testbed2d]
path = "../build/rapier_testbed2d"
diff --git a/benchmarks3d/Cargo.toml b/benchmarks3d/Cargo.toml
index 81c843a..03194df 100644
--- a/benchmarks3d/Cargo.toml
+++ b/benchmarks3d/Cargo.toml
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
[dependencies]
rand = "0.7"
Inflector = "0.11"
-nalgebra = "0.22"
+nalgebra = "0.23"
[dependencies.rapier_testbed3d]
path = "../build/rapier_testbed3d"
diff --git a/build/rapier2d/Cargo.toml b/build/rapier2d/Cargo.toml
index 6d60b37..d6e5a29 100644
--- a/build/rapier2d/Cargo.toml
+++ b/build/rapier2d/Cargo.toml
@@ -1,4 +1,3 @@
-# Name idea: bident for 2D and trident for 3D
[package]
name = "rapier2d"
version = "0.2.1"
@@ -22,7 +21,7 @@ simd-nightly = [ "simba/packed_simd", "simd-is-enabled" ]
# enabled with the "simd-stable" or "simd-nightly" feature.
simd-is-enabled = [ ]
wasm-bindgen = [ "instant/wasm-bindgen" ]
-serde-serialize = [ "nalgebra/serde-serialize", "ncollide2d/serde-serialize", "serde", "generational-arena/serde", "bit-vec/serde", "arrayvec/serde" ]
+serde-serialize = [ "erased-serde", "nalgebra/serde-serialize", "ncollide2d/serde-serialize", "serde", "generational-arena/serde", "bit-vec/serde", "arrayvec/serde" ]
enhanced-determinism = [ "simba/libm_force", "indexmap" ]
[lib]
@@ -35,18 +34,21 @@ required-features = [ "dim2" ]
vec_map = "0.8"
instant = { version = "0.1", features = [ "now" ]}
num-traits = "0.2"
-nalgebra = "0.22"
-ncollide2d = "0.24"
-simba = "^0.2.1"
-approx = "0.3"
+nalgebra = "0.23"
+ncollide2d = "0.26"
+simba = "0.3"
+approx = "0.4"
rayon = { version = "1", optional = true }
-crossbeam = "0.7"
+crossbeam = "0.8"
generational-arena = "0.2"
arrayvec = "0.5"
bit-vec = "0.6"
rustc-hash = "1"
serde = { version = "1", features = [ "derive" ], optional = true }
+erased-serde = { version = "0.3", optional = true }
indexmap = { version = "1", features = [ "serde-1" ], optional = true }
+downcast-rs = "1.2"
+num-derive = "0.3"
[dev-dependencies]
bincode = "1"
diff --git a/build/rapier3d/Cargo.toml b/build/rapier3d/Cargo.toml
index dcc2125..e9b9808 100644
--- a/build/rapier3d/Cargo.toml
+++ b/build/rapier3d/Cargo.toml
@@ -1,4 +1,3 @@
-# Name idea: bident for 2D and trident for 3D
[package]
name = "rapier3d"
version = "0.2.1"
@@ -22,7 +21,7 @@ simd-nightly = [ "simba/packed_simd", "simd-is-enabled" ]
# enabled with the "simd-stable" or "simd-nightly" feature.
simd-is-enabled = [ ]
wasm-bindgen = [ "instant/wasm-bindgen" ]
-serde-serialize = [ "nalgebra/serde-serialize", "ncollide3d/serde-serialize", "serde", "generational-arena/serde", "bit-vec/serde" ]
+serde-serialize = [ "erased-serde", "nalgebra/serde-serialize", "ncollide3d/serde-serialize", "serde", "generational-arena/serde", "bit-vec/serde" ]
enhanced-determinism = [ "simba/libm_force", "indexmap" ]
[lib]
@@ -35,18 +34,22 @@ required-features = [ "dim3" ]
vec_map = "0.8"
instant = { version = "0.1", features = [ "now" ]}
num-traits = "0.2"
-nalgebra = "0.22"
-ncollide3d = "0.24"
-simba = "^0.2.1"
-approx = "0.3"
+nalgebra = "0.23"
+ncollide3d = "0.26"
+simba = "0.3"
+approx = "0.4"
rayon = { version = "1", optional = true }
-crossbeam = "0.7"
+crossbeam = "0.8"
generational-arena = "0.2"
arrayvec = "0.5"
bit-vec = "0.6"
rustc-hash = "1"
serde = { version = "1", features = [ "derive" ], optional = true }
+erased-serde = { version = "0.3", optional = true }
indexmap = { version = "1", features = [ "serde-1" ], optional = true }
+downcast-rs = "1.2"
+num-derive = "0.3"
+
[dev-dependencies]
bincode = "1"
diff --git a/build/rapier_testbed2d/Cargo.toml b/build/rapier_testbed2d/Cargo.toml
index eeecb2a..87610c3 100644
--- a/build/rapier_testbed2d/Cargo.toml
+++ b/build/rapier_testbed2d/Cargo.toml
@@ -23,17 +23,17 @@ other-backends = [ "wrapped2d", "nphysics2d" ]
[dependencies]
-nalgebra = "0.22"
-kiss3d = { version = "0.25", features = [ "conrod" ] }
+nalgebra = "0.23"
+kiss3d = { version = "0.27", features = [ "conrod" ] }
rand = "0.7"
rand_pcg = "0.2"
instant = { version = "0.1", features = [ "web-sys", "now" ]}
bitflags = "1"
num_cpus = { version = "1", optional = true }
wrapped2d = { version = "0.4", optional = true }
-ncollide2d = "0.24"
-nphysics2d = { version = "0.17", optional = true }
-crossbeam = "0.7"
+ncollide2d = "0.26"
+nphysics2d = { version = "0.18", optional = true }
+crossbeam = "0.8"
bincode = "1"
flexbuffers = "0.1"
Inflector = "0.11"
diff --git a/build/rapier_testbed3d/Cargo.toml b/build/rapier_testbed3d/Cargo.toml
index 7675701..e99d741 100644
--- a/build/rapier_testbed3d/Cargo.toml
+++ b/build/rapier_testbed3d/Cargo.toml
@@ -22,19 +22,19 @@ parallel = [ "rapier3d/parallel", "num_cpus" ]
other-backends = [ "physx", "physx-sys", "glam", "nphysics3d" ]
[dependencies]
-nalgebra = "0.22"
-kiss3d = { version = "0.25", features = [ "conrod" ] }
+nalgebra = "0.23"
+kiss3d = { version = "0.27", features = [ "conrod" ] }
rand = "0.7"
rand_pcg = "0.2"
instant = { version = "0.1", features = [ "web-sys", "now" ]}
bitflags = "1"
-glam = { version = "0.8", optional = true }
+glam = { version = "0.9", optional = true }
num_cpus = { version = "1", optional = true }
-ncollide3d = "0.24"
-nphysics3d = { version = "0.17", optional = true }
-physx = { version = "0.6", optional = true }
+ncollide3d = "0.26"
+nphysics3d = { version = "0.18", optional = true }
+physx = { version = "0.7", optional = true }
physx-sys = { version = "0.4", optional = true }
-crossbeam = "0.7"
+crossbeam = "0.8"
bincode = "1"
flexbuffers = "0.1"
serde_cbor = "0.11"
diff --git a/examples2d/Cargo.toml b/examples2d/Cargo.toml
index ad63958..f1ed728 100644
--- a/examples2d/Cargo.toml
+++ b/examples2d/Cargo.toml
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier2d/enhanced-determinism" ]
[dependencies]
rand = "0.7"
Inflector = "0.11"
-nalgebra = "0.22"
+nalgebra = "0.23"
[dependencies.rapier_testbed2d]
path = "../build/rapier_testbed2d"
diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml
index efc3cce..5362554 100644
--- a/examples3d/Cargo.toml
+++ b/examples3d/Cargo.toml
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
[dependencies]
rand = "0.7"
Inflector = "0.11"
-nalgebra = "0.22"
+nalgebra = "0.23"
[dependencies.rapier_testbed3d]
path = "../build/rapier_testbed3d"
diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs
index 64eb5b6..85b2504 100644
--- a/examples3d/all_examples3.rs
+++ b/examples3d/all_examples3.rs
@@ -13,6 +13,7 @@ use std::cmp::Ordering;
mod add_remove3;
mod compound3;
mod debug_boxes3;
+mod debug_cylinder3;
mod debug_triangle3;
mod debug_trimesh3;
mod domino3;
@@ -76,6 +77,7 @@ pub fn main() {
("(Debug) boxes", debug_boxes3::init_world),
("(Debug) triangle", debug_triangle3::init_world),
("(Debug) trimesh", debug_trimesh3::init_world),
+ ("(Debug) cylinder", debug_cylinder3::init_world),
];
// Lexicographic sort, with stress tests moved at the end of the list.
diff --git a/examples3d/debug_cylinder3.rs b/examples3d/debug_cylinder3.rs
new file mode 100644
index 0000000..0717c67
--- /dev/null
+++ b/examples3d/debug_cylinder3.rs
@@ -0,0 +1,65 @@
+use na::Point3;
+use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
+use rapier3d::geometry::{ColliderBuilder, ColliderSet};
+use rapier_testbed3d::Testbed;
+
+// This shows a bug when a cylinder is in contact with a very large
+// but very thin cuboid. In this case the EPA returns an incorrect
+// contact normal, resulting in the cylinder falling through the floor.
+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 = 1;
+ let rad = 1.0;
+
+ let shiftx = rad * 2.0 + rad;
+ let shifty = rad * 2.0 + rad;
+ let shiftz = rad * 2.0 + rad;
+ let centerx = shiftx * (num / 2) as f32;
+ let centery = shifty / 2.0;
+ let centerz = shiftz * (num / 2) as f32;
+
+ let offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
+
+ let x = -centerx + offset;
+ let y = centery + 3.0;
+ let z = -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 = ColliderBuilder::cylinder(rad, 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()
+}
diff --git a/examples3d/heightfield3.rs b/examples3d/heightfield3.rs
index 09df815..6af93c7 100644
--- a/examples3d/heightfield3.rs
+++ b/examples3d/heightfield3.rs
@@ -54,13 +54,17 @@ pub fn init_world(testbed: &mut Testbed) {
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);
- }
+ let collider = match j % 5 {
+ 0 => ColliderBuilder::cuboid(rad, rad, rad).build(),
+ 1 => ColliderBuilder::ball(rad).build(),
+ // Rounded cylinders are much more efficient that cylinder, even if the
+ // rounding margin is small.
+ 2 => ColliderBuilder::round_cylinder(rad, rad, rad / 10.0).build(),
+ 3 => ColliderBuilder::cone(rad, rad).build(),
+ _ => ColliderBuilder::capsule_y(rad, rad).build(),
+ };
+
+ colliders.insert(collider, handle, &mut bodies);
}
}
}
diff --git a/examples3d/primitives3.rs b/examples3d/primitives3.rs
index cf678b9..db15341 100644
--- a/examples3d/primitives3.rs
+++ b/examples3d/primitives3.rs
@@ -15,7 +15,7 @@ pub fn init_world(testbed: &mut Testbed) {
* Ground
*/
let ground_size = 100.1;
- let ground_height = 0.1;
+ let ground_height = 2.1;
let rigid_body = RigidBodyBuilder::new_static()
.translation(0.0, -ground_height, 0.0)
@@ -30,29 +30,34 @@ pub fn init_world(testbed: &mut Testbed) {
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 shiftx = rad * 2.0 + rad;
+ let shifty = rad * 2.0 + rad;
+ let shiftz = rad * 2.0 + rad;
+ let centerx = shiftx * (num / 2) as f32;
+ let centery = shifty / 2.0;
+ let centerz = shiftz * (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;
+ let x = i as f32 * shiftx - centerx + offset;
+ let y = j as f32 * shifty + centery + 3.0;
+ let z = k as f32 * shiftz - 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 {
+ let collider = match j % 5 {
0 => ColliderBuilder::cuboid(rad, rad, rad).build(),
1 => ColliderBuilder::ball(rad).build(),
- // 2 => ColliderBuilder::capsule_y(rad, rad).build(),
- _ => unreachable!(),
+ // Rounded cylinders are much more efficient that cylinder, even if the
+ // rounding margin is small.
+ 2 => ColliderBuilder::round_cylinder(rad, rad, rad / 10.0).build(),
+ 3 => ColliderBuilder::cone(rad, rad).build(),
+ _ => ColliderBuilder::capsule_y(rad, rad).build(),
};
colliders.insert(collider, handle, &mut bodies);
diff --git a/examples3d/trimesh3.rs b/examples3d/trimesh3.rs
index d022a1f..2a96bda 100644
--- a/examples3d/trimesh3.rs
+++ b/examples3d/trimesh3.rs
@@ -64,13 +64,17 @@ pub fn init_world(testbed: &mut Testbed) {
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);
- }
+ let collider = match j % 5 {
+ 0 => ColliderBuilder::cuboid(rad, rad, rad).build(),
+ 1 => ColliderBuilder::ball(rad).build(),
+ // Rounded cylinders are much more efficient that cylinder, even if the
+ // rounding margin is small.
+ 2 => ColliderBuilder::round_cylinder(rad, rad, rad / 10.0).build(),
+ 3 => ColliderBuilder::cone(rad, rad).build(),
+ _ => ColliderBuilder::capsule_y(rad, rad).build(),
+ };
+
+ colliders.insert(collider, handle, &mut bodies);
}
}
}