From 9bf1321f8f1d2e116f44c2461a53f302c4ef4171 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 8 Dec 2020 17:31:49 +0100 Subject: Outsource the contact manifold, SAT, and some shapes. --- examples3d/trimesh3.rs | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) (limited to 'examples3d') diff --git a/examples3d/trimesh3.rs b/examples3d/trimesh3.rs index 0cee465..d753988 100644 --- a/examples3d/trimesh3.rs +++ b/examples3d/trimesh3.rs @@ -1,6 +1,6 @@ -use na::{ComplexField, Point3}; +use na::{ComplexField, DMatrix, Point3, Vector3}; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; -use rapier3d::geometry::{ColliderBuilder, ColliderSet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet, HeightField}; use rapier_testbed3d::Testbed; pub fn init_world(testbed: &mut Testbed) { @@ -14,31 +14,27 @@ pub fn init_world(testbed: &mut Testbed) { /* * Ground */ - let ground_size = 100.0f32; - let ground_height = 1.0; + let ground_size = Vector3::new(100.0, 1.0, 100.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; + 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); - // 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; - // NOTE: make sure we use the sin/cos from simba to ensure - // cross-platform determinism of the example when the - // enhanced_determinism feature is enabled. - p.y = (::sin(p.x) + ::cos(p.z)) * ground_height; - - if p.x.abs() == ground_size / 2.0 || p.z.abs() == ground_size / 2.0 { - p.y = 10.0; + // NOTE: make sure we use the sin/cos from simba to ensure + // cross-platform determinism of the example when the + // enhanced_determinism feature is enabled. + ::sin(x) + ::cos(z) } - } + }); + + // Here we will build our trimesh from the mesh representation of an + // heightfield. + let heightfield = HeightField::new(heights, ground_size); + let (vertices, indices) = heightfield.to_trimesh(); let rigid_body = RigidBodyBuilder::new_static().build(); let handle = bodies.insert(rigid_body); -- cgit From cc6d1b973002b4d366bc81ec6bf9e8240ad7b404 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 14 Dec 2020 15:51:43 +0100 Subject: Outsource the Shape trait, wquadtree, and shape types. --- examples3d/all_examples3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples3d') diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs index 4bc15a8..2c8e5c6 100644 --- a/examples3d/all_examples3.rs +++ b/examples3d/all_examples3.rs @@ -84,7 +84,7 @@ pub fn main() { ("Restitution", restitution3::init_world), ("Stacks", stacks3::init_world), ("Sensor", sensor3::init_world), - ("Trimesh", trimesh3::init_world), + ("TriMesh", trimesh3::init_world), ("Keva tower", keva3::init_world), ( "(Debug) add/rm collider", -- cgit From 29717c2887b2db39faf9c25053730b661dc5da2b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Thu, 17 Dec 2020 13:23:00 +0100 Subject: Externalize the proximity code (renamed intersection). --- examples3d/sensor3.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'examples3d') diff --git a/examples3d/sensor3.rs b/examples3d/sensor3.rs index 7b218fe..234eaf3 100644 --- a/examples3d/sensor3.rs +++ b/examples3d/sensor3.rs @@ -1,6 +1,6 @@ use na::Point3; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; -use rapier3d::geometry::{ColliderBuilder, ColliderSet, Proximity}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet}; use rapier_testbed3d::Testbed; pub fn init_world(testbed: &mut Testbed) { @@ -74,10 +74,11 @@ pub fn init_world(testbed: &mut Testbed) { // Callback that will be executed on the main loop to handle proximities. testbed.add_callback(move |_, physics, events, graphics, _| { - while let Ok(prox) = events.proximity_events.try_recv() { - let color = match prox.new_status { - Proximity::WithinMargin | Proximity::Intersecting => Point3::new(1.0, 1.0, 0.0), - Proximity::Disjoint => Point3::new(0.5, 0.5, 1.0), + while let Ok(prox) = events.intersection_events.try_recv() { + let color = if prox.intersecting { + Point3::new(1.0, 1.0, 0.0) + } else { + Point3::new(0.5, 0.5, 1.0) }; let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent(); -- cgit From ed529fb8dd2cfeb9020a8cffd5b825d7d1f8ce92 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 29 Dec 2020 11:42:57 +0100 Subject: Move the harness example to the examples folder. --- examples3d/Cargo.toml | 4 +++ examples3d/harness_capsules3.rs | 72 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 examples3d/harness_capsules3.rs (limited to 'examples3d') diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml index 5362554..46fbca6 100644 --- a/examples3d/Cargo.toml +++ b/examples3d/Cargo.toml @@ -25,3 +25,7 @@ path = "../build/rapier3d" [[bin]] name = "all_examples3" path = "./all_examples3.rs" + +[[bin]] +name = "harness_capsules3" +path = "./harness_capsules3.rs" diff --git a/examples3d/harness_capsules3.rs b/examples3d/harness_capsules3.rs new file mode 100644 index 0000000..4632811 --- /dev/null +++ b/examples3d/harness_capsules3.rs @@ -0,0 +1,72 @@ +extern crate nalgebra as na; + +use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet}; +use rapier_testbed3d::harness::Harness; + +pub fn init_world(harness: &mut Harness) { + /* + * 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 = 1.0; + + let shift = rad * 2.0 + rad; + let shifty = rad * 4.0; + 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..47 { + for i in 0..num { + for k in 0usize..num { + let x = i as f32 * shift - centerx + offset; + let y = j as f32 * shifty + 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 = ColliderBuilder::capsule_y(rad, rad).build(); + colliders.insert(collider, handle, &mut bodies); + } + } + + offset -= 0.05 * rad * (num as f32 - 1.0); + } + + /* + * Set up the harness. + */ + harness.set_world(bodies, colliders, joints); +} + +fn main() { + let harness = &mut Harness::new_empty(); + init_world(harness); + harness.set_max_steps(10000); + harness.run(); + println!("{}", harness.state.timestep_id); +} -- cgit From aa61fe65e3ff0289ecab57b4053a3410cf6d4a87 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 4 Jan 2021 15:14:25 +0100 Subject: Add support of 64-bits reals. --- examples3d/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples3d') diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml index 46fbca6..1f9cba3 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.23" +nalgebra = "0.24" [dependencies.rapier_testbed3d] path = "../build/rapier_testbed3d" -- cgit From 00da4aaa42cc921bbd8c469b45c5c1e304f46260 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 15:34:48 +0100 Subject: Add compound shape support. --- examples3d/compound3.rs | 50 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) (limited to 'examples3d') diff --git a/examples3d/compound3.rs b/examples3d/compound3.rs index 34a654d..b2fa485 100644 --- a/examples3d/compound3.rs +++ b/examples3d/compound3.rs @@ -1,6 +1,6 @@ -use na::Point3; +use na::{Isometry3, Point3}; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; -use rapier3d::geometry::{ColliderBuilder, ColliderSet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet, ColliderShape}; use rapier_testbed3d::Testbed; pub fn init_world(testbed: &mut Testbed) { @@ -28,6 +28,7 @@ pub fn init_world(testbed: &mut Testbed) { * Create the cubes */ let num = 8; + let numy = 15; let rad = 0.2; let shift = rad * 4.0 + rad; @@ -37,7 +38,7 @@ pub fn init_world(testbed: &mut Testbed) { let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5; - for j in 0usize..15 { + for j in 0usize..numy { for i in 0..num { for k in 0usize..num { let x = i as f32 * shift * 5.0 - centerx + offset; @@ -47,16 +48,39 @@ pub fn init_world(testbed: &mut Testbed) { // 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); + + // First option: attach several colliders to a single rigid-body. + if j < numy / 2 { + 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); + } else { + // Second option: create a compound shape and attach it to a single collider. + let shapes = vec![ + ( + Isometry3::identity(), + ColliderShape::cuboid(rad * 10.0, rad, rad), + ), + ( + Isometry3::translation(rad * 10.0, rad * 10.0, 0.0), + ColliderShape::cuboid(rad, rad * 10.0, rad), + ), + ( + Isometry3::translation(-rad * 10.0, rad * 10.0, 0.0), + ColliderShape::cuboid(rad, rad * 10.0, rad), + ), + ]; + + let collider = ColliderBuilder::compound(shapes).build(); + colliders.insert(collider, handle, &mut bodies); + } } } -- cgit From 924cb7bbb9948248605eec26924e99af77dbed07 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 16:13:02 +0100 Subject: Add compound shapes to the heightfield and trimesh demos. --- examples3d/heightfield3.rs | 26 ++++++++++++++++++++++---- examples3d/trimesh3.rs | 26 ++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 8 deletions(-) (limited to 'examples3d') diff --git a/examples3d/heightfield3.rs b/examples3d/heightfield3.rs index 6558614..bc2ac98 100644 --- a/examples3d/heightfield3.rs +++ b/examples3d/heightfield3.rs @@ -1,6 +1,6 @@ -use na::{ComplexField, DMatrix, Point3, Vector3}; +use na::{ComplexField, DMatrix, Isometry3, Point3, Vector3}; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; -use rapier3d::geometry::{ColliderBuilder, ColliderSet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet, ColliderShape}; use rapier_testbed3d::Testbed; pub fn init_world(testbed: &mut Testbed) { @@ -58,14 +58,32 @@ pub fn init_world(testbed: &mut Testbed) { let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build(); let handle = bodies.insert(rigid_body); - let collider = match j % 5 { + let collider = match j % 6 { 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(), + 4 => ColliderBuilder::capsule_y(rad, rad).build(), + _ => { + let shapes = vec![ + ( + Isometry3::identity(), + ColliderShape::cuboid(rad, rad / 2.0, rad / 2.0), + ), + ( + Isometry3::translation(rad, 0.0, 0.0), + ColliderShape::cuboid(rad / 2.0, rad, rad / 2.0), + ), + ( + Isometry3::translation(-rad, 0.0, 0.0), + ColliderShape::cuboid(rad / 2.0, rad, rad / 2.0), + ), + ]; + + ColliderBuilder::compound(shapes).build() + } }; colliders.insert(collider, handle, &mut bodies); diff --git a/examples3d/trimesh3.rs b/examples3d/trimesh3.rs index d753988..e03ec6d 100644 --- a/examples3d/trimesh3.rs +++ b/examples3d/trimesh3.rs @@ -1,6 +1,6 @@ -use na::{ComplexField, DMatrix, Point3, Vector3}; +use na::{ComplexField, DMatrix, Isometry3, Point3, Vector3}; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; -use rapier3d::geometry::{ColliderBuilder, ColliderSet, HeightField}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet, ColliderShape, HeightField}; use rapier_testbed3d::Testbed; pub fn init_world(testbed: &mut Testbed) { @@ -63,14 +63,32 @@ pub fn init_world(testbed: &mut Testbed) { let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build(); let handle = bodies.insert(rigid_body); - let collider = match j % 5 { + let collider = match j % 6 { 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(), + 4 => ColliderBuilder::capsule_y(rad, rad).build(), + _ => { + let shapes = vec![ + ( + Isometry3::identity(), + ColliderShape::cuboid(rad, rad / 2.0, rad / 2.0), + ), + ( + Isometry3::translation(rad, 0.0, 0.0), + ColliderShape::cuboid(rad / 2.0, rad, rad / 2.0), + ), + ( + Isometry3::translation(-rad, 0.0, 0.0), + ColliderShape::cuboid(rad / 2.0, rad, rad / 2.0), + ), + ]; + + ColliderBuilder::compound(shapes).build() + } }; colliders.insert(collider, handle, &mut bodies); -- cgit From 1e9a962d34fa5143404d1dae1bfa0243e3d8a6a0 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 17:07:26 +0100 Subject: Testbed physx backend: re-add joints. --- examples3d/all_examples3.rs | 2 - examples3d/stacks3.rs | 171 -------------------------------------------- 2 files changed, 173 deletions(-) delete mode 100644 examples3d/stacks3.rs (limited to 'examples3d') diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs index 2c8e5c6..d9e6aff 100644 --- a/examples3d/all_examples3.rs +++ b/examples3d/all_examples3.rs @@ -31,7 +31,6 @@ mod platform3; mod primitives3; mod restitution3; mod sensor3; -mod stacks3; mod trimesh3; fn demo_name_from_command_line() -> Option { @@ -82,7 +81,6 @@ pub fn main() { ("Locked rotations", locked_rotations3::init_world), ("Platform", platform3::init_world), ("Restitution", restitution3::init_world), - ("Stacks", stacks3::init_world), ("Sensor", sensor3::init_world), ("TriMesh", trimesh3::init_world), ("Keva tower", keva3::init_world), diff --git a/examples3d/stacks3.rs b/examples3d/stacks3.rs deleted file mode 100644 index 55d58bb..0000000 --- a/examples3d/stacks3.rs +++ /dev/null @@ -1,171 +0,0 @@ -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, - stack_height: usize, - nsubdivs: usize, - half_extents: Vector3, -) { - 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, - stack_height: usize, - half_extents: Vector3, -) { - 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, - stack_height: usize, - half_extents: Vector3, -) { - 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(-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() -} -- cgit From e2006599a8fa90090393ff4fed326ee78fd7c0b7 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 20 Jan 2021 15:15:03 +0100 Subject: Add 3D convex decomposition example. --- examples3d/Cargo.toml | 1 + examples3d/all_examples3.rs | 2 + examples3d/convex_decomposition3.rs | 134 + examples3d/media/models/camel_decimated.obj | 3004 ++++++++++++++++++++ examples3d/media/models/chair.obj | 760 +++++ examples3d/media/models/cup_decimated.obj | 3000 ++++++++++++++++++++ examples3d/media/models/dilo_decimated.obj | 3004 ++++++++++++++++++++ examples3d/media/models/feline_decimated.obj | 3000 ++++++++++++++++++++ examples3d/media/models/genus3_decimated.obj | 2998 ++++++++++++++++++++ examples3d/media/models/hand2_decimated.obj | 3055 ++++++++++++++++++++ examples3d/media/models/hand_decimated.obj | 3071 +++++++++++++++++++++ examples3d/media/models/hornbug.obj | 2857 +++++++++++++++++++ examples3d/media/models/octopus_decimated.obj | 3010 ++++++++++++++++++++ examples3d/media/models/rabbit_decimated.obj | 3003 ++++++++++++++++++++ examples3d/media/models/rust_logo_simplified.obj | 1265 +++++++++ examples3d/media/models/screwdriver_decimated.obj | 3004 ++++++++++++++++++++ examples3d/media/models/table.obj | 142 + examples3d/media/models/tstTorusModel.obj | 866 ++++++ examples3d/media/models/tstTorusModel2.obj | 866 ++++++ examples3d/media/models/tstTorusModel3.obj | 866 ++++++ 20 files changed, 37908 insertions(+) create mode 100644 examples3d/convex_decomposition3.rs create mode 100644 examples3d/media/models/camel_decimated.obj create mode 100644 examples3d/media/models/chair.obj create mode 100644 examples3d/media/models/cup_decimated.obj create mode 100644 examples3d/media/models/dilo_decimated.obj create mode 100644 examples3d/media/models/feline_decimated.obj create mode 100644 examples3d/media/models/genus3_decimated.obj create mode 100644 examples3d/media/models/hand2_decimated.obj create mode 100644 examples3d/media/models/hand_decimated.obj create mode 100644 examples3d/media/models/hornbug.obj create mode 100644 examples3d/media/models/octopus_decimated.obj create mode 100644 examples3d/media/models/rabbit_decimated.obj create mode 100644 examples3d/media/models/rust_logo_simplified.obj create mode 100644 examples3d/media/models/screwdriver_decimated.obj create mode 100644 examples3d/media/models/table.obj create mode 100644 examples3d/media/models/tstTorusModel.obj create mode 100644 examples3d/media/models/tstTorusModel2.obj create mode 100644 examples3d/media/models/tstTorusModel3.obj (limited to 'examples3d') diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml index 1f9cba3..3f1d3f0 100644 --- a/examples3d/Cargo.toml +++ b/examples3d/Cargo.toml @@ -15,6 +15,7 @@ enhanced-determinism = [ "rapier3d/enhanced-determinism" ] rand = "0.7" Inflector = "0.11" nalgebra = "0.24" +kiss3d = "0.29" [dependencies.rapier_testbed3d] path = "../build/rapier_testbed3d" diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs index d9e6aff..ff5a3e8 100644 --- a/examples3d/all_examples3.rs +++ b/examples3d/all_examples3.rs @@ -12,6 +12,7 @@ use std::cmp::Ordering; mod collision_groups3; mod compound3; +mod convex_decomposition3; mod damping3; mod debug_add_remove_collider3; mod debug_boxes3; @@ -74,6 +75,7 @@ pub fn main() { ("Primitives", primitives3::init_world), ("Collision groups", collision_groups3::init_world), ("Compound", compound3::init_world), + ("Convex decomposition", convex_decomposition3::init_world), ("Damping", damping3::init_world), ("Domino", domino3::init_world), ("Heightfield", heightfield3::init_world), diff --git a/examples3d/convex_decomposition3.rs b/examples3d/convex_decomposition3.rs new file mode 100644 index 0000000..2e35f43 --- /dev/null +++ b/examples3d/convex_decomposition3.rs @@ -0,0 +1,134 @@ +use kiss3d::loader::obj; +use na::{Isometry3, Point3, Translation3}; +use rapier3d::cdl::bounding_volume::{self, BoundingVolume}; +use rapier3d::cdl::transformation::vhacd::{VHACDParameters, VHACD}; +use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet, ColliderShape}; +use rapier_testbed3d::Testbed; +use std::path::Path; + +/* + * NOTE: The `r` macro is only here to convert from f64 to the `N` scalar type. + * This simplifies experimentation with various scalar types (f32, fixed-point numbers, etc.) + */ +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 convex decompositions. + */ + let geoms = models(); + let ngeoms = geoms.len(); + let width = (ngeoms as f32).sqrt() as usize; + let num_duplications = 4; + let shift = 5.0f32; + + for (igeom, obj_path) in geoms.into_iter().enumerate() { + let deltas = na::one(); + let mtl_path = Path::new(""); + + let mut compound_parts = Vec::new(); + println!("Parsing and decomposing: {}", obj_path); + let obj = obj::parse_file(&Path::new(&obj_path), &mtl_path, ""); + + if let Ok(model) = obj { + let meshes: Vec<_> = model + .into_iter() + .map(|mesh| mesh.1.to_trimesh().unwrap()) + .collect(); + + // Compute the size of the model, to scale it and have similar size for everything. + let mut aabb = + bounding_volume::details::point_cloud_aabb(&deltas, &meshes[0].coords[..]); + + for mesh in meshes[1..].iter() { + aabb.merge(&bounding_volume::details::point_cloud_aabb( + &deltas, + &mesh.coords[..], + )); + } + + let center = aabb.center().coords; + let diag = (aabb.maxs - aabb.mins).norm(); + + for mut trimesh in meshes.into_iter() { + trimesh.translate_by(&Translation3::from(-center)); + trimesh.scale_by_scalar(6.0 / diag); + + let params = VHACDParameters::default(); + let vertices = &trimesh.coords; + let indices = &trimesh.indices.unwrap_unified(); + let vhacd = VHACD::decompose(¶ms, vertices, indices, true); + + for (vertices, indices) in vhacd.compute_exact_convex_hulls(vertices, indices) { + if let Some(convex) = ColliderShape::convex_mesh(vertices, &indices) { + compound_parts.push(convex); + } + } + } + + // let compound = ColliderShape::compound(compound_parts); + + for k in 1..num_duplications + 1 { + let x = (igeom % width) as f32 * shift; + let y = (igeom / width) as f32 * shift + 4.0; + let z = k as f32 * shift; + + let body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build(); + let handle = bodies.insert(body); + + for part in &compound_parts { + let collider = ColliderBuilder::new(part.clone()).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 models() -> Vec { + vec![ + "media/models/camel_decimated.obj".to_string(), + "media/models/chair.obj".to_string(), + "media/models/cup_decimated.obj".to_string(), + "media/models/dilo_decimated.obj".to_string(), + "media/models/feline_decimated.obj".to_string(), + "media/models/genus3_decimated.obj".to_string(), + "media/models/hand2_decimated.obj".to_string(), + "media/models/hand_decimated.obj".to_string(), + "media/models/hornbug.obj".to_string(), + "media/models/octopus_decimated.obj".to_string(), + "media/models/rabbit_decimated.obj".to_string(), + "media/models/rust_logo.obj".to_string(), + "media/models/rust_logo_simplified.obj".to_string(), + "media/models/screwdriver_decimated.obj".to_string(), + "media/models/table.obj".to_string(), + "media/models/tstTorusModel.obj".to_string(), + // "media/models/tstTorusModel2.obj".to_string(), + // "media/models/tstTorusModel3.obj".to_string(), + ] +} diff --git a/examples3d/media/models/camel_decimated.obj b/examples3d/media/models/camel_decimated.obj new file mode 100644 index 0000000..f63ad44 --- /dev/null +++ b/examples3d/media/models/camel_decimated.obj @@ -0,0 +1,3004 @@ +# 1002 +# 2000 +v -0.050388 -0.350210 0.022403 +v -0.048678 -0.130496 0.060662 +v -0.044669 0.243192 0.277197 +v 0.078833 0.022370 -0.015607 +v 0.050680 0.007189 -0.013118 +v 0.084614 0.010521 0.031128 +v 0.050878 -0.022492 0.024685 +v 0.033090 -0.371687 -0.424968 +v 0.075191 0.093570 -0.253683 +v -0.051764 -0.014380 0.025295 +v -0.076064 -0.014582 0.026880 +v -0.031546 0.449722 0.269074 +v -0.024081 0.414657 0.270146 +v -0.069569 -0.083204 -0.365774 +v -0.055686 0.107869 -0.415909 +v -0.117478 0.179205 -0.201737 +v -0.023915 0.010133 0.095191 +v -0.048404 0.019126 0.107904 +v -0.002358 0.241309 0.365850 +v -0.025664 0.241325 0.358793 +v -0.008902 0.354662 0.366952 +v -0.039608 0.428512 0.450664 +v -0.016938 0.454796 0.438974 +v -0.036921 0.417415 0.391918 +v -0.032057 0.406409 0.423741 +v 0.000371 0.376797 0.488460 +v -0.007894 0.264235 0.260070 +v -0.020176 0.325239 0.278125 +v -0.015544 0.192099 -0.409741 +v -0.027591 0.141760 -0.418868 +v -0.016752 0.124681 -0.410712 +v -0.009241 0.091347 -0.394700 +v -0.039021 -0.425507 -0.397227 +v -0.024504 -0.321668 -0.451027 +v -0.030920 -0.241836 -0.442142 +v -0.047113 -0.204467 -0.443042 +v -0.025112 -0.166981 -0.434575 +v -0.069671 -0.025295 -0.311591 +v -0.083044 -0.020125 -0.307680 +v -0.014762 -0.193705 -0.483566 +v -0.088726 -0.452177 -0.418307 +v -0.084037 -0.454761 0.065889 +v -0.047782 -0.361093 0.015777 +v -0.068511 -0.437601 0.024318 +v -0.049368 -0.453551 0.038600 +v -0.051189 -0.390765 0.051127 +v -0.043158 -0.450001 0.076305 +v 0.000463 -0.262988 0.012976 +v -0.014434 -0.234685 0.045387 +v -0.016971 -0.213612 0.039432 +v -0.007452 -0.002182 -0.445485 +v -0.017204 0.214252 -0.407657 +v -0.003770 0.161810 -0.432425 +v -0.004279 0.187997 -0.437487 +v 0.007123 0.343968 0.065505 +v 0.033276 0.333237 0.051940 +v -0.012411 -0.211216 0.007054 +v -0.042643 -0.117167 0.009132 +v -0.124326 0.062298 0.048544 +v -0.130689 0.102265 0.080301 +v -0.094676 0.026984 0.040359 +v -0.102167 0.029167 0.062763 +v -0.068921 -0.086827 0.012183 +v -0.004079 0.414057 -0.078553 +v 0.003605 0.388842 -0.049820 +v -0.028269 0.330714 -0.003973 +v -0.060655 0.305875 -0.004726 +v -0.079765 0.297511 -0.041093 +v -0.069576 0.345626 -0.078772 +v -0.098494 0.299670 -0.111757 +v -0.141738 0.216390 -0.138374 +v -0.145235 0.117310 -0.139099 +v -0.126093 0.073574 -0.145680 +v -0.113001 0.069134 -0.174687 +v -0.086582 0.040490 -0.178385 +v -0.067740 0.036729 -0.196594 +v -0.072306 0.289049 0.046666 +v -0.008771 0.113710 -0.307686 +v -0.044618 0.102447 -0.279981 +v 0.027119 -0.063073 -0.437349 +v 0.018378 -0.176230 -0.472289 +v 0.035405 -0.281865 0.029584 +v 0.023904 0.009674 0.094208 +v 0.035242 0.463399 0.277158 +v 0.040592 0.381953 0.321156 +v 0.025591 0.453335 0.461662 +v 0.015839 0.457789 0.438348 +v 0.031349 0.475765 0.271976 +v 0.067181 0.478935 0.233496 +v 0.033627 0.336881 0.290329 +v 0.052960 0.473675 0.346195 +v 0.051408 0.386355 0.329605 +v 0.002429 0.376324 0.460823 +v 0.001163 0.381316 0.447729 +v 0.013278 0.083623 -0.401720 +v 0.058015 -0.454024 -0.387010 +v 0.030815 -0.315631 -0.464720 +v 0.067652 -0.422483 -0.397635 +v 0.070014 -0.453641 -0.428822 +v 0.098749 -0.012162 -0.387491 +v 0.065676 -0.091801 -0.420394 +v 0.058214 -0.137208 -0.439754 +v 0.035354 -0.134876 -0.467585 +v 0.034896 -0.192070 -0.488266 +v 0.030118 -0.240837 -0.489575 +v 0.011985 -0.252274 -0.470828 +v 0.043300 -0.442299 0.025235 +v 0.044365 -0.453446 0.045970 +v 0.068087 0.091144 -0.260248 +v 0.047498 0.100933 -0.275746 +v 0.014360 0.087597 -0.355161 +v 0.050234 0.057346 -0.285363 +v 0.047313 0.013387 -0.310783 +v 0.025248 -0.099331 -0.414592 +v 0.012447 -0.015785 -0.391115 +v 0.037125 -0.030309 -0.345573 +v 0.010171 -0.282458 0.022124 +v 0.041287 -0.068818 0.016568 +v 0.040154 -0.240288 0.039401 +v 0.034839 -0.215077 0.037582 +v 0.005613 0.114122 -0.448145 +v 0.142558 0.214990 -0.127540 +v 0.147246 0.160164 -0.153983 +v 0.138468 0.129313 -0.167198 +v 0.121170 0.088986 -0.183606 +v 0.098204 0.070856 -0.206767 +v 0.140692 0.093333 -0.128143 +v 0.110162 0.037784 -0.088067 +v 0.091370 0.021390 -0.063181 +v -0.023665 0.014311 -0.007288 +v -0.039408 0.002793 -0.051799 +v 0.152698 0.137675 -0.087052 +v 0.140846 0.177335 -0.027662 +v 0.130720 0.211621 -0.030426 +v 0.101634 0.234496 0.007479 +v 0.054155 0.277048 0.123919 +v 0.086551 0.229643 0.141995 +v 0.089126 0.198939 0.164927 +v 0.103032 0.172836 0.153206 +v 0.050600 0.221173 0.184858 +v 0.095285 0.293974 -0.078528 +v 0.110115 0.245379 -0.195999 +v 0.102402 0.287292 -0.160884 +v 0.051588 0.399137 -0.171387 +v 0.047114 0.369792 -0.202609 +v 0.018939 0.391096 -0.206778 +v 0.019371 0.417343 -0.181690 +v -0.002113 0.412163 -0.192733 +v 0.078302 0.358406 -0.123736 +v 0.046345 0.390495 -0.087902 +v 0.024471 0.402117 -0.073897 +v 0.047874 -0.333222 0.019491 +v 0.092364 -0.067467 0.062362 +v 0.086169 -0.085054 0.033307 +v 0.102053 -0.019961 0.049005 +v -0.012994 0.012561 0.124190 +v 0.029414 -0.068493 0.068774 +v 0.027370 -0.066404 0.038519 +v 0.029707 -0.128266 0.053262 +v 0.027668 -0.121261 0.028250 +v 0.103957 0.096585 -0.256474 +v 0.018349 0.214659 -0.405838 +v 0.057951 0.215355 -0.384786 +v 0.058152 0.269094 -0.326670 +v 0.093895 0.253759 -0.310216 +v 0.066879 0.104970 -0.411331 +v 0.112875 0.065943 -0.368140 +v 0.124379 0.077915 -0.294444 +v 0.124577 0.156128 -0.341619 +v 0.056614 0.281249 -0.299480 +v -0.003861 0.298973 -0.318120 +v 0.130748 0.148488 -0.259396 +v -0.002980 0.280236 -0.349511 +v 0.075283 0.049851 -0.268880 +v 0.043072 -0.159960 -0.421633 +v 0.041600 -0.316406 -0.434381 +v 0.012978 0.002495 0.069669 +v 0.043623 0.221207 0.322216 +v 0.034982 0.140470 0.272172 +v 0.003108 0.175383 0.335506 +v 0.024620 0.306011 0.363679 +v 0.005728 0.072251 0.185608 +v 0.061387 0.146453 0.191743 +v 0.065589 0.176887 0.191310 +v 0.057434 0.189572 0.250343 +v 0.046028 0.240624 0.279320 +v 0.019348 0.014524 0.123705 +v 0.042121 0.285571 0.342438 +v 0.039800 0.349178 0.327126 +v 0.038772 0.340781 0.305020 +v 0.017695 -0.338477 0.025203 +v 0.022883 -0.435524 0.051676 +v 0.039803 -0.428549 -0.396040 +v 0.055589 -0.322835 -0.442587 +v 0.050945 -0.178451 -0.441333 +v -0.012898 0.415009 0.263138 +v -0.034463 0.485660 0.366983 +v -0.052593 0.474055 0.346235 +v -0.057724 0.483606 0.254205 +v 0.044490 0.471161 0.373052 +v 0.037408 0.485417 0.365346 +v 0.000648 0.484079 0.284889 +v 0.053155 0.459573 0.318230 +v 0.041169 0.445297 0.383209 +v 0.024619 0.004272 0.030404 +v 0.043857 -0.128394 0.061430 +v -0.103476 0.096615 -0.256342 +v -0.030054 0.411544 -0.180280 +v -0.053739 0.394569 -0.172402 +v -0.071325 0.295855 -0.212662 +v -0.056488 -0.008961 -0.421446 +v -0.099808 0.109045 -0.386089 +v -0.055977 0.141253 -0.411436 +v -0.056658 0.310900 0.023839 +v -0.095904 0.243957 0.084682 +v -0.095559 0.066423 0.110171 +v -0.109931 0.150296 0.127258 +v -0.051499 0.212190 0.194123 +v -0.062802 0.151834 0.191618 +v -0.014093 0.075350 0.186125 +v -0.042964 0.041965 0.139481 +v -0.079865 0.092986 0.160544 +v -0.094313 0.234145 0.053789 +v -0.099991 0.238340 0.004356 +v -0.111478 0.187099 0.019957 +v -0.046187 0.253837 0.326166 +v -0.026181 0.204916 0.344325 +v -0.040213 0.298682 0.344034 +v -0.040600 0.382404 0.320416 +v -0.035163 0.131403 0.257416 +v -0.003336 0.121249 0.273963 +v -0.065455 -0.027728 0.099080 +v -0.039505 -0.254310 0.039267 +v -0.017684 -0.341007 0.025394 +v -0.027181 -0.064145 0.038034 +v -0.027211 -0.198894 -0.502216 +v -0.067338 -0.422457 -0.397647 +v -0.043384 0.383701 0.359607 +v -0.051879 0.463914 0.259126 +v -0.059030 0.438765 0.323139 +v -0.068752 -0.043342 -0.422983 +v -0.053963 -0.156312 -0.453094 +v -0.082261 -0.072833 -0.395056 +v -0.121238 0.137009 -0.237346 +v -0.066374 0.476918 0.233133 +v -0.005292 0.395131 0.422050 +v -0.092874 -0.427897 -0.434581 +v -0.069345 -0.438597 -0.445488 +v -0.052347 -0.243278 -0.459110 +v -0.039489 -0.242063 -0.482521 +v -0.061812 -0.003401 -0.304064 +v -0.032486 -0.020976 -0.349176 +v -0.007630 0.235960 0.203423 +v -0.013105 -0.000882 -0.138383 +v 0.059856 0.045677 -0.213532 +v -0.150588 0.177129 -0.081519 +v -0.134452 0.074595 -0.103258 +v -0.118658 0.049633 -0.048969 +v -0.137257 0.087613 -0.042889 +v -0.144179 0.130151 -0.038113 +v -0.145297 0.174350 -0.040744 +v -0.078198 0.027967 0.002237 +v -0.069486 0.012229 -0.035571 +v -0.004913 0.251743 0.178476 +v -0.050060 0.231984 0.175423 +v -0.101399 0.174448 0.155296 +v 0.053265 0.463904 0.256984 +v 0.039128 0.416202 0.465717 +v 0.086953 -0.432209 -0.439544 +v 0.118111 0.021075 -0.349721 +v 0.064393 -0.381081 0.030279 +v 0.125596 0.201692 -0.280324 +v 0.080904 -0.064938 0.076790 +v 0.091226 -0.449675 -0.415880 +v -0.118411 0.019447 -0.346320 +v -0.111850 0.066018 -0.370764 +v -0.121710 0.165572 -0.341172 +v -0.133102 0.142931 -0.301343 +v -0.108526 0.214314 -0.334455 +v -0.109379 0.240223 -0.272671 +v -0.093691 0.242432 -0.329031 +v -0.102557 0.257461 -0.204386 +v -0.041299 0.282123 -0.314024 +v -0.080487 0.196323 -0.377656 +v -0.101782 0.164862 -0.371966 +v 0.101837 0.033050 0.075103 +v 0.119711 0.194034 0.085926 +v 0.108898 0.142579 0.126441 +v 0.096858 0.071076 0.111383 +v -0.091328 0.084544 0.145566 +v -0.008809 -0.281078 0.016601 +v -0.067698 -0.489057 0.138682 +v 0.088414 -0.480779 0.040454 +v -0.032495 -0.486418 0.077704 +v -0.025022 -0.481022 0.063117 +v -0.036431 -0.478389 0.021115 +v -0.101779 -0.473169 0.117638 +v -0.114980 -0.489228 0.120378 +v -0.068237 -0.465958 0.093788 +v -0.072699 -0.487411 0.092523 +v -0.042728 -0.488804 0.095428 +v -0.052503 -0.471605 0.131379 +v -0.042501 -0.464397 0.089240 +v -0.093739 -0.464694 0.080583 +v -0.035999 -0.481023 -0.401880 +v -0.107191 -0.486501 -0.404643 +v -0.114648 -0.473062 -0.349567 +v -0.126731 -0.473674 -0.358506 +v -0.089022 -0.468863 -0.374144 +v -0.100828 -0.462692 -0.398076 +v -0.051974 -0.485920 -0.451119 +v -0.044051 -0.486492 -0.387757 +v 0.025584 -0.480853 0.064474 +v 0.046542 -0.454043 0.078715 +v 0.054422 -0.473098 0.134776 +v 0.099007 -0.486735 0.126081 +v 0.096534 -0.488867 0.074278 +v 0.117948 -0.480132 0.101897 +v 0.109495 -0.484283 0.078742 +v 0.054081 -0.474837 0.017814 +v 0.059947 -0.453641 0.037319 +v 0.063500 -0.474837 -0.448120 +v 0.046383 -0.474738 -0.439736 +v 0.044156 -0.486202 -0.388084 +v 0.109397 -0.483071 -0.403496 +v 0.079771 -0.471968 -0.338153 +v 0.050467 -0.486452 -0.447413 +v -0.046524 0.466081 0.370810 +v 0.000078 0.408604 0.442612 +v 0.015894 0.230818 0.211378 +v 0.013690 0.112200 -0.340508 +v -0.000037 0.119091 -0.330876 +v -0.071819 0.035564 -0.409953 +v -0.082245 0.119971 -0.400760 +v -0.052126 -0.150009 -0.419311 +v -0.007207 -0.184341 -0.463539 +v 0.053756 -0.373134 -0.422697 +v 0.001190 -0.199838 -0.464478 +v 0.018829 -0.165528 -0.447860 +v 0.062122 0.000889 0.022484 +v 0.061033 0.010527 -0.000490 +v 0.007743 0.246118 0.182739 +v 0.071835 -0.022888 0.099776 +v 0.087501 -0.091836 0.045589 +v -0.038030 0.415888 -0.120202 +v -0.045208 0.218503 0.235214 +v -0.022104 -0.172486 0.040445 +v -0.029351 -0.123291 0.052777 +v -0.016395 0.461688 0.394822 +v -0.035376 0.411039 0.470648 +v -0.055078 0.455801 0.247124 +v -0.031041 0.462058 0.263962 +v -0.094128 -0.449425 -0.404212 +v -0.010308 -0.228811 -0.492932 +v -0.010144 -0.189900 -0.495075 +v -0.058799 -0.151188 -0.437313 +v -0.074771 -0.096900 -0.393627 +v -0.107230 -0.025008 -0.353776 +v -0.102118 -0.026074 -0.330292 +v -0.115523 0.003974 -0.320467 +v -0.123714 0.063794 -0.309890 +v -0.120367 0.043370 -0.301452 +v -0.100875 -0.015869 -0.383827 +v 0.001905 -0.015999 -0.450062 +v 0.001528 0.044985 -0.449466 +v 0.002167 0.182729 -0.443005 +v -0.009002 -0.230580 -0.002776 +v -0.058491 -0.078657 0.010115 +v 0.042199 -0.214937 0.029802 +v 0.067287 -0.438953 -0.445787 +v 0.093289 -0.018562 0.083636 +v 0.133780 0.139588 -0.294621 +v 0.132557 0.175593 -0.277554 +v 0.100698 0.251750 -0.292192 +v 0.110099 0.222348 -0.323522 +v 0.071632 0.286814 -0.234379 +v 0.096625 0.264637 -0.209633 +v 0.109117 0.241547 -0.264376 +v 0.049181 0.300591 -0.247881 +v 0.013502 0.274691 -0.350342 +v -0.000027 0.255278 -0.378684 +v 0.011135 0.296488 -0.317608 +v 0.109325 0.176391 -0.357723 +v 0.053338 0.149959 -0.410413 +v 0.025455 0.197871 -0.405681 +v 0.091489 0.154569 -0.385418 +v 0.106630 0.126872 -0.376942 +v 0.084215 0.089205 -0.402137 +v 0.037593 0.132921 -0.419288 +v 0.046557 0.032938 -0.417391 +v 0.069487 0.017212 -0.413478 +v 0.059841 -0.059535 -0.432292 +v 0.049334 -0.009560 -0.423298 +v 0.091263 0.034473 -0.397264 +v 0.127067 0.182772 -0.311411 +v 0.130375 0.146016 -0.321992 +v -0.000253 0.432308 -0.160804 +v 0.019815 0.427045 -0.162127 +v 0.018340 0.429295 -0.137132 +v 0.037493 -0.022715 0.086051 +v 0.043327 -0.056591 0.085810 +v 0.016700 -0.213258 0.038978 +v 0.012248 -0.240040 0.044513 +v 0.022016 -0.282354 0.033301 +v 0.029438 -0.394788 0.054354 +v 0.048190 -0.264120 0.011747 +v 0.040492 -0.281369 0.013271 +v 0.048588 -0.346518 0.031763 +v 0.052116 -0.391441 0.051100 +v 0.038187 -0.340841 0.039912 +v 0.066155 -0.427603 0.065941 +v 0.024034 -0.339020 0.039242 +v 0.085103 -0.426287 0.044666 +v 0.018683 -0.159872 -0.476951 +v 0.122333 0.138481 -0.237767 +v 0.119776 0.106366 -0.266741 +v 0.116574 0.024727 -0.301933 +v 0.105314 0.000061 -0.306693 +v 0.092752 0.011905 -0.287678 +v 0.102474 -0.024803 -0.328765 +v 0.082076 -0.026899 -0.313269 +v 0.066366 -0.092922 -0.373628 +v 0.058987 -0.198211 -0.458726 +v 0.055650 -0.164243 -0.447878 +v 0.071535 -0.105466 -0.395527 +v 0.108739 -0.021173 -0.342503 +v 0.120338 0.019808 -0.324253 +v 0.122037 0.073357 -0.336268 +v 0.107939 -0.020949 -0.361398 +v 0.054732 -0.453446 -0.419654 +v 0.067073 -0.354903 -0.450965 +v 0.045359 -0.308061 -0.467448 +v 0.057788 -0.199874 -0.470998 +v 0.028262 -0.209193 -0.500156 +v 0.083179 -0.071071 -0.394159 +v 0.014484 0.354423 0.365046 +v 0.029671 0.405875 0.387026 +v 0.048285 0.389210 0.363268 +v 0.005171 0.393838 0.496150 +v 0.009848 0.383188 0.369273 +v 0.015902 0.400763 0.393889 +v 0.065407 0.465518 0.265856 +v -0.039192 0.330172 0.055325 +v -0.019539 0.339713 0.072218 +v -0.065704 0.306976 -0.023212 +v -0.149537 0.180846 -0.139816 +v -0.153452 0.152809 -0.119699 +v -0.061279 0.016156 -0.153198 +v -0.040124 0.037374 -0.213445 +v -0.012697 0.050593 -0.229715 +v 0.031136 0.039939 -0.219502 +v 0.012217 0.011009 -0.176831 +v 0.047690 0.022625 -0.188266 +v 0.026471 -0.002403 -0.117814 +v 0.050131 0.012188 -0.156260 +v 0.078762 0.014224 -0.099742 +v 0.134701 0.090469 -0.024097 +v 0.116234 0.086875 0.013521 +v -0.029739 0.008804 -0.167337 +v 0.128411 0.069012 -0.034842 +v 0.118984 0.048326 -0.053774 +v 0.087067 0.042727 -0.181938 +v 0.090309 0.029900 -0.140793 +v 0.112281 0.059049 -0.159369 +v -0.101956 0.033997 -0.116404 +v -0.115829 0.045234 -0.090356 +v -0.147960 0.109343 -0.102947 +v -0.151172 0.130129 -0.084840 +v -0.133894 0.194943 -0.023061 +v -0.130406 0.230506 -0.057293 +v -0.080707 0.264062 0.072662 +v -0.069625 0.242972 0.150559 +v -0.031381 0.317299 0.104292 +v -0.064237 0.282257 0.091819 +v -0.100399 0.229744 0.115885 +v -0.089073 0.206393 0.160164 +v -0.092422 0.163138 0.172228 +v -0.028886 0.293680 0.136303 +v -0.031025 0.224872 0.210293 +v -0.106994 0.214949 0.013051 +v -0.134367 0.148978 -0.008196 +v -0.130935 0.102852 -0.009536 +v -0.101435 0.053394 0.006684 +v -0.124592 0.074175 -0.015902 +v -0.059838 0.013310 -0.007735 +v -0.099892 0.029075 -0.055218 +v -0.051988 0.003316 -0.106161 +v -0.084357 0.017146 -0.100095 +v -0.140549 0.218041 -0.072779 +v -0.037965 0.395858 -0.081611 +v -0.020341 0.391378 -0.059459 +v -0.006543 0.337291 0.094120 +v -0.019458 0.097718 -0.281240 +v 0.007026 0.095424 -0.280681 +v -0.119587 0.106568 -0.266803 +v -0.110999 0.052996 -0.277480 +v -0.016810 -0.283046 0.031996 +v -0.010906 -0.260851 0.041674 +v -0.035681 -0.131054 0.057928 +v -0.036500 -0.078122 0.075735 +v -0.042569 -0.014777 0.093015 +v -0.121417 0.081752 0.088014 +v -0.101368 0.132698 0.147123 +v -0.086606 0.143319 0.174753 +v -0.115259 0.209489 0.090926 +v -0.100578 -0.028623 0.068007 +v -0.098870 0.036517 0.083040 +v -0.030915 -0.096273 -0.398771 +v -0.022851 -0.087617 -0.419179 +v -0.007674 0.067510 -0.374899 +v -0.018481 -0.018724 -0.375976 +v -0.052131 0.062866 -0.281215 +v -0.041962 0.049177 -0.307793 +v -0.050259 -0.033686 -0.328654 +v -0.037953 -0.165720 -0.427221 +v -0.064097 0.059765 -0.271489 +v -0.067302 0.093478 -0.259385 +v -0.015540 -0.203399 -0.442302 +v -0.040496 -0.326288 -0.433812 +v -0.023040 -0.436276 0.052285 +v -0.036983 -0.188376 -0.485054 +v -0.051279 -0.179451 -0.439947 +v -0.056182 -0.186579 -0.466005 +v -0.059600 -0.203901 -0.467908 +v -0.069907 -0.363402 -0.444152 +v -0.090839 -0.424531 -0.413938 +v -0.066184 -0.374898 -0.429490 +v -0.054558 -0.371536 -0.423950 +v -0.053332 -0.306295 -0.444193 +v -0.059510 -0.453550 -0.427199 +v -0.045661 -0.309595 -0.466462 +v -0.053120 -0.299283 -0.458586 +v -0.029620 -0.310154 -0.466177 +v -0.037188 -0.301389 -0.469991 +v -0.050127 -0.440567 -0.441399 +v -0.027087 0.349954 0.354089 +v -0.029174 0.404955 0.386894 +v -0.010887 0.386779 0.371080 +v 0.024578 0.385967 0.471735 +v 0.030870 0.403730 0.429078 +v 0.006571 0.393955 0.406645 +v 0.000272 0.389990 0.441555 +v -0.043124 0.469307 0.286836 +v -0.050797 0.456395 0.374602 +v -0.050456 0.442140 0.371282 +v -0.055931 0.432705 0.366140 +v -0.046414 0.458167 0.289795 +v -0.013075 0.004749 0.049109 +v -0.012518 0.002736 0.070044 +v -0.045184 -0.002023 0.017834 +v -0.040400 -0.019599 0.032745 +v -0.030816 -0.022160 0.046776 +v -0.095781 0.112679 -0.235381 +v -0.082537 0.097260 -0.248684 +v -0.077067 -0.431999 0.060173 +v -0.065049 -0.388143 0.035236 +v -0.045130 -0.344404 0.035922 +v -0.050172 -0.253401 0.018525 +v -0.032675 -0.336108 0.039680 +v -0.038325 -0.281704 0.025802 +v -0.040229 -0.140618 -0.466911 +v -0.065284 -0.081355 -0.421982 +v -0.054408 0.403867 0.365764 +v -0.051450 0.386826 0.336552 +v -0.000609 0.437601 0.481250 +v -0.029364 0.442940 0.463075 +v -0.022361 0.394270 0.479231 +v -0.037258 0.405855 0.447512 +v -0.034979 0.463234 0.277389 +v -0.040818 0.423221 0.291736 +v -0.030020 0.337999 0.284570 +v -0.039446 0.350380 0.330090 +v -0.037821 0.346631 0.302726 +v -0.023417 0.283020 0.365523 +v -0.041185 0.246438 0.340855 +v -0.019286 0.180813 0.331966 +v -0.005591 0.149891 0.310432 +v -0.030916 0.156988 0.295340 +v -0.033030 0.374740 0.348904 +v -0.046616 0.254103 0.309564 +v -0.036105 0.294539 0.287783 +v -0.036270 0.264875 0.278978 +v -0.020740 0.236740 0.235117 +v -0.035862 -0.437200 -0.426734 +v -0.038642 -0.374118 -0.422217 +v -0.001435 -0.206290 -0.464448 +v -0.040146 -0.102342 -0.454004 +v -0.027472 -0.426639 0.065285 +v -0.034086 -0.395914 0.055099 +v -0.028638 -0.073059 0.067054 +v -0.031865 -0.022956 0.077899 +v -0.041845 -0.058806 0.017392 +v -0.009639 -0.256358 -0.005748 +v -0.013662 -0.282168 0.004456 +v -0.029395 -0.380520 0.018087 +v -0.027099 -0.438425 0.039327 +v -0.084051 -0.427517 0.036408 +v -0.083119 -0.033168 0.091192 +v -0.059886 0.177131 0.208681 +v -0.059682 0.183330 0.197694 +v -0.058812 0.178812 0.232936 +v -0.050410 0.196906 0.282799 +v -0.046902 0.162520 0.269211 +v -0.048294 0.112781 0.189031 +v -0.029559 0.092330 0.198643 +v -0.055539 0.115317 0.182126 +v -0.128644 0.090621 0.041161 +v -0.129316 0.122664 0.042404 +v -0.123152 0.145881 0.038521 +v -0.114967 0.156788 0.022679 +v -0.041114 -0.211949 0.031104 +v -0.044225 -0.211942 0.019630 +v -0.035602 -0.215922 0.037216 +v -0.090076 -0.068071 0.066179 +v -0.082213 -0.107040 0.042990 +v -0.021186 0.025877 0.142197 +v -0.026684 0.071611 0.176438 +v -0.074173 0.048689 0.134285 +v -0.081209 0.026272 0.106598 +v -0.022254 0.331721 0.013975 +v 0.000168 0.429004 -0.110934 +v -0.018006 0.429295 -0.137131 +v -0.018932 0.427312 -0.161637 +v -0.048962 0.041144 -0.415686 +v -0.032427 0.038727 -0.413922 +v -0.033666 -0.010094 -0.423540 +v -0.022376 0.380054 -0.211810 +v -0.046610 0.369153 -0.203317 +v -0.048376 0.315171 -0.228452 +v -0.098322 0.285382 -0.175274 +v -0.119258 0.214819 -0.193790 +v -0.123505 0.205978 -0.292846 +v -0.131659 0.179149 -0.275137 +v 0.000101 0.331314 -0.247099 +v -0.050531 0.183772 -0.400066 +v -0.054596 0.219315 -0.383726 +v -0.048129 0.250656 -0.358345 +v -0.069209 0.267548 -0.318930 +v -0.070038 0.352669 -0.183837 +v -0.019062 0.326570 -0.243758 +v -0.073045 0.373286 -0.151794 +v -0.057182 0.397328 -0.126050 +v -0.049561 0.409230 -0.153230 +v -0.086611 0.045109 -0.268802 +v -0.101432 0.018376 -0.289261 +v 0.058746 -0.121558 0.062922 +v 0.048060 -0.005131 0.022883 +v 0.030542 -0.021685 0.048461 +v 0.038619 -0.019344 0.034446 +v 0.000294 0.476909 0.394879 +v 0.048240 0.460729 0.371474 +v 0.025566 0.483458 0.307097 +v -0.001872 0.489576 0.379794 +v -0.034355 0.484295 0.327688 +v -0.017234 0.477995 0.269975 +v -0.028502 0.474820 0.272765 +v 0.043386 0.469259 0.286757 +v -0.027209 0.450525 0.464160 +v 0.002525 0.466007 0.439976 +v -0.012275 0.470538 0.395492 +v 0.020578 0.465684 0.260494 +v 0.053066 0.453126 0.250175 +v 0.006105 0.421850 0.259408 +v 0.000177 0.237005 0.229810 +v 0.021184 0.236169 0.233942 +v 0.043566 0.226943 0.245795 +v 0.036003 0.257852 0.274299 +v 0.034575 0.287134 0.284687 +v 0.046270 0.215046 0.221670 +v 0.028244 0.216322 0.346434 +v 0.032294 0.253867 0.356564 +v 0.034068 0.353209 0.344226 +v 0.095548 -0.425213 -0.426049 +v 0.095404 -0.455692 -0.400036 +v 0.051404 -0.245448 -0.469054 +v 0.053445 -0.290246 -0.457321 +v 0.049600 -0.255108 -0.448751 +v 0.015045 -0.196945 -0.483709 +v 0.026487 -0.191498 -0.499902 +v 0.009503 -0.196701 -0.496676 +v 0.036811 -0.251319 -0.440604 +v 0.015555 -0.209153 -0.443246 +v 0.028197 -0.169907 -0.432980 +v 0.029559 -0.438189 0.034708 +v 0.023507 0.335914 0.278331 +v 0.054778 0.018453 0.108921 +v 0.045293 0.020897 0.111765 +v 0.052347 0.106844 0.178506 +v 0.044078 0.105096 0.189583 +v 0.059812 0.185493 0.205576 +v 0.047190 0.243011 0.305108 +v 0.041645 0.287723 0.301607 +v 0.027861 0.082790 0.186302 +v 0.021049 0.026983 0.143598 +v 0.015073 0.084745 0.201573 +v 0.041333 0.043428 0.141578 +v 0.075447 0.044271 0.129210 +v 0.078090 0.087245 0.158512 +v 0.084144 0.125795 0.172079 +v 0.051683 0.211686 0.194226 +v 0.091402 0.085668 0.146921 +v 0.085397 0.028955 0.103232 +v 0.003021 0.278251 0.371600 +v 0.019834 0.240068 0.361598 +v 0.027989 0.184622 0.326598 +v 0.005101 0.206708 0.354221 +v 0.008895 0.136618 0.293173 +v 0.049968 0.157612 0.258435 +v 0.030923 -0.023918 0.069062 +v 0.112154 0.153041 -0.212018 +v 0.033895 -0.188982 -0.436816 +v 0.047495 -0.116926 -0.389320 +v 0.100415 0.046447 -0.271729 +v 0.063146 -0.029076 -0.316160 +v 0.122074 0.205390 -0.199654 +v 0.121424 0.209937 -0.191851 +v 0.129191 0.242211 -0.143080 +v 0.101684 0.291212 -0.109234 +v 0.074000 0.371375 -0.151000 +v 0.050016 0.409546 -0.151067 +v 0.050683 0.408260 -0.132130 +v 0.034297 0.413771 -0.108025 +v 0.071135 0.350722 -0.184240 +v 0.021986 0.326179 -0.242611 +v 0.050224 0.313703 -0.226972 +v 0.086995 0.286198 -0.198936 +v -0.001479 -0.235853 0.014551 +v 0.042010 -0.112815 0.009128 +v 0.015242 -0.208954 0.006168 +v 0.011071 -0.202948 0.017835 +v 0.013518 -0.266313 0.041707 +v 0.101164 0.049546 0.021386 +v 0.099713 0.028172 0.049044 +v 0.074647 -0.072331 0.016382 +v 0.074233 -0.020502 0.025069 +v 0.069051 -0.114086 0.014542 +v 0.043712 -0.213021 0.014739 +v 0.050479 -0.237797 0.011826 +v 0.059582 0.244780 0.159364 +v 0.106427 0.215473 0.115928 +v 0.066018 0.280382 0.090127 +v 0.061439 0.308504 0.039907 +v 0.066420 0.296687 -0.000550 +v 0.064709 0.310409 -0.023925 +v 0.145958 0.200448 -0.065978 +v 0.145593 0.141157 -0.038690 +v 0.141582 0.092000 -0.083573 +v 0.128332 0.071317 -0.131876 +v 0.132438 0.144209 -0.004816 +v 0.115140 0.156147 0.022553 +v 0.106122 0.199559 0.042954 +v 0.111571 0.205060 0.012042 +v 0.085148 0.257879 0.061807 +v 0.102977 0.234715 0.092835 +v 0.127313 0.097466 0.033776 +v 0.123809 0.064460 0.042956 +v 0.122588 0.059743 0.066125 +v 0.101242 0.136370 0.149911 +v 0.092759 0.161865 0.172099 +v 0.102176 -0.019298 0.065574 +v 0.113816 0.185180 0.117932 +v 0.133527 0.107063 0.067687 +v 0.130110 0.124365 0.044992 +v 0.126562 0.090404 0.086772 +v 0.095022 0.035482 0.034417 +v 0.101313 0.052154 0.005708 +v 0.093661 0.240099 0.113770 +v 0.029973 0.297595 0.132566 +v 0.003962 0.319476 0.120643 +v -0.009285 0.342467 -0.008057 +v 0.013345 0.339417 -0.007308 +v 0.044528 0.001273 -0.058659 +v 0.022598 0.015029 -0.007262 +v 0.000279 0.002038 0.090760 +v -0.032379 -0.002080 -0.086986 +v -0.047334 0.008141 -0.015262 +v 0.020391 0.001297 -0.054322 +v 0.026135 0.333465 0.084166 +v 0.014270 0.189496 -0.423484 +v 0.007929 0.121305 -0.453646 +v -0.008246 0.100698 -0.449205 +v 0.008271 0.174110 -0.428097 +v 0.008391 0.027307 -0.441343 +v 0.061366 -0.088161 0.009008 +v 0.010031 -0.234544 -0.004383 +v 0.007407 -0.259999 -0.004141 +v 0.000021 -0.261361 0.015697 +v 0.037914 -0.102224 -0.387677 +v 0.019538 0.002404 -0.365646 +v 0.004776 0.122645 -0.370833 +v 0.022436 -0.077490 -0.426165 +v 0.011651 -0.020039 -0.408872 +v 0.009326 0.033573 -0.395902 +v 0.001622 0.143547 -0.383394 +v 0.059257 -0.440028 0.022026 +v 0.077893 -0.432635 0.028998 +v 0.027881 -0.281832 0.001949 +v 0.030562 -0.261587 -0.006219 +v 0.030335 -0.235723 -0.006619 +v 0.026717 -0.210957 0.001647 +v 0.060686 -0.451144 0.075880 +v 0.031664 -0.429523 0.070596 +v 0.014877 -0.283100 0.003754 +v 0.038540 -0.344669 0.009752 +v 0.003988 -0.201675 -0.454573 +v 0.024401 -0.265123 -0.447368 +v 0.025033 -0.319285 -0.451687 +v 0.032171 -0.434257 -0.413368 +v 0.025013 -0.106631 -0.453225 +v 0.010896 -0.231352 -0.492057 +v 0.066238 -0.058972 -0.425949 +v 0.076634 -0.450909 -0.391551 +v 0.052733 -0.441354 -0.442072 +v 0.087275 -0.422796 -0.410711 +v 0.070609 -0.373421 -0.434406 +v 0.037766 -0.436576 -0.430899 +v 0.049500 -0.450239 -0.401043 +v 0.027336 0.026761 -0.412978 +v 0.026491 0.117394 -0.417349 +v -0.027652 0.388957 0.461227 +v 0.059711 0.439123 0.325484 +v 0.050584 0.422600 0.302191 +v 0.046592 0.458159 0.289662 +v 0.056449 0.415405 0.365166 +v 0.031164 0.455414 0.266236 +v 0.024040 0.431491 0.266869 +v 0.040129 0.423779 0.290854 +v 0.056074 0.480901 0.261674 +v 0.027976 0.397659 0.481148 +v 0.000759 0.383703 0.498721 +v 0.038192 0.435480 0.392423 +v 0.040110 0.430962 0.437318 +v 0.028871 0.443418 0.464987 +v 0.051779 0.441817 0.370181 +v 0.036407 0.405110 0.448580 +v 0.036907 0.418250 0.393526 +v 0.005427 0.391478 0.481585 +v 0.032068 0.373966 0.351096 +v 0.016209 0.191866 -0.409804 +v -0.014182 0.110805 -0.339883 +v -0.002787 0.126727 -0.380140 +v -0.094620 0.067210 -0.206626 +v -0.130490 0.126642 -0.178280 +v -0.140527 0.204003 -0.153533 +v -0.126803 0.175033 -0.226567 +v -0.123223 0.096113 -0.180545 +v -0.144813 0.153871 -0.158288 +v -0.100844 0.288218 -0.161909 +v -0.076156 0.359331 -0.118416 +v -0.098767 0.290138 -0.084588 +v -0.045727 0.332608 -0.023945 +v -0.046869 -0.250227 0.003738 +v -0.074211 -0.111264 0.021764 +v -0.085010 -0.059676 0.028674 +v -0.038704 -0.212688 0.008444 +v -0.101263 -0.029317 0.049882 +v -0.069018 0.006388 0.023112 +v -0.102765 0.048616 0.027775 +v -0.118988 0.054023 0.067044 +v -0.010609 -0.203945 0.020968 +v -0.032111 -0.127105 0.016353 +v -0.026921 -0.120374 0.031139 +v 0.001818 -0.236244 0.013811 +v -0.025508 -0.360123 0.041046 +v 0.034235 0.325652 0.012667 +v 0.053243 0.313482 -0.002869 +v 0.006220 0.335597 0.011016 +v -0.000558 0.116728 -0.458560 +v -0.017279 0.193294 -0.413435 +v -0.009549 0.147796 -0.445297 +v -0.008106 0.038568 -0.442856 +v -0.052509 -0.426579 0.070647 +v -0.021043 -0.283734 0.001516 +v -0.044716 -0.441710 0.023062 +v -0.035232 -0.282321 0.006428 +v -0.029867 -0.261827 -0.006224 +v -0.030071 -0.235641 -0.006592 +v -0.028850 -0.209481 0.002622 +v -0.023349 -0.140037 -0.467214 +v -0.011421 -0.246078 -0.466800 +v -0.028979 -0.354087 -0.435187 +v -0.025856 -0.262767 -0.444678 +v -0.005798 -0.203857 -0.451112 +v -0.031914 -0.432754 -0.412500 +v -0.050037 -0.109670 -0.383351 +v -0.047105 -0.259942 -0.444389 +v -0.010841 -0.015317 -0.398289 +v -0.012820 -0.021232 -0.411374 +v -0.022173 -0.069145 -0.428979 +v -0.019824 -0.145398 -0.449501 +v -0.030501 -0.064651 -0.439376 +v -0.015942 0.031330 -0.404711 +v -0.000275 0.164236 -0.395651 +v -0.019674 0.391226 0.475991 +v -0.002599 0.458081 0.256698 +v -0.005623 0.350185 0.271937 +v -0.000052 0.315351 0.273782 +v -0.018364 0.272064 0.269081 +v 0.013663 0.288568 0.271750 +v 0.019210 0.262898 0.262257 +v -0.064889 0.465853 0.266259 +v -0.012063 0.390485 0.494338 +v -0.038359 0.433612 0.391699 +v -0.049581 0.418615 0.302977 +v -0.115621 0.086254 0.013688 +v 0.001374 0.192299 -0.405035 +v -0.105396 0.132208 -0.222485 +v -0.131278 0.129848 -0.278331 +v -0.129617 0.152678 -0.321721 +v -0.120503 0.111192 -0.349378 +v -0.114127 0.141276 -0.362660 +v 0.049752 0.327236 -0.022843 +v 0.069092 0.359543 -0.095847 +v 0.127299 0.239931 -0.064482 +v 0.149590 0.189612 -0.127176 +v 0.137820 0.208349 -0.157167 +v 0.091541 0.105017 -0.240559 +v 0.148519 0.118154 -0.126108 +v 0.153259 0.154178 -0.117231 +v 0.000297 0.317635 -0.268323 +v -0.054330 0.298019 -0.245638 +v -0.084431 0.275927 -0.225982 +v -0.100716 0.250536 -0.299592 +v -0.114992 0.189750 0.110794 +v -0.130477 0.126591 0.075822 +v 0.048626 0.249905 -0.358924 +v 0.092003 0.212516 -0.357831 +v 0.082732 0.248343 -0.333596 +v 0.080712 -0.449676 0.050965 +v -0.053243 0.459353 0.323675 +v 0.016353 0.461575 0.394387 +v 0.011933 0.471543 0.395998 +v 0.072711 -0.488413 0.136442 +v -0.081182 -0.489057 -0.327787 +v 0.098276 -0.481675 -0.427434 +v 0.119118 -0.474852 -0.346490 +v 0.121102 -0.471526 -0.373449 +v 0.036581 -0.480852 -0.400533 +v 0.093377 -0.466266 -0.375047 +v 0.077122 -0.468170 -0.363366 +v 0.057577 -0.471257 -0.348611 +v 0.063827 -0.481931 -0.325657 +v 0.086724 -0.488269 -0.335465 +v 0.072435 -0.489068 -0.323872 +v 0.083812 -0.486742 -0.373182 +v 0.106997 -0.486717 -0.346481 +v 0.051421 -0.465939 -0.384174 +v 0.133064 -0.488240 -0.355636 +v 0.102734 -0.488751 -0.397417 +v 0.047958 -0.488246 -0.358875 +v 0.090114 -0.486456 -0.426746 +v 0.066660 -0.471968 0.128264 +v 0.071873 -0.486735 0.093384 +v 0.084580 -0.456090 0.066879 +v 0.090733 -0.486606 0.054862 +v 0.038502 -0.450253 0.064447 +v 0.106000 -0.471224 0.116527 +v 0.032771 -0.486472 0.076991 +v 0.035888 -0.487999 0.109407 +v 0.116915 -0.489040 0.116271 +v 0.043209 -0.473204 0.118833 +v 0.048430 -0.486790 0.138178 +v 0.039867 -0.465938 0.081319 +v 0.079954 -0.468357 0.092976 +v 0.064856 -0.468170 0.102977 +v 0.092545 -0.465580 0.085237 +v 0.043045 -0.486326 0.012710 +v 0.037788 -0.479445 0.017986 +v -0.072070 -0.467197 -0.361314 +v -0.071683 -0.451312 -0.390062 +v -0.097993 -0.466542 -0.375117 +v -0.050321 -0.488602 -0.360398 +v -0.132646 -0.486919 -0.354972 +v -0.099391 -0.488851 -0.39