Import google-deepmind/mujoco_warp from GitHub.

PiperOrigin-RevId: 816099854
Change-Id: I6302a97c2f5d4594a08ebf4bc53a180b804360e6
This commit is contained in:
Taylor Howell
2025-10-07 09:48:21 +01:00
committed by Saran Tunyasuvunakool
parent 414888b716
commit fd9b989bf8
193 changed files with 92473 additions and 1599 deletions
+3 -1
View File
@@ -21,7 +21,6 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import Model as Model
from mujoco.mjx.third_party.mujoco_warp._src.types import Data as Data
# isort: on
from ._src import test_util as test_util # used by viewer and testspeed, not meant for public consumption
from mujoco.mjx.third_party.mujoco_warp._src.collision_driver import collision as collision
from mujoco.mjx.third_party.mujoco_warp._src.collision_driver import nxn_broadphase as nxn_broadphase
from mujoco.mjx.third_party.mujoco_warp._src.collision_driver import sap_broadphase as sap_broadphase
@@ -68,6 +67,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.solver import solve as solve
from mujoco.mjx.third_party.mujoco_warp._src.support import contact_force as contact_force
from mujoco.mjx.third_party.mujoco_warp._src.support import mul_m as mul_m
from mujoco.mjx.third_party.mujoco_warp._src.support import xfrc_accumulate as xfrc_accumulate
from mujoco.mjx.third_party.mujoco_warp._src.types import BiasType as BiasType
from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseFilter as BroadphaseFilter
from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseType as BroadphaseType
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType as ConeType
@@ -76,6 +76,8 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import Contact as Contact
from mujoco.mjx.third_party.mujoco_warp._src.types import DisableBit as DisableBit
from mujoco.mjx.third_party.mujoco_warp._src.types import DynType as DynType
from mujoco.mjx.third_party.mujoco_warp._src.types import EnableBit as EnableBit
from mujoco.mjx.third_party.mujoco_warp._src.types import GainType as GainType
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType as GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import IntegratorType as IntegratorType
from mujoco.mjx.third_party.mujoco_warp._src.types import JointType as JointType
from mujoco.mjx.third_party.mujoco_warp._src.types import Option as Option
@@ -13,7 +13,7 @@
# limitations under the License.
# ==============================================================================
"""Utilities for testing."""
"""Utilities for benchmarking MuJoCo Warp."""
import importlib
import os
@@ -23,183 +23,15 @@ from typing import Callable, Optional, Tuple
import mujoco
import numpy as np
import warp as wp
from etils import epath
from mujoco.mjx.third_party.mujoco_warp._src import forward
from mujoco.mjx.third_party.mujoco_warp._src import io
from mujoco.mjx.third_party.mujoco_warp._src import warp_util
from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseType
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import DisableBit
from mujoco.mjx.third_party.mujoco_warp._src.types import EnableBit
from mujoco.mjx.third_party.mujoco_warp._src.types import IntegratorType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import SolverType
from mujoco.mjx.third_party.mujoco_warp._src.util_misc import halton
def fixture(
fname: Optional[str] = None,
xml: Optional[str] = None,
keyframe: int = -1,
actuation: bool = True,
contact: bool = True,
constraint: bool = True,
equality: bool = True,
spring: bool = True,
damper: bool = True,
gravity: bool = True,
clampctrl: bool = True,
filterparent: bool = True,
qpos0: bool = False,
kick: bool = False,
energy: bool = False,
eulerdamp: Optional[bool] = None,
cone: Optional[ConeType] = None,
integrator: Optional[IntegratorType] = None,
solver: Optional[SolverType] = None,
iterations: Optional[int] = None,
ls_iterations: Optional[int] = None,
ls_parallel: Optional[bool] = None,
sparse: Optional[bool] = None,
broadphase: Optional[BroadphaseType] = None,
disableflags: Optional[int] = None,
enableflags: Optional[int] = None,
applied: bool = False,
nstep: int = 3,
seed: int = 42,
nworld: int = None,
nconmax: int = None,
njmax: int = None,
):
np.random.seed(seed)
if fname is not None:
path = epath.resource_path("mjx") / "third_party/mujoco_warp" / "test_data" / fname
mjm = mujoco.MjModel.from_xml_path(path.as_posix())
elif xml is not None:
mjm = mujoco.MjModel.from_xml_string(xml)
else:
raise ValueError("either fname or xml must be provided")
if not actuation:
mjm.opt.disableflags |= DisableBit.ACTUATION
if not contact:
mjm.opt.disableflags |= DisableBit.CONTACT
if not constraint:
mjm.opt.disableflags |= DisableBit.CONSTRAINT
if not equality:
mjm.opt.disableflags |= DisableBit.EQUALITY
if not spring:
mjm.opt.disableflags |= DisableBit.SPRING
if not damper:
mjm.opt.disableflags |= DisableBit.DAMPER
if not gravity:
mjm.opt.disableflags |= DisableBit.GRAVITY
if not clampctrl:
mjm.opt.disableflags |= DisableBit.CLAMPCTRL
if not eulerdamp:
mjm.opt.disableflags |= DisableBit.EULERDAMP
if not filterparent:
mjm.opt.disableflags |= DisableBit.FILTERPARENT
if energy:
mjm.opt.enableflags |= EnableBit.ENERGY
if cone is not None:
mjm.opt.cone = cone
if integrator is not None:
mjm.opt.integrator = integrator
if disableflags is not None:
mjm.opt.disableflags |= disableflags
if enableflags is not None:
mjm.opt.enableflags |= enableflags
if solver is not None:
mjm.opt.solver = solver
if iterations is not None:
mjm.opt.iterations = iterations
if ls_iterations is not None:
mjm.opt.ls_iterations = ls_iterations
if sparse is not None:
if sparse:
mjm.opt.jacobian = mujoco.mjtJacobian.mjJAC_SPARSE
else:
mjm.opt.jacobian = mujoco.mjtJacobian.mjJAC_DENSE
mjd = mujoco.MjData(mjm)
if keyframe > -1:
mujoco.mj_resetDataKeyframe(mjm, mjd, keyframe)
elif qpos0:
mjd.qpos[:] = mjm.qpos0
else:
# set random qpos, underlying code should gracefully handle un-normalized quats
mjd.qpos[:] = np.random.random(mjm.nq)
if kick:
# give the system a little kick to ensure we have non-identity rotations
mjd.qvel = np.random.uniform(-0.01, 0.01, mjm.nv)
mjd.ctrl = np.random.uniform(-0.1, 0.1, size=mjm.nu)
if applied:
mjd.qfrc_applied = np.random.uniform(-0.1, 0.1, size=mjm.nv)
mjd.xfrc_applied = np.random.uniform(-0.1, 0.1, size=mjd.xfrc_applied.shape)
if kick or applied:
mujoco.mj_step(mjm, mjd, nstep) # let dynamics get state significantly non-zero
if mjm.nmocap:
mjd.mocap_pos = np.random.random(mjd.mocap_pos.shape)
mocap_quat = np.random.random(mjd.mocap_quat.shape)
mjd.mocap_quat = mocap_quat
mujoco.mj_forward(mjm, mjd)
mjd.qacc_warmstart = mjd.qacc
m = io.put_model(mjm)
if ls_parallel is not None:
m.opt.ls_parallel = ls_parallel
if broadphase is not None:
m.opt.broadphase = broadphase
d = io.put_data(mjm, mjd, nworld=nworld, nconmax=nconmax, njmax=njmax)
return mjm, mjd, m, d
def find_keys(model: mujoco.MjModel, keyname_prefix: str) -> list[int]:
"""Finds keyframes that start with keyname_prefix."""
keys = []
for keyid in range(model.nkey):
name = mujoco.mj_id2name(model, mujoco.mjtObj.mjOBJ_KEY, keyid)
if name.startswith(keyname_prefix):
keys.append(keyid)
return keys
def make_trajectory(model: mujoco.MjModel, keys: list[int]) -> np.ndarray:
"""Make a ctrl trajectory with linear interpolation."""
ctrls = []
prev_ctrl_key = np.zeros(model.nu, dtype=np.float64)
prev_time, time = 0.0, 0.0
for key in keys:
ctrl_key, ctrl_time = model.key_ctrl[key], model.key_time[key]
if not ctrls and ctrl_time != 0.0:
raise ValueError("first keyframe must have time 0.0")
elif ctrls and ctrl_time <= prev_time:
raise ValueError("keyframes must be in time order")
while time < ctrl_time:
frac = (time - prev_time) / (ctrl_time - prev_time)
ctrls.append(prev_ctrl_key * (1 - frac) + ctrl_key * frac)
time += model.opt.timestep
ctrls.append(ctrl_key)
time += model.opt.timestep
prev_ctrl_key = ctrl_key
prev_time = time
return np.array(ctrls)
def _sum(stack1, stack2):
ret = {}
for k in stack1:
@@ -372,10 +204,10 @@ class BenchmarkSuite:
ctrls = None
if self.replay:
keys = find_keys(mjm, self.replay)
keys = io.find_keys(mjm, self.replay)
if not keys:
raise ValueError(f"Key prefix not find: {self.replay}")
ctrls = make_trajectory(mjm, keys)
ctrls = io.make_trajectory(mjm, keys)
mujoco.mj_resetDataKeyframe(mjm, mjd, keys[0])
if mjm.nkey > 0:
@@ -20,16 +20,17 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import BroadphaseFilter
from mujoco.mjx.third_party.mujoco_warp import BroadphaseType
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import collision_driver
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseFilter
from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseType
def broadphase_caller(m, d):
if m.opt.broadphase == int(BroadphaseType.NXN):
if m.opt.broadphase == BroadphaseType.NXN:
collision_driver.nxn_broadphase(m, d)
else:
collision_driver.sap_broadphase(m, d)
@@ -37,12 +38,12 @@ def broadphase_caller(m, d):
class BroadphaseTest(parameterized.TestCase):
# filter combinations
plane_sphere = BroadphaseFilter.PLANE.value | BroadphaseFilter.SPHERE.value
plane_aabb = BroadphaseFilter.PLANE.value | BroadphaseFilter.AABB.value
plane_obb = BroadphaseFilter.PLANE | BroadphaseFilter.OBB.value
plane_sphere_aabb = plane_sphere | BroadphaseFilter.AABB.value
plane_sphere_obb = plane_sphere | BroadphaseFilter.OBB.value
plane_sphere_aabb_obb = plane_sphere_aabb | BroadphaseFilter.OBB.value
plane_sphere = BroadphaseFilter.PLANE | BroadphaseFilter.SPHERE
plane_aabb = BroadphaseFilter.PLANE | BroadphaseFilter.AABB
plane_obb = BroadphaseFilter.PLANE | BroadphaseFilter.OBB
plane_sphere_aabb = plane_sphere | BroadphaseFilter.AABB
plane_sphere_obb = plane_sphere | BroadphaseFilter.OBB
plane_sphere_aabb_obb = plane_sphere_aabb | BroadphaseFilter.OBB
@parameterized.product(
broadphase=list(BroadphaseType),
@@ -112,7 +113,7 @@ class BroadphaseTest(parameterized.TestCase):
"""
# one world and zero collisions
mjm, _, m, d0 = test_util.fixture(xml=_XML, keyframe=0)
mjm, _, m, d0 = test_data.fixture(xml=_XML, keyframe=0)
m.opt.broadphase = broadphase
m.opt.broadphase_filter = filter
@@ -121,7 +122,7 @@ class BroadphaseTest(parameterized.TestCase):
np.testing.assert_allclose(d0.ncollision.numpy()[0], 0)
# one world and one collision
_, mjd1, _, d1 = test_util.fixture(xml=_XML, keyframe=1)
_, mjd1, _, d1 = test_data.fixture(xml=_XML, keyframe=1)
broadphase_caller(m, d1)
np.testing.assert_allclose(d1.ncollision.numpy()[0], 1)
@@ -129,7 +130,7 @@ class BroadphaseTest(parameterized.TestCase):
np.testing.assert_allclose(d1.collision_pair.numpy()[0][1], 1)
# one world and three collisions
_, mjd2, _, d2 = test_util.fixture(xml=_XML, keyframe=2)
_, mjd2, _, d2 = test_data.fixture(xml=_XML, keyframe=2)
broadphase_caller(m, d2)
ncollision = d2.ncollision.numpy()[0]
@@ -140,7 +141,7 @@ class BroadphaseTest(parameterized.TestCase):
self.assertTrue([d2.collision_pair.numpy()[i][0], d2.collision_pair.numpy()[i][1]] in collision_pairs)
# two worlds and four collisions
d3 = mjwarp.make_data(mjm, nworld=2, nconmax=512, njmax=512)
d3 = mjw.make_data(mjm, nworld=2, nconmax=512, njmax=512)
d3.geom_xpos = wp.array(
np.vstack([np.expand_dims(mjd1.geom_xpos, axis=0), np.expand_dims(mjd2.geom_xpos, axis=0)]),
dtype=wp.vec3,
@@ -162,15 +163,15 @@ class BroadphaseTest(parameterized.TestCase):
self.assertTrue([d3.collision_pair.numpy()[i][0], d3.collision_pair.numpy()[i][1]] in collision_pairs[worldid])
# one world and zero collisions: contype and conaffinity incompatibility
mjm4, _, m4, d4 = test_util.fixture(xml=_XML, keyframe=1)
mjm4, _, m4, d4 = test_data.fixture(xml=_XML, keyframe=1)
mjm4.geom_contype[:3] = 0
m4 = mjwarp.put_model(mjm4)
m4 = mjw.put_model(mjm4)
broadphase_caller(m4, d4)
np.testing.assert_allclose(d4.ncollision.numpy()[0], 0)
# one world and one collision: geomtype ordering
_, _, _, d5 = test_util.fixture(xml=_XML, keyframe=3)
_, _, _, d5 = test_data.fixture(xml=_XML, keyframe=3)
broadphase_caller(m, d5)
np.testing.assert_allclose(d5.ncollision.numpy()[0], 1)
np.testing.assert_allclose(d5.collision_pair.numpy()[0][0], 3)
@@ -195,12 +196,12 @@ class BroadphaseTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_MJCF, keyframe=0)
_, _, m, d = test_data.fixture(xml=_MJCF, keyframe=0)
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], ncollision)
@parameterized.parameters(True, False)
def test_broadphase_filterparent(self, filterparent):
@parameterized.parameters((0, 0), (DisableBit.FILTERPARENT, 1))
def test_broadphase_filterparent(self, disablebit, expected_collisions):
_MJCF = """
<mujoco>
<worldbody>
@@ -218,16 +219,16 @@ class BroadphaseTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_MJCF, filterparent=filterparent, keyframe=0)
_, _, m, d = test_data.fixture(xml=_MJCF, keyframe=0, overrides={"opt.disableflags": disablebit})
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0 if filterparent else 1)
self.assertEqual(d.ncollision.numpy()[0], expected_collisions)
def test_broadphase_filter(self):
plane = BroadphaseFilter.PLANE.value
sphere = BroadphaseFilter.SPHERE.value
aabb = BroadphaseFilter.AABB.value
obb = BroadphaseFilter.OBB.value
plane = BroadphaseFilter.PLANE
sphere = BroadphaseFilter.SPHERE
aabb = BroadphaseFilter.AABB
obb = BroadphaseFilter.OBB
plane_sphere = plane | sphere
plane_aabb = plane | aabb
plane_obb = plane | obb
@@ -260,68 +261,68 @@ class BroadphaseTest(parameterized.TestCase):
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
m.opt.broadphase_filter = plane_sphere
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
m.opt.broadphase_filter = plane_aabb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=0)
m.opt.broadphase_filter = plane_obb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
m.opt.broadphase_filter = plane_sphere
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
# note: collision_driver._plane_filter checks bounding sphere
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
m.opt.broadphase_filter = plane
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 2)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
m.opt.broadphase_filter = plane_sphere
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=1)
m.opt.broadphase_filter = plane_obb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
m.opt.broadphase_filter = plane_sphere
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
m.opt.broadphase_filter = plane_aabb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=2)
m.opt.broadphase_filter = plane_obb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
m.opt.broadphase_filter = plane_sphere
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
m.opt.broadphase_filter = plane_aabb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 1)
_, _, m, d = test_util.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
_, _, m, d = test_data.fixture(xml=_PLANE_CAPSULE_CAPSULE, keyframe=3)
m.opt.broadphase_filter = plane_obb
broadphase_caller(m, d)
self.assertEqual(d.ncollision.numpy()[0], 0)
@@ -43,33 +43,33 @@ mat3c = wp.types.matrix(shape=(MULTI_CONTACT_COUNT, 3), dtype=float)
mat63 = wp.types.matrix(shape=(6, 3), dtype=float)
_CONVEX_COLLISION_PAIRS = [
(GeomType.HFIELD.value, GeomType.SPHERE.value),
(GeomType.HFIELD.value, GeomType.CAPSULE.value),
(GeomType.HFIELD.value, GeomType.ELLIPSOID.value),
(GeomType.HFIELD.value, GeomType.CYLINDER.value),
(GeomType.HFIELD.value, GeomType.BOX.value),
(GeomType.HFIELD.value, GeomType.MESH.value),
(GeomType.SPHERE.value, GeomType.ELLIPSOID.value),
(GeomType.SPHERE.value, GeomType.MESH.value),
(GeomType.CAPSULE.value, GeomType.ELLIPSOID.value),
(GeomType.CAPSULE.value, GeomType.CYLINDER.value),
(GeomType.CAPSULE.value, GeomType.MESH.value),
(GeomType.ELLIPSOID.value, GeomType.ELLIPSOID.value),
(GeomType.ELLIPSOID.value, GeomType.CYLINDER.value),
(GeomType.ELLIPSOID.value, GeomType.BOX.value),
(GeomType.ELLIPSOID.value, GeomType.MESH.value),
(GeomType.CYLINDER.value, GeomType.CYLINDER.value),
(GeomType.CYLINDER.value, GeomType.BOX.value),
(GeomType.CYLINDER.value, GeomType.MESH.value),
(GeomType.BOX.value, GeomType.MESH.value),
(GeomType.MESH.value, GeomType.MESH.value),
(GeomType.HFIELD, GeomType.SPHERE),
(GeomType.HFIELD, GeomType.CAPSULE),
(GeomType.HFIELD, GeomType.ELLIPSOID),
(GeomType.HFIELD, GeomType.CYLINDER),
(GeomType.HFIELD, GeomType.BOX),
(GeomType.HFIELD, GeomType.MESH),
(GeomType.SPHERE, GeomType.ELLIPSOID),
(GeomType.SPHERE, GeomType.MESH),
(GeomType.CAPSULE, GeomType.ELLIPSOID),
(GeomType.CAPSULE, GeomType.CYLINDER),
(GeomType.CAPSULE, GeomType.MESH),
(GeomType.ELLIPSOID, GeomType.ELLIPSOID),
(GeomType.ELLIPSOID, GeomType.CYLINDER),
(GeomType.ELLIPSOID, GeomType.BOX),
(GeomType.ELLIPSOID, GeomType.MESH),
(GeomType.CYLINDER, GeomType.CYLINDER),
(GeomType.CYLINDER, GeomType.BOX),
(GeomType.CYLINDER, GeomType.MESH),
(GeomType.BOX, GeomType.MESH),
(GeomType.MESH, GeomType.MESH),
]
def _check_convex_collision_pairs():
prev_idx = -1
for pair in _CONVEX_COLLISION_PAIRS:
idx = upper_trid_index(len(GeomType), pair[0], pair[1])
idx = upper_trid_index(len(GeomType), pair[0].value, pair[1].value)
if pair[1] < pair[0] or idx <= prev_idx:
return False
prev_idx = idx
@@ -84,8 +84,7 @@ def ccd_kernel_builder(
legacy_gjk: bool,
geomtype1: int,
geomtype2: int,
gjk_iterations: int,
epa_iterations: int,
ccd_iterations: int,
epa_exact_neg_distance: bool,
depth_extension: float,
is_hfield: bool,
@@ -152,7 +151,7 @@ def ccd_kernel_builder(
# TODO(kbayes): remove legacy GJK once multicontact can be enabled
if wp.static(legacy_gjk):
simplex, normal = gjk_legacy(
gjk_iterations,
ccd_iterations,
geom1,
geom2,
geomtype1,
@@ -160,14 +159,14 @@ def ccd_kernel_builder(
)
depth, normal = epa_legacy(
epa_iterations, geom1, geom2, geomtype1, geomtype2, depth_extension, epa_exact_neg_distance, simplex, normal
ccd_iterations, geom1, geom2, geomtype1, geomtype2, depth_extension, epa_exact_neg_distance, simplex, normal
)
dist = -depth
if dist >= 0.0 or depth < -depth_extension:
return 0
sphere = int(GeomType.SPHERE.value)
ellipsoid = int(GeomType.ELLIPSOID.value)
sphere = GeomType.SPHERE
ellipsoid = GeomType.ELLIPSOID
g1 = geoms[0]
g2 = geoms[1]
if geom_type[g1] == sphere or geom_type[g1] == ellipsoid or geom_type[g2] == sphere or geom_type[g2] == ellipsoid:
@@ -177,12 +176,13 @@ def ccd_kernel_builder(
frame = make_frame(normal)
else:
points = mat3c()
geom1.margin = margin
geom2.margin = margin
dist, ncontact, witness1, witness2 = ccd(
False,
False, # ignored for box-box, multiccd always on
opt_ccd_tolerance[worldid],
0.0,
gjk_iterations,
epa_iterations,
ccd_iterations,
geom1,
geom2,
geomtype1,
@@ -389,13 +389,13 @@ def ccd_kernel_builder(
geomtype1,
geom1_dataid,
geom_size[worldid, g1],
mesh_vertadr[geom1_dataid],
mesh_vertnum[geom1_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom1_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom1_dataid],
mesh_polyadr[geom1_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
@@ -412,13 +412,13 @@ def ccd_kernel_builder(
geomtype2,
geom2_dataid,
geom_size[worldid, g2],
mesh_vertadr[geom2_dataid],
mesh_vertnum[geom2_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom2_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom2_dataid],
mesh_polyadr[geom2_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
@@ -633,13 +633,11 @@ def convex_narrowphase(m: Model, d: Data):
computations for non-existent pair types.
"""
for geom_pair in _CONVEX_COLLISION_PAIRS:
g1 = geom_pair[0]
g2 = geom_pair[1]
g1 = geom_pair[0].value
g2 = geom_pair[1].value
if m.geom_pair_type_count[upper_trid_index(len(GeomType), g1, g2)]:
wp.launch(
ccd_kernel_builder(
m.opt.legacy_gjk, g1, g2, m.opt.gjk_iterations, m.opt.epa_iterations, True, 1e9, g1 == int(GeomType.HFIELD.value)
),
ccd_kernel_builder(m.opt.legacy_gjk, g1, g2, m.opt.ccd_iterations, True, 1e9, g1 == GeomType.HFIELD),
dim=d.nconmax,
inputs=[
m.opt.ccd_tolerance,
@@ -233,6 +233,7 @@ def _obb_filter(
return True
@cache_kernel
def _broadphase_filter(opt_broadphase_filter: int):
@wp.func
def func(
@@ -267,16 +268,16 @@ def _broadphase_filter(opt_broadphase_filter: int):
xmat2 = geom_xmat_in[worldid, geom2]
if rbound1 == 0.0 or rbound2 == 0.0:
if wp.static(opt_broadphase_filter & int(BroadphaseFilter.PLANE.value)):
if wp.static(opt_broadphase_filter & BroadphaseFilter.PLANE):
return _plane_filter(rbound1, rbound2, margin1, margin2, xpos1, xpos2, xmat1, xmat2)
else:
if wp.static(opt_broadphase_filter & int(BroadphaseFilter.SPHERE.value)):
if wp.static(opt_broadphase_filter & BroadphaseFilter.SPHERE):
if not _sphere_filter(rbound1, rbound2, margin1, margin2, xpos1, xpos2):
return False
if wp.static(opt_broadphase_filter & int(BroadphaseFilter.AABB.value)):
if wp.static(opt_broadphase_filter & BroadphaseFilter.AABB):
if not _aabb_filter(center1, center2, size1, size2, margin1, margin2, xpos1, xpos2, xmat1, xmat2):
return False
if wp.static(opt_broadphase_filter & int(BroadphaseFilter.OBB.value)):
if wp.static(opt_broadphase_filter & BroadphaseFilter.OBB):
if not _obb_filter(center1, center2, size1, size2, margin1, margin2, xpos1, xpos2, xmat1, xmat2):
return False
@@ -533,7 +534,7 @@ def sap_broadphase(m: Model, d: Data):
],
)
if m.opt.broadphase == int(BroadphaseType.SAP_TILE):
if m.opt.broadphase == BroadphaseType.SAP_TILE:
wp.launch_tiled(
kernel=_segmented_sort(m.ngeom),
dim=(d.nworld),
@@ -715,7 +716,7 @@ def collision(m: Model, d: Data):
if d.nconmax == 0 or m.opt.disableflags & (DisableBit.CONSTRAINT | DisableBit.CONTACT):
return
if m.opt.broadphase == int(BroadphaseType.NXN):
if m.opt.broadphase == BroadphaseType.NXN:
nxn_broadphase(m, d)
else:
sap_broadphase(m, d)
@@ -16,33 +16,16 @@
import mujoco
import numpy as np
import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import BroadphaseType
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp.test_data.collision_sdf.utils import register_sdf_plugins
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src import types
from mujoco.mjx.third_party.mujoco_warp._src.collision_sdf import VolumeData
from mujoco.mjx.third_party.mujoco_warp._src.collision_sdf import sample_volume_sdf
@wp.kernel
def sample_sdf_kernel(
# In:
points: wp.array(dtype=wp.vec3),
volume_data: VolumeData,
# Out:
results_out: wp.array(dtype=float),
):
"""Kernel to sample SDF values at given points using Warp volume."""
tid = wp.tid()
point = points[tid]
sdf_value = sample_volume_sdf(point, volume_data)
results_out[tid] = sdf_value
_TOLERANCE = 5e-5
@@ -501,16 +484,16 @@ class CollisionTest(parameterized.TestCase):
@classmethod
def setUpClass(cls):
register_sdf_plugins(mjwarp)
register_sdf_plugins(mjw)
@parameterized.parameters(_SDF_SDF.keys())
def test_sdf_collision(self, fixture):
"""Tests collisions with different geometries."""
mjm, mjd, m, d = test_util.fixture(xml=self._SDF_SDF[fixture], qpos0=True)
mjm, mjd, m, d = test_data.fixture(xml=self._SDF_SDF[fixture])
mujoco.mj_collision(mjm, mjd)
mjwarp.collision(m, d)
mjw.collision(m, d)
for i in range(min(mjd.ncon, d.ncon.numpy()[0])):
actual_dist = mjd.contact.dist[i]
actual_pos = mjd.contact.pos[i]
@@ -528,14 +511,14 @@ class CollisionTest(parameterized.TestCase):
@parameterized.parameters(_FIXTURES.keys())
def test_collision(self, fixture):
"""Tests collisions with different geometries."""
mjm, mjd, m, d = test_util.fixture(xml=self._FIXTURES[fixture], qpos0=True)
mjm, mjd, m, d = test_data.fixture(xml=self._FIXTURES[fixture])
# Exempt GJK collisions from exact contact count check
# because GJK generates more contacts
allow_different_contact_count = False
mujoco.mj_collision(mjm, mjd)
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertGreater(d.ncon.numpy()[0], 0)
self.assertGreater(mjd.ncon, 0)
@@ -582,16 +565,16 @@ class CollisionTest(parameterized.TestCase):
@parameterized.parameters(_HFIELD_FIXTURES.keys())
def test_hfield_collision(self, fixture):
"""Tests hfield collision with different geometries."""
mjm, mjd, m, d = test_util.fixture(xml=self._HFIELD_FIXTURES[fixture])
mjm, mjd, m, d = test_data.fixture(xml=self._HFIELD_FIXTURES[fixture])
mujoco.mj_collision(mjm, mjd)
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(mjd.ncon > 0, d.ncon.numpy()[0] > 0, "If MJ collides, MJW should too")
def test_contact_exclude(self):
"""Tests contact exclude."""
_, _, m, _ = test_util.fixture(
_, _, m, _ = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -617,11 +600,11 @@ class CollisionTest(parameterized.TestCase):
self.assertEqual(m.nxn_geom_pair.numpy().shape[0], 3)
np.testing.assert_equal(m.nxn_pairid.numpy(), np.array([-2, -1, -1]))
@parameterized.parameters(list(types.BroadphaseType))
@parameterized.parameters(list(BroadphaseType))
def test_contact_pair(self, broadphase):
"""Tests contact pair."""
# no pairs
_, _, m, _ = test_util.fixture(
_, _, m, _ = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -632,12 +615,12 @@ class CollisionTest(parameterized.TestCase):
</worldbody>
</mujoco>
""",
broadphase=broadphase,
overrides={"opt.broadphase": broadphase},
)
self.assertTrue((m.nxn_pairid.numpy() == -1).all())
# 1 pair
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -654,8 +637,7 @@ class CollisionTest(parameterized.TestCase):
<pair geom1="geom1" geom2="geom2" margin="2" gap="3" condim="6" friction="5 4 3 2 1" solref="-.25 -.5" solreffriction="2 4" solimp=".1 .2 .3 .4 .5"/>
</contact>
</mujoco>
""",
qpos0=True,
"""
)
self.assertTrue((m.nxn_pairid.numpy() == 0).all())
@@ -670,7 +652,7 @@ class CollisionTest(parameterized.TestCase):
):
arr.zero_()
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(d.ncon.numpy()[0], 1)
self.assertEqual(d.contact.includemargin.numpy()[0], -1)
@@ -681,7 +663,7 @@ class CollisionTest(parameterized.TestCase):
np.testing.assert_allclose(d.contact.solimp.numpy()[0], np.array([0.1, 0.2, 0.3, 0.4, 0.5]))
# 1 pair: override contype and conaffinity
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -698,8 +680,7 @@ class CollisionTest(parameterized.TestCase):
<pair geom1="geom1" geom2="geom2" margin="2" gap="3" condim="6" friction="5 4 3 2 1" solref="-.25 -.5" solreffriction="2 4" solimp=".1 .2 .3 .4 .5"/>
</contact>
</mujoco>
""",
qpos0=True,
"""
)
self.assertTrue((m.nxn_pairid.numpy() == 0).all())
@@ -714,7 +695,7 @@ class CollisionTest(parameterized.TestCase):
):
arr.zero_()
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(d.ncon.numpy()[0], 1)
self.assertEqual(d.contact.includemargin.numpy()[0], -1)
@@ -725,7 +706,7 @@ class CollisionTest(parameterized.TestCase):
np.testing.assert_allclose(d.contact.solimp.numpy()[0], np.array([0.1, 0.2, 0.3, 0.4, 0.5]))
# 1 pair: override exclude
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -743,8 +724,7 @@ class CollisionTest(parameterized.TestCase):
<pair geom1="geom1" geom2="geom2" margin="2" gap="3" condim="6" friction="5 4 3 2 1" solref="-.25 -.5" solreffriction="2 4" solimp=".1 .2 .3 .4 .5"/>
</contact>
</mujoco>
""",
qpos0=True,
"""
)
self.assertTrue((m.nxn_pairid.numpy() == 0).all())
@@ -759,7 +739,7 @@ class CollisionTest(parameterized.TestCase):
):
arr.zero_()
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(d.ncon.numpy()[0], 1)
self.assertEqual(d.contact.includemargin.numpy()[0], -1)
@@ -770,7 +750,7 @@ class CollisionTest(parameterized.TestCase):
np.testing.assert_allclose(d.contact.solimp.numpy()[0], np.array([0.1, 0.2, 0.3, 0.4, 0.5]))
# 1 pair 1 exclude
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -792,8 +772,7 @@ class CollisionTest(parameterized.TestCase):
<pair geom1="geom2" geom2="geom3" margin="2" gap="3" condim="6" friction="5 4 3 2 1" solref="-.25 -.5" solreffriction="2 4" solimp=".1 .2 .3 .4 .5"/>
</contact>
</mujoco>
""",
qpos0=True,
"""
)
np.testing.assert_equal(m.nxn_pairid.numpy(), np.array([-2, -1, 0]))
@@ -808,7 +787,7 @@ class CollisionTest(parameterized.TestCase):
):
arr.zero_()
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(d.ncon.numpy()[0], 2)
self.assertEqual(d.contact.includemargin.numpy()[1], -1)
@@ -818,29 +797,20 @@ class CollisionTest(parameterized.TestCase):
np.testing.assert_allclose(d.contact.solreffriction.numpy()[1], np.array([2.0, 4.0]))
np.testing.assert_allclose(d.contact.solimp.numpy()[1], np.array([0.1, 0.2, 0.3, 0.4, 0.5]))
@parameterized.parameters(
(True, True),
(True, False),
(False, True),
(False, False),
)
@parameterized.product(constraint=(0, DisableBit.CONSTRAINT), contact=(0, DisableBit.CONTACT))
def test_collision_disableflags(self, constraint, contact):
"""Tests collision disableflags."""
mjm, mjd, m, d = test_util.fixture(
"humanoid/humanoid.xml",
keyframe=0,
constraint=constraint,
contact=contact,
kick=False,
mjm, mjd, m, d = test_data.fixture(
"humanoid/humanoid.xml", keyframe=0, overrides={"opt.disableflags": constraint | contact}
)
mujoco.mj_collision(mjm, mjd)
mjwarp.collision(m, d)
mjw.collision(m, d)
self.assertEqual(d.ncon.numpy()[0], mjd.ncon)
def test_hfield_maxconpair(self):
_XML = f"""
_XML = """
<mujoco>
<asset>
<hfield name="hfield" nrow="10" ncol="10" size="1e-6 1e-6 1 1"/>
@@ -858,14 +828,14 @@ class CollisionTest(parameterized.TestCase):
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_XML, keyframe=0)
_, _, m, d = test_data.fixture(xml=_XML, keyframe=0)
mjwarp.collision(m, d)
mjw.collision(m, d)
np.testing.assert_equal(d.ncon.numpy()[0], types.MJ_MAXCONPAIR)
def test_min_friction(self):
_, _, _, d = test_util.fixture(
_, _, _, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -891,7 +861,7 @@ class CollisionTest(parameterized.TestCase):
@parameterized.parameters(("1", "1"), ("1", "2"), ("2", "1"))
def test_contact_parameter_mixing(self, priority1, priority2):
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml=f"""
<mujoco>
<worldbody>
@@ -909,7 +879,7 @@ class CollisionTest(parameterized.TestCase):
keyframe=0,
)
mjwarp.collision(m, d)
mjw.collision(m, d)
ncon = d.ncon.numpy()[0]
_assert_eq(ncon, 1, "ncon")
+88 -72
View File
@@ -90,54 +90,40 @@ class SupportPoint:
@wp.func
def _discrete_geoms(g1: int, g2: int) -> bool:
return (g1 == int(GeomType.MESH.value) or g1 == int(GeomType.BOX.value) or g1 == int(GeomType.HFIELD.value)) and (
g2 == int(GeomType.MESH.value) or g2 == int(GeomType.BOX.value) or g2 == int(GeomType.HFIELD.value)
return (g1 == GeomType.MESH or g1 == GeomType.BOX or g1 == GeomType.HFIELD) and (
g2 == GeomType.MESH or g2 == GeomType.BOX or g2 == GeomType.HFIELD
)
@wp.func
def _support_margin(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
sp = SupportPoint()
sp.cached_index = -1
sp.vertex_index = -1
if geomtype == int(GeomType.SPHERE.value):
sp.point = geom.pos
return sp
elif geomtype == int(GeomType.CAPSULE.value):
local_dir = wp.transpose(geom.rot) @ dir
res = wp.vec3()
res[2] = wp.where(local_dir[2] >= 0, geom.size[1], -geom.size[1])
sp.point = geom.rot @ res + geom.pos
return sp
@wp.func
def _support(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
sp = SupportPoint()
sp.cached_index = -1
sp.vertex_index = -1
if geomtype == GeomType.SPHERE:
sp.point = geom.pos + (0.5 * geom.margin) * geom.size[0] * dir
return sp
local_dir = wp.transpose(geom.rot) @ dir
if geomtype == int(GeomType.SPHERE.value):
sp.point = geom.pos + geom.size[0] * dir
elif geomtype == int(GeomType.BOX.value):
if geomtype == GeomType.BOX:
tmp = wp.sign(local_dir)
res = wp.cw_mul(tmp, geom.size)
sp.point = geom.rot @ res + geom.pos
sp.vertex_index = wp.where(tmp[0] > 0, 1, 0)
sp.vertex_index += wp.where(tmp[1] > 0, 2, 0)
sp.vertex_index += wp.where(tmp[2] > 0, 4, 0)
elif geomtype == int(GeomType.CAPSULE.value):
elif geomtype == GeomType.CAPSULE:
res = local_dir * geom.size[0]
# add cylinder contribution
res[2] += wp.sign(local_dir[2]) * geom.size[1]
sp.point = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.ELLIPSOID.value):
elif geomtype == GeomType.ELLIPSOID:
res = wp.cw_mul(local_dir, geom.size)
res = wp.normalize(res)
# transform to ellipsoid
res = wp.cw_mul(res, geom.size)
sp.point = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.CYLINDER.value):
elif geomtype == GeomType.CYLINDER:
res = wp.vec3(0.0, 0.0, 0.0)
# set result in XY plane: support on circle
d = wp.sqrt(local_dir[0] * local_dir[0] + local_dir[1] * local_dir[1])
@@ -148,7 +134,7 @@ def _support(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
# set result in Z direction
res[2] = wp.sign(local_dir[2]) * geom.size[1]
sp.point = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.MESH.value):
elif geomtype == GeomType.MESH:
max_dist = float(FLOAT_MIN)
if geom.graphadr == -1 or geom.vertnum < 10:
if geom.index > -1:
@@ -195,7 +181,7 @@ def _support(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
sp.point = geom.vert[geom.vertadr + imax]
sp.point = geom.rot @ sp.point + geom.pos
elif geomtype == int(GeomType.HFIELD.value):
elif geomtype == GeomType.HFIELD:
max_dist = float(FLOAT_MIN)
for i in range(6):
vert = geom.hfprism[i]
@@ -205,6 +191,8 @@ def _support(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
sp.point = vert
sp.point = geom.rot @ sp.point + geom.pos
if geom.margin > 0.0:
sp.point += dir * (0.5 * geom.margin)
return sp
@@ -591,10 +579,9 @@ def gjk(
geomtype1: int,
geomtype2: int,
cutoff: float,
use_margin: bool,
is_discrete: bool,
) -> GJKResult:
"""Find distance within a tolerance between two geoms."""
is_discrete = _discrete_geoms(geomtype1, geomtype2)
cutoff2 = cutoff * cutoff
simplex = mat43()
simplex1 = mat43()
@@ -608,9 +595,6 @@ def gjk(
# set initial guess
x_k = x1_0 - x2_0
use_margin1 = use_margin and (geomtype1 == int(GeomType.SPHERE.value) or geomtype1 == int(GeomType.CAPSULE.value))
use_margin2 = use_margin and (geomtype2 == int(GeomType.SPHERE.value) or geomtype2 == int(GeomType.CAPSULE.value))
for k in range(gjk_iterations):
xnorm = wp.dot(x_k, x_k)
# TODO(kbayes): determine new constant here
@@ -619,13 +603,13 @@ def gjk(
dir_neg = x_k / wp.sqrt(xnorm)
# compute kth support point in geom1
sp = wp.where(use_margin1, _support_margin(geom1, geomtype1, -dir_neg), _support(geom1, geomtype1, -dir_neg))
sp = _support(geom1, geomtype1, -dir_neg)
simplex1[n] = sp.point
geom1.index = sp.cached_index
simplex_index1[n] = sp.vertex_index
# compute kth support point in geom2
sp = wp.where(use_margin2, _support_margin(geom2, geomtype2, dir_neg), _support(geom2, geomtype2, dir_neg))
sp = _support(geom2, geomtype2, dir_neg)
simplex2[n] = sp.point
geom2.index = sp.cached_index
simplex_index2[n] = sp.vertex_index
@@ -692,8 +676,10 @@ def gjk(
result = GJKResult()
# compute the approximate witness points
result.x1 = _linear_combine(n, coordinates, simplex1)
result.x2 = _linear_combine(n, coordinates, simplex2)
# if n is zero, then there was an immediate return meaning the initial points
# are the witness points
result.x1 = wp.where(n == 0, x1_0, _linear_combine(n, coordinates, simplex1))
result.x2 = wp.where(n == 0, x2_0, _linear_combine(n, coordinates, simplex2))
result.dist = wp.norm_l2(x_k)
result.dim = n
@@ -1199,10 +1185,17 @@ def _polytope4(
@wp.func
def _epa(
tolerance: float, epa_iterations: int, pt: Polytope, geom1: Geom, geom2: Geom, geomtype1: int, geomtype2: int
# In:
tolerance: float,
epa_iterations: int,
pt: Polytope,
geom1: Geom,
geom2: Geom,
geomtype1: int,
geomtype2: int,
is_discrete: bool,
) -> Tuple[float, wp.vec3, wp.vec3, int]:
"""Recover penetration data from two geoms in contact given an initial polytope."""
is_discrete = _discrete_geoms(geomtype1, geomtype2)
upper = FLOAT_MAX
upper2 = FLOAT_MAX
idx = int(-1)
@@ -1808,6 +1801,7 @@ def _plane_intersect(pn: wp.vec3, pd: float, a: wp.vec3, b: wp.vec3) -> Tuple[fl
@wp.func
def _polygon_clip(
# In:
prune: bool,
plane_normal: wp.array(dtype=wp.vec3),
plane_dist: wp.array(dtype=float),
face1: wp.array(dtype=wp.vec3),
@@ -1887,7 +1881,7 @@ def _polygon_clip(
if npolygon < 1:
return 0, witness1, witness2
if npolygon > 4:
if prune and npolygon > 4:
quad = _polygon_quad(polygon_out, npolygon)
for i in range(4):
witness2[i] = polygon_out[quad[i]]
@@ -1939,7 +1933,7 @@ def _multicontact(
witness1[0] = x1
witness2[0] = x2
if geomtype1 == int(GeomType.MESH.value):
if geomtype1 == GeomType.MESH:
vert = geom1.vert
polynormal = geom1.mesh_polynormal
polyvertadr = geom1.mesh_polyvertadr
@@ -1948,7 +1942,7 @@ def _multicontact(
polymapadr = geom1.mesh_polymapadr
polymapnum = geom1.mesh_polymapnum
polymap = geom1.mesh_polymap
elif geomtype2 == int(GeomType.MESH.value):
elif geomtype2 == GeomType.MESH:
vert = geom2.vert
polynormal = geom2.mesh_polynormal
polyvertadr = geom2.mesh_polyvertadr
@@ -1966,9 +1960,9 @@ def _multicontact(
dir_neg = -dir
# get all possible face normals for each geom
if geomtype1 == int(GeomType.BOX.value):
if geomtype1 == GeomType.BOX:
nnorms1 = _box_normals(nface1, feature_index1, geom1.rot, dir_neg, n1, idx1)
elif geomtype1 == int(GeomType.MESH.value):
elif geomtype1 == GeomType.MESH:
nnorms1 = _mesh_normals(
nface1,
feature_index1,
@@ -1982,9 +1976,9 @@ def _multicontact(
n1,
idx1,
)
if geomtype2 == int(GeomType.BOX.value):
if geomtype2 == GeomType.BOX:
nnorms2 = _box_normals(nface2, feature_index2, geom2.rot, dir, n2, idx2)
elif geomtype2 == int(GeomType.MESH.value):
elif geomtype2 == GeomType.MESH:
nnorms2 = _mesh_normals(
nface2,
feature_index2,
@@ -2007,11 +2001,11 @@ def _multicontact(
# check if edge-face collision
if nface1 < 3 and nface1 <= nface2:
nnorms1 = 0
if geomtype1 == int(GeomType.BOX.value):
if geomtype1 == GeomType.BOX:
nnorms1 = _box_edge_normals(
nface1, geom1.rot, geom1.pos, geom1.size, feature_vertex1[0], feature_vertex1[1], feature_index1[0], n1, endvert
)
elif geomtype1 == int(GeomType.MESH.value):
elif geomtype1 == GeomType.MESH:
nnorms1 = _mesh_edge_normals(
nface1,
geom1.rot,
@@ -2039,11 +2033,11 @@ def _multicontact(
# check if face-edge collision
elif nface2 < 3:
nnorms2 = 0
if geomtype2 == int(GeomType.BOX.value):
if geomtype2 == GeomType.BOX:
nnorms2 = _box_edge_normals(
nface2, geom2.rot, geom2.pos, geom2.size, feature_vertex2[0], feature_vertex2[1], feature_index2[0], n2, endvert
)
elif geomtype2 == int(GeomType.MESH.value):
elif geomtype2 == GeomType.MESH:
nnorms2 = _mesh_edge_normals(
nface2,
geom2.rot,
@@ -2079,9 +2073,9 @@ def _multicontact(
nface1 = _set_edge(pt.vert1, endvert, face[0], i, face1)
else:
ind = wp.where(is_edge_contact_geom2, idx1[j], idx1[i])
if geomtype1 == int(GeomType.BOX.value):
if geomtype1 == GeomType.BOX:
nface1 = _box_face(geom1.rot, geom1.pos, geom1.size, ind, face1)
elif geomtype1 == int(GeomType.MESH.value):
elif geomtype1 == GeomType.MESH:
nface1 = _mesh_face(
geom1.rot,
geom1.pos,
@@ -2099,9 +2093,9 @@ def _multicontact(
if is_edge_contact_geom2:
nface2 = _set_edge(pt.vert2, endvert, face[0], i, face2)
else:
if geomtype2 == int(GeomType.BOX.value):
if geomtype2 == GeomType.BOX:
nface2 = _box_face(geom2.rot, geom2.pos, geom2.size, idx2[j], face2)
elif geomtype2 == int(GeomType.MESH.value):
elif geomtype2 == GeomType.MESH:
nface2 = _mesh_face(
geom2.rot,
geom2.pos,
@@ -2123,16 +2117,19 @@ def _multicontact(
# face1 is an edge; clip face1 against face2
if is_edge_contact_geom1:
approx_dir = wp.norm_l2(dir) * n2[j]
return _polygon_clip(plane_normal, plane_dist, face2, nface2, face1, nface1, n2[j], approx_dir, polygon, clipped)
return _polygon_clip(False, plane_normal, plane_dist, face2, nface2, face1, nface1, n2[j], approx_dir, polygon, clipped)
# face2 is an edge; clip face2 against face1
if is_edge_contact_geom2:
approx_dir = -wp.norm_l2(dir) * n1[j]
return _polygon_clip(plane_normal, plane_dist, face1, nface1, face2, nface2, n1[j], approx_dir, polygon, clipped)
return _polygon_clip(False, plane_normal, plane_dist, face1, nface1, face2, nface2, n1[j], approx_dir, polygon, clipped)
# face-face collision
approx_dir = wp.norm_l2(dir) * n2[j]
return _polygon_clip(plane_normal, plane_dist, face1, nface1, face2, nface2, n1[i], approx_dir, polygon, clipped)
# don't prune box-box collisions (expect up to 8 contacts)
prune = not (geomtype1 == GeomType.BOX and geomtype2 == GeomType.BOX)
return _polygon_clip(prune, plane_normal, plane_dist, face1, nface1, face2, nface2, n1[i], approx_dir, polygon, clipped)
@wp.func
@@ -2153,8 +2150,7 @@ def ccd(
multiccd: bool,
tolerance: float,
cutoff: float,
gjk_iterations: int,
epa_iterations: int,
ccd_iterations: int,
geom1: Geom,
geom2: Geom,
geomtype1: int,
@@ -2187,19 +2183,30 @@ def ccd(
"""General convex collision detection via GJK/EPA."""
witness1 = mat3c()
witness2 = mat3c()
margin1 = 0.0
margin2 = 0.0
full_margin1 = 0.0
full_margin2 = 0.0
size1 = 0.0
size2 = 0.0
if geomtype1 == int(GeomType.SPHERE.value) or geomtype1 == int(GeomType.CAPSULE.value):
margin1 = geom1.size[0]
# determine if the geoms being tested are discrete
is_discrete = _discrete_geoms(geomtype1, geomtype2) and (geom1.margin == 0.0 and geom2.margin == 0.0)
if geomtype2 == int(GeomType.SPHERE.value) or geomtype2 == int(GeomType.CAPSULE.value):
margin2 = geom2.size[0]
if geomtype1 == GeomType.SPHERE or geomtype1 == GeomType.CAPSULE:
size1 = geom1.size[0]
full_margin1 = size1 + 0.5 * geom1.margin
geom1.margin = 0.0
geom1.size = wp.vec3(0.0, geom1.size[1], geom1.size[2])
if geomtype2 == GeomType.SPHERE or geomtype2 == GeomType.CAPSULE:
size2 = geom2.size[0]
full_margin2 = size2 + 0.5 * geom2.margin
geom2.margin = 0.0
geom2.size = wp.vec3(0.0, geom2.size[1], geom2.size[2])
# special handling for sphere and capsule (shrink to point and line respectively)
if margin1 + margin2 > 0.0:
cutoff += margin1 + margin2
result = gjk(tolerance, gjk_iterations, geom1, geom2, x_1, x_2, geomtype1, geomtype2, cutoff, True)
if size1 + size2 > 0.0:
cutoff += full_margin1 + full_margin2
result = gjk(tolerance, ccd_iterations, geom1, geom2, x_1, x_2, geomtype1, geomtype2, cutoff, is_discrete)
# shallow penetration, inflate contact
if result.dist > tolerance:
@@ -2207,15 +2214,19 @@ def ccd(
witness1[0] = result.x1
witness2[0] = result.x2
return result.dist, 1, witness1, witness2
dist, x1, x2 = _inflate(result.dist, result.x1, result.x2, margin1, margin2)
dist, x1, x2 = _inflate(result.dist, result.x1, result.x2, full_margin1, full_margin2)
witness1[0] = x1
witness2[0] = x2
return dist, 1, witness1, witness2
# deep penetration, reset initial conditions and rerun GJK + EPA
cutoff -= margin1 + margin2
geom1.margin = full_margin1 - size1
geom1.size = wp.vec3(size1, geom1.size[1], geom1.size[2])
geom2.margin = full_margin2 - size2
geom2.size = wp.vec3(size2, geom2.size[1], geom2.size[2])
cutoff -= full_margin1 + full_margin2
result = gjk(tolerance, gjk_iterations, geom1, geom2, x_1, x_2, geomtype1, geomtype2, cutoff, False)
result = gjk(tolerance, ccd_iterations, geom1, geom2, x_1, x_2, geomtype1, geomtype2, cutoff, is_discrete)
# no penetration depth to recover
if result.dist > tolerance or result.dim < 2:
@@ -2305,14 +2316,19 @@ def ccd(
witness2[0] = result.x2
return result.dist, 1, witness1, witness2
dist, x1, x2, idx = _epa(tolerance, epa_iterations, pt, geom1, geom2, geomtype1, geomtype2)
dist, x1, x2, idx = _epa(tolerance, ccd_iterations, pt, geom1, geom2, geomtype1, geomtype2, is_discrete)
if idx == -1:
return FLOAT_MAX, 0, witness1, witness2
# multiccd is always on for box-box collisions
if geomtype1 == GeomType.BOX and geomtype2 == GeomType.BOX:
multiccd = True
if (
multiccd
and (geomtype1 == int(GeomType.BOX.value) or (geomtype1 == int(GeomType.MESH.value) and geom1.mesh_polyadr > -1))
and (geomtype2 == int(GeomType.BOX.value) or (geomtype2 == int(GeomType.MESH.value) and geom2.mesh_polyadr > -1))
and (geom1.margin == 0.0 and geom2.margin == 0.0)
and (geomtype1 == GeomType.BOX or (geomtype1 == GeomType.MESH and geom1.mesh_polyadr > -1))
and (geomtype2 == GeomType.BOX or (geomtype2 == GeomType.MESH and geom2.mesh_polyadr > -1))
):
num, w1, w2 = _multicontact(
polygon,
@@ -54,23 +54,23 @@ VECI2 = vec6(1, 2, 3, 2, 3, 3)
@wp.func
def _gjk_support_geom(geom: Geom, geomtype: int, dir: wp.vec3):
local_dir = wp.transpose(geom.rot) @ dir
if geomtype == int(GeomType.SPHERE.value):
if geomtype == GeomType.SPHERE:
support_pt = geom.pos + geom.size[0] * dir
elif geomtype == int(GeomType.BOX.value):
elif geomtype == GeomType.BOX:
res = wp.cw_mul(wp.sign(local_dir), geom.size)
support_pt = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.CAPSULE.value):
elif geomtype == GeomType.CAPSULE:
res = local_dir * geom.size[0]
# add cylinder contribution
res[2] += wp.sign(local_dir[2]) * geom.size[1]
support_pt = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.ELLIPSOID.value):
elif geomtype == GeomType.ELLIPSOID:
res = wp.cw_mul(local_dir, geom.size)
res = wp.normalize(res)
# transform to ellipsoid
res = wp.cw_mul(res, geom.size)
support_pt = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.CYLINDER.value):
elif geomtype == GeomType.CYLINDER:
res = wp.vec3(0.0, 0.0, 0.0)
# set result in XY plane: support on circle
d = wp.sqrt(wp.dot(local_dir, local_dir))
@@ -81,7 +81,7 @@ def _gjk_support_geom(geom: Geom, geomtype: int, dir: wp.vec3):
# set result in Z direction
res[2] = wp.sign(local_dir[2]) * geom.size[1]
support_pt = geom.rot @ res + geom.pos
elif geomtype == int(GeomType.MESH.value):
elif geomtype == GeomType.MESH:
max_dist = float(FLOAT_MIN)
if geom.graphadr == -1 or geom.vertnum < 10:
# exhaustive search over all vertices
@@ -117,7 +117,7 @@ def _gjk_support_geom(geom: Geom, geomtype: int, dir: wp.vec3):
support_pt = geom.vert[geom.vertadr + imax]
support_pt = geom.rot @ support_pt + geom.pos
elif geomtype == int(GeomType.HFIELD.value):
elif geomtype == GeomType.HFIELD:
max_dist = float(FLOAT_MIN)
for i in range(6):
vert = geom.hfprism[i]
@@ -13,23 +13,23 @@
# limitations under the License.
# ==============================================================================
import numpy as np
import warp as wp
from absl.testing import absltest
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp import Data
from mujoco.mjx.third_party.mujoco_warp import GeomType
from mujoco.mjx.third_party.mujoco_warp import Model
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.collision_gjk import ccd
from mujoco.mjx.third_party.mujoco_warp._src.collision_primitive import Geom
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
MAX_ITERATIONS = 20
def _geom_dist(m: Model, d: Data, gid1: int, gid2: int, iterations: int, multiccd=False):
def _geom_dist(m: Model, d: Data, gid1: int, gid2: int, iterations: int, multiccd=False, margin=0.0):
@nested_kernel(module="unique", enable_backward=False)
def _gjk_kernel(
# Model:
@@ -82,18 +82,17 @@ def _geom_dist(m: Model, d: Data, gid1: int, gid2: int, iterations: int, multicc
ncon_out: wp.array(dtype=int),
pos_out: wp.array(dtype=wp.vec3),
):
MESHGEOM = int(GeomType.MESH.value)
geom1 = Geom()
geom1.index = -1
geomtype1 = geom_type[gid1]
geom1.pos = geom_xpos_in[0, gid1]
geom1.rot = geom_xmat_in[0, gid1]
geom1.size = geom_size[0, gid1]
geom1.margin = margin
geom1.graphadr = -1
geom1.mesh_polyadr = -1
if geom_dataid[gid1] >= 0 and geom_type[gid1] == MESHGEOM:
if geom_dataid[gid1] >= 0 and geom_type[gid1] == GeomType.MESH:
dataid = geom_dataid[gid1]
geom1.vertadr = mesh_vertadr[dataid]
geom1.vertnum = mesh_vertnum[dataid]
@@ -114,10 +113,11 @@ def _geom_dist(m: Model, d: Data, gid1: int, gid2: int, iterations: int, multicc
geom2.pos = geom_xpos_in[0, gid2]
geom2.rot = geom_xmat_in[0, gid2]
geom2.size = geom_size[0, gid2]
geom2.margin = margin
geom2.graphadr = -1
geom2.mesh_polyadr = -1
if geom_dataid[gid2] >= 0 and geom_type[gid2] == MESHGEOM:
if geom_dataid[gid2] >= 0 and geom_type[gid2] == GeomType.MESH:
dataid = geom_dataid[gid2]
geom2.vertadr = mesh_vertadr[dataid]
geom2.vertnum = mesh_vertnum[dataid]
@@ -145,7 +145,6 @@ def _geom_dist(m: Model, d: Data, gid1: int, gid2: int, iterations: int, multicc
1e-6,
1.0e30,
iterations,
iterations,
geom1,
geom2,
geomtype1,
@@ -268,8 +267,8 @@ class GJKTest(absltest.TestCase):
def test_spheres_distance(self):
"""Test distance between two spheres."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom name="geom1" type="sphere" pos="-1.5 0 0" size="1"/>
@@ -279,14 +278,16 @@ class GJKTest(absltest.TestCase):
"""
)
dist, _, _, _ = _geom_dist(m, d, 0, 1, MAX_ITERATIONS)
dist, _, x1, x2 = _geom_dist(m, d, 0, 1, MAX_ITERATIONS)
self.assertEqual(1.0, dist)
self.assertEqual(-0.5, x1[0])
self.assertEqual(0.5, x2[0])
def test_spheres_touching(self):
"""Test two touching spheres have zero distance"""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom type="sphere" pos="-1 0 0" size="1"/>
@@ -302,8 +303,8 @@ class GJKTest(absltest.TestCase):
def test_box_mesh_distance(self):
"""Test distance between a mesh and box"""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco model="MuJoCo Model">
<asset>
<mesh name="smallbox" scale="0.1 0.1 0.1"
@@ -330,8 +331,8 @@ class GJKTest(absltest.TestCase):
def test_sphere_sphere_contact(self):
"""Test penetration depth between two spheres."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom type="sphere" pos="-1 0 0" size="3"/>
@@ -347,8 +348,8 @@ class GJKTest(absltest.TestCase):
def test_box_box_contact(self):
"""Test penetration between two boxes."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom type="box" pos="-1 0 0" size="2.5 2.5 2.5"/>
@@ -358,8 +359,10 @@ class GJKTest(absltest.TestCase):
"""
)
dist, _, x1, x2 = _geom_dist(m, d, 0, 1, MAX_ITERATIONS)
diff = x1 - x2
normal = diff / np.linalg.norm(diff)
self.assertAlmostEqual(-1, dist)
normal = wp.normalize(x1 - x2)
self.assertAlmostEqual(normal[0], 1)
self.assertAlmostEqual(normal[1], 0)
self.assertAlmostEqual(normal[2], 0)
@@ -367,8 +370,8 @@ class GJKTest(absltest.TestCase):
def test_mesh_mesh_contact(self):
"""Test penetration between two meshes."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<asset>
<mesh name="box" scale=".5 .5 .1"
@@ -404,8 +407,8 @@ class GJKTest(absltest.TestCase):
def test_cylinder_cylinder_contact(self):
"""Test penetration between two cylinder."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom pos="0 0 0" type="cylinder" size="1 .5"/>
@@ -421,8 +424,8 @@ class GJKTest(absltest.TestCase):
def test_box_edge(self):
"""Test box edge."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom pos="0 0 2" type="box" name="box2" size="1 1 1"/>
@@ -436,8 +439,8 @@ class GJKTest(absltest.TestCase):
def test_box_box_ccd(self):
"""Test box box."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom name="geom1" type="box" pos="0 0 1.9" size="1 1 1"/>
@@ -452,8 +455,8 @@ class GJKTest(absltest.TestCase):
def test_mesh_mesh_ccd(self):
"""Test mesh-mesh multiccd."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<asset>
<mesh name="smallbox"
@@ -473,8 +476,8 @@ class GJKTest(absltest.TestCase):
def test_box_box_ccd2(self):
"""Test box-box multiccd 2."""
_, _, m, d = test_util.fixture(
xml=f"""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<geom size="1 1 1" pos="0 0 2" type="box"/>
@@ -485,7 +488,28 @@ class GJKTest(absltest.TestCase):
)
_, ncon, _, _ = _geom_dist(m, d, 0, 1, MAX_ITERATIONS, multiccd=True)
self.assertEqual(ncon, 4)
self.assertEqual(ncon, 5)
def test_sphere_mesh_margin(self):
"""Test sphere-mesh margin."""
_, _, m, d = test_data.fixture(
xml="""
<mujoco>
<asset>
<mesh name="box" scale=".2 .2 .2"
vertex="-1 -1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1"/>
</asset>
<worldbody>
<geom type="sphere" pos="0 0 .349" size=".1"/>
<geom type="mesh" mesh="box"/>
</worldbody>
</mujoco>
"""
)
dist, _, _, _ = _geom_dist(m, d, 0, 1, MAX_ITERATIONS, multiccd=False, margin=0.05)
self.assertAlmostEqual(dist, -0.001)
if __name__ == "__main__":
@@ -38,6 +38,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
@@ -59,6 +60,7 @@ class Geom:
rot: wp.mat33
normal: wp.vec3
size: wp.vec3
margin: float
hfprism: mat63
vertadr: int
vertnum: int
@@ -84,13 +86,13 @@ def geom(
geom_type: int,
geom_dataid: int,
geom_size: wp.vec3,
mesh_vertadr: int,
mesh_vertnum: int,
mesh_vertadr: wp.array(dtype=int),
mesh_vertnum: wp.array(dtype=int),
mesh_vert: wp.array(dtype=wp.vec3),
mesh_graphadr: int,
mesh_graphadr: wp.array(dtype=int),
mesh_graph: wp.array(dtype=int),
mesh_polynum: int,
mesh_polyadr: int,
mesh_polynum: wp.array(dtype=int),
mesh_polyadr: wp.array(dtype=int),
mesh_polynormal: wp.array(dtype=wp.vec3),
mesh_polyvertadr: wp.array(dtype=int),
mesh_polyvertnum: wp.array(dtype=int),
@@ -109,21 +111,20 @@ def geom(
geom.size = geom_size
geom.normal = wp.vec3(geom_xmat_in[0, 2], geom_xmat_in[1, 2], geom_xmat_in[2, 2]) # plane
# If geom is MESH, get mesh verts
if geom_dataid >= 0 and geom_type == int(GeomType.MESH.value):
geom.vertadr = mesh_vertadr
geom.vertnum = mesh_vertnum
geom.graphadr = mesh_graphadr
geom.mesh_polynum = mesh_polynum
geom.mesh_polyadr = mesh_polyadr
else:
geom.vertadr = -1
geom.vertnum = -1
geom.graphadr = -1
geom.mesh_polynum = -1
geom.mesh_polyadr = -1
if geom_type == GeomType.MESH:
if geom_dataid >= 0:
geom.vertadr = mesh_vertadr[geom_dataid]
geom.vertnum = mesh_vertnum[geom_dataid]
geom.graphadr = mesh_graphadr[geom_dataid]
geom.mesh_polynum = mesh_polynum[geom_dataid]
geom.mesh_polyadr = mesh_polyadr[geom_dataid]
else:
geom.vertadr = -1
geom.vertnum = -1
geom.graphadr = -1
geom.mesh_polynum = -1
geom.mesh_polyadr = -1
if geom_type == int(GeomType.MESH.value):
geom.vert = mesh_vert
geom.graph = mesh_graph
geom.mesh_polynormal = mesh_polynormal
@@ -135,6 +136,8 @@ def geom(
geom.mesh_polymap = mesh_polymap
geom.index = -1
geom.margin = 0.0
return geom
@@ -167,56 +170,64 @@ def plane_convex(plane_normal: wp.vec3, plane_pos: wp.vec3, convex: Geom) -> Tup
# exhaustive search over all vertices
if convex.graphadr == -1 or convex.vertnum < 10:
# Find support points
# find support points
max_support = wp.float32(-_HUGE_VAL)
for i in range(convex.vertnum):
support = wp.dot(plane_pos_local - convex.vert[convex.vertadr + i], n)
max_support = wp.max(support, max_support)
threshold = wp.max(0.0, max_support - 1e-3)
# Find point a (first support point)
# find first support point (a)
a_dist = wp.float32(-_HUGE_VAL)
a = wp.vec3()
for i in range(convex.vertnum):
support = wp.dot(plane_pos_local - convex.vert[convex.vertadr + i], n)
vert = convex.vert[convex.vertadr + i]
support = wp.dot(plane_pos_local - vert, n)
dist = wp.where(support > threshold, support, -_HUGE_VAL)
if dist > a_dist:
indices[0] = i
a_dist = dist
a = convex.vert[convex.vertadr + indices[0]]
a = vert
# Find point b (furthest from a)
# find point (b) furthest from a
b_dist = wp.float32(-_HUGE_VAL)
b = wp.vec3()
for i in range(convex.vertnum):
support = wp.dot(plane_pos_local - convex.vert[convex.vertadr + i], n)
vert = convex.vert[convex.vertadr + i]
support = wp.dot(plane_pos_local - vert, n)
dist_mask = wp.where(support > threshold, 0.0, -_HUGE_VAL)
dist = wp.length_sq(a - convex.vert[convex.vertadr + i]) + dist_mask
dist = wp.length_sq(a - vert) + dist_mask
if dist > b_dist:
indices[1] = i
b_dist = dist
b = convex.vert[convex.vertadr + indices[1]]
b = vert
# Find point c (furthest along axis orthogonal to a-b)
# find point (c) furthest along axis orthogonal to a-b
ab = wp.cross(n, a - b)
c_dist = wp.float32(-_HUGE_VAL)
c = wp.vec3()
for i in range(convex.vertnum):
support = wp.dot(plane_pos_local - convex.vert[convex.vertadr + i], n)
vert = convex.vert[convex.vertadr + i]
support = wp.dot(plane_pos_local - vert, n)
dist_mask = wp.where(support > threshold, 0.0, -_HUGE_VAL)
ap = a - convex.vert[convex.vertadr + i]
ap = a - vert
dist = wp.abs(wp.dot(ap, ab)) + dist_mask
if dist > c_dist:
indices[2] = i
c_dist = dist
c = convex.vert[convex.vertadr + indices[2]]
c = vert
# Find point d (furthest from other triangle edges)
# find point (d) furthest from other triangle edges
ac = wp.cross(n, a - c)
bc = wp.cross(n, b - c)
d_dist = wp.float32(-_HUGE_VAL)
for i in range(convex.vertnum):
support = wp.dot(plane_pos_local - convex.vert[convex.vertadr + i], n)
vert = convex.vert[convex.vertadr + i]
support = wp.dot(plane_pos_local - vert, n)
dist_mask = wp.where(support > threshold, 0.0, -_HUGE_VAL)
ap = a - convex.vert[convex.vertadr + i]
bp = b - convex.vert[convex.vertadr + i]
ap = a - vert
bp = b - vert
dist_ap = wp.abs(wp.dot(ap, ac)) + dist_mask
dist_bp = wp.abs(wp.dot(bp, bc)) + dist_mask
if dist_ap + dist_bp > d_dist:
@@ -1406,19 +1417,19 @@ def box_box_wrapper(
_PRIMITIVE_COLLISIONS = {
(GeomType.PLANE.value, GeomType.SPHERE.value): plane_sphere_wrapper,
(GeomType.PLANE.value, GeomType.CAPSULE.value): plane_capsule_wrapper,
(GeomType.PLANE.value, GeomType.ELLIPSOID.value): plane_ellipsoid_wrapper,
(GeomType.PLANE.value, GeomType.CYLINDER.value): plane_cylinder_wrapper,
(GeomType.PLANE.value, GeomType.BOX.value): plane_box_wrapper,
(GeomType.PLANE.value, GeomType.MESH.value): plane_convex_wrapper,
(GeomType.SPHERE.value, GeomType.SPHERE.value): sphere_sphere_wrapper,
(GeomType.SPHERE.value, GeomType.CAPSULE.value): sphere_capsule_wrapper,
(GeomType.SPHERE.value, GeomType.CYLINDER.value): sphere_cylinder_wrapper,
(GeomType.SPHERE.value, GeomType.BOX.value): sphere_box_wrapper,
(GeomType.CAPSULE.value, GeomType.CAPSULE.value): capsule_capsule_wrapper,
(GeomType.CAPSULE.value, GeomType.BOX.value): capsule_box_wrapper,
(GeomType.BOX.value, GeomType.BOX.value): box_box_wrapper,
(GeomType.PLANE, GeomType.SPHERE): plane_sphere_wrapper,
(GeomType.PLANE, GeomType.CAPSULE): plane_capsule_wrapper,
(GeomType.PLANE, GeomType.ELLIPSOID): plane_ellipsoid_wrapper,
(GeomType.PLANE, GeomType.CYLINDER): plane_cylinder_wrapper,
(GeomType.PLANE, GeomType.BOX): plane_box_wrapper,
(GeomType.PLANE, GeomType.MESH): plane_convex_wrapper,
(GeomType.SPHERE, GeomType.SPHERE): sphere_sphere_wrapper,
(GeomType.SPHERE, GeomType.CAPSULE): sphere_capsule_wrapper,
(GeomType.SPHERE, GeomType.CYLINDER): sphere_cylinder_wrapper,
(GeomType.SPHERE, GeomType.BOX): sphere_box_wrapper,
(GeomType.CAPSULE, GeomType.CAPSULE): capsule_capsule_wrapper,
(GeomType.CAPSULE, GeomType.BOX): capsule_box_wrapper,
(GeomType.BOX, GeomType.BOX): box_box_wrapper,
}
@@ -1426,7 +1437,7 @@ _PRIMITIVE_COLLISIONS = {
def _check_primitive_collisions():
prev_idx = -1
for types in _PRIMITIVE_COLLISIONS.keys():
idx = upper_trid_index(len(GeomType), types[0], types[1])
idx = upper_trid_index(len(GeomType), types[0].value, types[1].value)
if types[1] < types[0] or idx <= prev_idx:
return False
prev_idx = idx
@@ -1439,13 +1450,7 @@ _primitive_collisions_types = []
_primitive_collisions_func = []
def _primitive_narrowphase_builder(m: Model):
for types, func in _PRIMITIVE_COLLISIONS.items():
idx = upper_trid_index(len(GeomType), types[0], types[1])
if m.geom_pair_type_count[idx] and types not in _primitive_collisions_types:
_primitive_collisions_types.append(types)
_primitive_collisions_func.append(func)
def _create_narrowphase_kernel():
@nested_kernel(module="unique", enable_backward=False)
def _primitive_narrowphase(
# Model:
@@ -1549,13 +1554,13 @@ def _primitive_narrowphase_builder(m: Model):
type1,
geom1_dataid,
geom_size[worldid, g1],
mesh_vertadr[geom1_dataid],
mesh_vertnum[geom1_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom1_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom1_dataid],
mesh_polyadr[geom1_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
@@ -1572,13 +1577,13 @@ def _primitive_narrowphase_builder(m: Model):
type2,
geom2_dataid,
geom_size[worldid, g2],
mesh_vertadr[geom2_dataid],
mesh_vertnum[geom2_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom2_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom2_dataid],
mesh_polyadr[geom2_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
@@ -1625,6 +1630,16 @@ def _primitive_narrowphase_builder(m: Model):
return _primitive_narrowphase
def _primitive_narrowphase_builder(m: Model):
for types, func in _PRIMITIVE_COLLISIONS.items():
idx = upper_trid_index(len(GeomType), types[0].value, types[1].value)
if m.geom_pair_type_count[idx] and types not in _primitive_collisions_types:
_primitive_collisions_types.append(types)
_primitive_collisions_func.append(func)
return _create_narrowphase_kernel()
@event_scope
def primitive_narrowphase(m: Model, d: Data):
"""Runs collision detection on primitive geom pairs discovered during broadphase.
+44 -32
View File
@@ -93,11 +93,11 @@ def get_sdf_params(
plugin_index = -1
volume_data = VolumeData()
if g_type == int(GeomType.SDF.value) and plugin_id != -1:
if g_type == GeomType.SDF and plugin_id != -1:
attributes = plugin_attr[plugin_id]
plugin_index = plugin[plugin_id]
elif g_type == int(GeomType.SDF.value) and mesh_id != -1:
elif g_type == GeomType.SDF and mesh_id != -1:
volume_data.center = oct_aabb[mesh_id, 0]
volume_data.half_size = oct_aabb[mesh_id, 1]
volume_data.oct_aabb = oct_aabb
@@ -232,6 +232,7 @@ def find_oct(
rx = vec8f(0.0)
ry = vec8f(0.0)
rz = vec8f(0.0)
eps = 1e-6
while niter > 0:
niter -= 1
@@ -243,6 +244,17 @@ def find_oct(
vmin = oct_aabb[node, 0] - oct_aabb[node, 1]
vmax = oct_aabb[node, 0] + oct_aabb[node, 1]
if (
p[0] + eps < vmin[0]
or p[0] - eps > vmax[0]
or p[1] + eps < vmin[1]
or p[1] - eps > vmax[1]
or p[2] + eps < vmin[2]
or p[2] - eps > vmax[2]
):
continue
coord = wp.cw_div(p - vmin, vmax - vmin)
# check if the node is a leaf
@@ -270,9 +282,9 @@ def find_oct(
return node, (rx, ry, rz)
# compute which of 8 children to visit next
x = 1 if coord[0] < 0.5 else 0
y = 1 if coord[1] < 0.5 else 0
z = 1 if coord[2] < 0.5 else 0
x = 0 if coord[0] < 0.5 else 1
y = 0 if coord[1] < 0.5 else 1
z = 0 if coord[2] < 0.5 else 1
stack = oct_child[node][4 * z + 2 * y + x]
wp.print("ERROR: Node not found\n")
@@ -345,15 +357,15 @@ def sample_volume_grad(xyz: wp.vec3, volume_data: VolumeData) -> wp.vec3:
@wp.func
def sdf(type: int, p: wp.vec3, attr: wp.vec3, sdf_type: int, volume_data: VolumeData, mesh_data: MeshData) -> float:
if type == int(GeomType.PLANE.value):
if type == GeomType.PLANE:
return p[2]
elif type == int(GeomType.SPHERE.value):
elif type == GeomType.SPHERE:
return sphere(p, attr)
elif type == int(GeomType.BOX.value):
elif type == GeomType.BOX:
return box(p, attr)
elif type == int(GeomType.ELLIPSOID.value):
elif type == GeomType.ELLIPSOID:
return ellipsoid(p, attr)
elif type == int(GeomType.MESH.value) and mesh_data.valid:
elif type == GeomType.MESH and mesh_data.valid:
mesh_data.pnt = p
mesh_data.vec = -wp.normalize(p)
dist = ray_mesh(
@@ -382,7 +394,7 @@ def sdf(type: int, p: wp.vec3, attr: wp.vec3, sdf_type: int, volume_data: Volume
-mesh_data.vec,
)
return dist
elif type == int(GeomType.SDF.value):
elif type == GeomType.SDF:
if sdf_type == -1:
return sample_volume_sdf(p, volume_data)
else:
@@ -393,16 +405,16 @@ def sdf(type: int, p: wp.vec3, attr: wp.vec3, sdf_type: int, volume_data: Volume
@wp.func
def sdf_grad(type: int, p: wp.vec3, attr: wp.vec3, sdf_type: int, volume_data: VolumeData, mesh_data: MeshData) -> wp.vec3:
if type == int(GeomType.PLANE.value):
if type == GeomType.PLANE:
grad = wp.vec3(0.0, 0.0, 1.0)
return grad
elif type == int(GeomType.SPHERE.value):
elif type == GeomType.SPHERE:
return grad_sphere(p)
elif type == int(GeomType.BOX.value):
elif type == GeomType.BOX:
return grad_box(p, attr)
elif type == int(GeomType.ELLIPSOID.value):
elif type == GeomType.ELLIPSOID:
return grad_ellipsoid(p, attr)
elif type == int(GeomType.MESH.value) and mesh_data.valid:
elif type == GeomType.MESH and mesh_data.valid:
mesh_data.pnt = p
mesh_data.vec = -wp.normalize(p)
dist = ray_mesh(
@@ -422,7 +434,7 @@ def sdf_grad(type: int, p: wp.vec3, attr: wp.vec3, sdf_type: int, volume_data: V
else:
return wp.vec3(-1.0)
elif type == int(GeomType.SDF.value):
elif type == GeomType.SDF:
if sdf_type == -1:
return sample_volume_grad(p, volume_data)
else:
@@ -448,7 +460,7 @@ def clearance(
mesh_data2: MeshData,
) -> float:
sdf1 = sdf(type1, p1, s1, sdf_type1, volume_data1, mesh_data1)
sdf2 = sdf(int(GeomType.SDF.value), p2, s2, sdf_type2, volume_data2, mesh_data2)
sdf2 = sdf(GeomType.SDF, p2, s2, sdf_type2, volume_data2, mesh_data2)
if sfd_intersection:
return wp.max(sdf1, sdf2)
else:
@@ -471,9 +483,9 @@ def compute_grad(
mesh_data2: MeshData,
) -> wp.vec3:
A = sdf(type1, p1, params.attr1, sdf_type1, volume_data1, mesh_data1)
B = sdf(int(GeomType.SDF.value), p2, params.attr2, sdf_type2, volume_data2, mesh_data2)
B = sdf(GeomType.SDF, p2, params.attr2, sdf_type2, volume_data2, mesh_data2)
grad1 = sdf_grad(type1, p1, params.attr1, sdf_type1, volume_data1, mesh_data1)
grad2 = sdf_grad(int(GeomType.SDF.value), p2, params.attr2, sdf_type2, volume_data2, mesh_data2)
grad2 = sdf_grad(GeomType.SDF, p2, params.attr2, sdf_type2, volume_data2, mesh_data2)
grad1_transformed = wp.transpose(params.rel_mat) * grad1
if sfd_intersection:
if A > B:
@@ -594,7 +606,7 @@ def gradient_descent(
grad1 = sdf_grad(type1, x_1, params.attr1, sdf_type1, volume_data1, mesh_data1)
grad1 = wp.transpose(params.rel_mat) * grad1
grad1 = wp.normalize(grad1)
grad2 = sdf_grad(int(GeomType.SDF.value), x, params.attr2, sdf_type2, volume_data2, mesh_data2)
grad2 = sdf_grad(GeomType.SDF, x, params.attr2, sdf_type2, volume_data2, mesh_data2)
grad2 = wp.normalize(grad2)
n = grad1 - grad2
n = wp.normalize(n)
@@ -688,7 +700,7 @@ def _sdf_narrowphase(
geoms = collision_pair_in[contact_tid]
g2 = geoms[1]
type2 = geom_type[g2]
if type2 != int(GeomType.SDF.value):
if type2 != GeomType.SDF:
return
worldid = collision_worldid_in[contact_tid]
_, margin, gap, condim, friction, solref, solreffriction, solimp = contact_params(
@@ -720,13 +732,13 @@ def _sdf_narrowphase(
type1,
geom1_dataid,
geom_size[worldid, g1],
mesh_vertadr[geom1_dataid],
mesh_vertnum[geom1_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom1_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom1_dataid],
mesh_polyadr[geom1_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
@@ -743,13 +755,13 @@ def _sdf_narrowphase(
type2,
geom2_dataid,
geom_size[worldid, g2],
mesh_vertadr[geom2_dataid],
mesh_vertnum[geom2_dataid],
mesh_vertadr,
mesh_vertnum,
mesh_vert,
mesh_graphadr[geom2_dataid],
mesh_graphadr,
mesh_graph,
mesh_polynum[geom2_dataid],
mesh_polyadr[geom2_dataid],
mesh_polynum,
mesh_polyadr,
mesh_polynormal,
mesh_polyvertadr,
mesh_polyvertnum,
+184 -207
View File
@@ -166,11 +166,10 @@ def _efc_equality_connect(
):
"""Calculates constraint rows for connect equality constraints."""
worldid, i_eq_connect_adr = wp.tid()
timestep = opt_timestep[worldid]
i_eq = eq_connect_adr[i_eq_connect_adr]
worldid, eqconnectid = wp.tid()
eqid = eq_connect_adr[eqconnectid]
if not eq_active_in[worldid, i_eq]:
if not eq_active_in[worldid, eqid]:
return
wp.atomic_add(ne_connect_out, worldid, 3)
@@ -179,14 +178,14 @@ def _efc_equality_connect(
if efcid + 3 >= njmax_in:
return
data = eq_data[worldid, i_eq]
data = eq_data[worldid, eqid]
anchor1 = wp.vec3f(data[0], data[1], data[2])
anchor2 = wp.vec3f(data[3], data[4], data[5])
obj1id = eq_obj1id[i_eq]
obj2id = eq_obj2id[i_eq]
obj1id = eq_obj1id[eqid]
obj2id = eq_obj2id[eqid]
if nsite and eq_objtype[i_eq] == wp.static(types.ObjType.SITE.value):
if nsite and eq_objtype[eqid] == types.ObjType.SITE:
# body1id stores the index of site_bodyid.
body1id = site_bodyid[obj1id]
body2id = site_bodyid[obj2id]
@@ -235,15 +234,15 @@ def _efc_equality_connect(
invweight = body_invweight0[worldid, body1id][0] + body_invweight0[worldid, body2id][0]
pos_imp = wp.length(pos)
solref = eq_solref[worldid, i_eq]
solimp = eq_solimp[worldid, i_eq]
solref = eq_solref[worldid, eqid]
solimp = eq_solimp[worldid, eqid]
for i in range(3):
efcidi = efcid + i
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcidi,
pos[i],
@@ -254,8 +253,8 @@ def _efc_equality_connect(
0.0,
Jqvel[i],
0.0,
ConstraintType.EQUALITY.value,
i_eq,
ConstraintType.EQUALITY,
eqid,
efc_type_out,
efc_id_out,
efc_pos_out,
@@ -302,10 +301,10 @@ def _efc_equality_joint(
efc_aref_out: wp.array2d(dtype=float),
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, i_eq_joint_adr = wp.tid()
timestep = opt_timestep[worldid]
i_eq = eq_jnt_adr[i_eq_joint_adr]
if not eq_active_in[worldid, i_eq]:
worldid, eqjntid = wp.tid()
eqid = eq_jnt_adr[eqjntid]
if not eq_active_in[worldid, eqid]:
return
wp.atomic_add(ne_jnt_out, worldid, 1)
@@ -317,9 +316,9 @@ def _efc_equality_joint(
for i in range(nv):
efc_J_out[worldid, efcid, i] = 0.0
jntid_1 = eq_obj1id[i_eq]
jntid_2 = eq_obj2id[i_eq]
data = eq_data[worldid, i_eq]
jntid_1 = eq_obj1id[eqid]
jntid_2 = eq_obj2id[eqid]
data = eq_data[worldid, eqid]
dofadr1 = jnt_dofadr[jntid_1]
qposadr1 = jnt_qposadr[jntid_1]
efc_J_out[worldid, efcid, dofadr1] = 1.0
@@ -348,19 +347,19 @@ def _efc_equality_joint(
# Update constraint parameters
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
pos,
pos,
invweight,
eq_solref[worldid, i_eq],
eq_solimp[worldid, i_eq],
eq_solref[worldid, eqid],
eq_solimp[worldid, eqid],
0.0,
Jqvel,
0.0,
ConstraintType.EQUALITY.value,
i_eq,
ConstraintType.EQUALITY,
eqid,
efc_type_out,
efc_id_out,
efc_pos_out,
@@ -406,9 +405,8 @@ def _efc_equality_tendon(
efc_aref_out: wp.array2d(dtype=float),
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, tenid = wp.tid()
timestep = opt_timestep[worldid]
eqid = eq_ten_adr[tenid]
worldid, eqtenid = wp.tid()
eqid = eq_ten_adr[eqtenid]
if not eq_active_in[worldid, eqid]:
return
@@ -457,7 +455,7 @@ def _efc_equality_tendon(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
pos,
@@ -468,7 +466,7 @@ def _efc_equality_tendon(
0.0,
Jqvel,
0.0,
ConstraintType.EQUALITY.value,
ConstraintType.EQUALITY,
eqid,
efc_type_out,
efc_id_out,
@@ -509,18 +507,16 @@ def _efc_friction_dof(
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, dofid = wp.tid()
timestep = opt_timestep[worldid]
if dof_frictionloss[worldid, dofid] <= 0.0:
return
wp.atomic_add(nf_out, worldid, 1)
efcid = wp.atomic_add(nefc_out, worldid, 1)
if efcid >= njmax_in:
return
wp.atomic_add(nf_out, worldid, 1)
for i in range(nv):
efc_J_out[worldid, efcid, i] = 0.0
@@ -529,7 +525,7 @@ def _efc_friction_dof(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
0.0,
@@ -540,7 +536,7 @@ def _efc_friction_dof(
0.0,
Jqvel,
dof_frictionloss[worldid, dofid],
ConstraintType.FRICTION_DOF.value,
ConstraintType.FRICTION_DOF,
dofid,
efc_type_out,
efc_id_out,
@@ -563,6 +559,7 @@ def _efc_friction_tendon(
tendon_frictionloss: wp.array2d(dtype=float),
tendon_invweight0: wp.array2d(dtype=float),
# Data in:
njmax_in: int,
qvel_in: wp.array2d(dtype=float),
ten_J_in: wp.array3d(dtype=float),
# In:
@@ -581,14 +578,16 @@ def _efc_friction_tendon(
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, tenid = wp.tid()
timestep = opt_timestep[worldid]
frictionloss = tendon_frictionloss[worldid, tenid]
if frictionloss <= 0.0:
return
efcid = wp.atomic_add(nefc_out, worldid, 1)
wp.atomic_add(nf_out, worldid, 1)
efcid = wp.atomic_add(nefc_out, worldid, 1)
if efcid >= njmax_in:
return
Jqvel = float(0.0)
@@ -600,7 +599,7 @@ def _efc_friction_tendon(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
0.0,
@@ -611,7 +610,7 @@ def _efc_friction_tendon(
0.0,
Jqvel,
frictionloss,
ConstraintType.FRICTION_TENDON.value,
ConstraintType.FRICTION_TENDON,
tenid,
efc_type_out,
efc_id_out,
@@ -668,10 +667,10 @@ def _efc_equality_weld(
efc_aref_out: wp.array2d(dtype=float),
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, i_eq_weld_adr = wp.tid()
timestep = opt_timestep[worldid]
i_eq = eq_wld_adr[i_eq_weld_adr]
if not eq_active_in[worldid, i_eq]:
worldid, eqweldid = wp.tid()
eqid = eq_wld_adr[eqweldid]
if not eq_active_in[worldid, eqid]:
return
wp.atomic_add(ne_weld_out, worldid, 6)
@@ -680,12 +679,12 @@ def _efc_equality_weld(
if efcid + 6 >= njmax_in:
return
is_site = eq_objtype[i_eq] == wp.static(types.ObjType.SITE.value) and nsite > 0
is_site = eq_objtype[eqid] == types.ObjType.SITE and nsite > 0
obj1id = eq_obj1id[i_eq]
obj2id = eq_obj2id[i_eq]
obj1id = eq_obj1id[eqid]
obj2id = eq_obj2id[eqid]
data = eq_data[worldid, i_eq]
data = eq_data[worldid, eqid]
anchor1 = wp.vec3(data[0], data[1], data[2])
anchor2 = wp.vec3(data[3], data[4], data[5])
relpose = wp.quat(data[6], data[7], data[8], data[9])
@@ -739,14 +738,14 @@ def _efc_equality_weld(
)
jacdifp = jacp1 - jacp2
for i in range(wp.static(3)):
for i in range(3):
efc_J_out[worldid, efcid + i, dofid] = jacdifp[i]
jacdifr = (jacr1 - jacr2) * torquescale
jacdifrq = math.mul_quat(math.quat_mul_axis(quat1, jacdifr), quat)
jacdifr = 0.5 * wp.vec3(jacdifrq[1], jacdifrq[2], jacdifrq[3])
for i in range(wp.static(3)):
for i in range(3):
efc_J_out[worldid, efcid + 3 + i, dofid] = jacdifr[i]
Jqvelp += jacdifp * qvel_in[worldid, dofid]
@@ -762,8 +761,10 @@ def _efc_equality_weld(
pos_imp = wp.sqrt(wp.length_sq(cpos) + wp.length_sq(crot))
solref = eq_solref[worldid, i_eq]
solimp = eq_solimp[worldid, i_eq]
solref = eq_solref[worldid, eqid]
solimp = eq_solimp[worldid, eqid]
timestep = opt_timestep[worldid]
for i in range(3):
_update_efc_row(
@@ -779,8 +780,8 @@ def _efc_equality_weld(
0.0,
Jqvelp[i],
0.0,
ConstraintType.EQUALITY.value,
i_eq,
ConstraintType.EQUALITY,
eqid,
efc_type_out,
efc_id_out,
efc_pos_out,
@@ -807,8 +808,8 @@ def _efc_equality_weld(
0.0,
Jqvelr[i],
0.0,
ConstraintType.EQUALITY.value,
i_eq,
ConstraintType.EQUALITY,
eqid,
efc_type_out,
efc_id_out,
efc_pos_out,
@@ -853,7 +854,6 @@ def _efc_limit_slide_hinge(
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, jntlimitedid = wp.tid()
timestep = opt_timestep[worldid]
jntid = jnt_limited_slide_hinge_adr[jntlimitedid]
jntrange = jnt_range[worldid, jntid]
@@ -881,7 +881,7 @@ def _efc_limit_slide_hinge(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
pos,
@@ -892,7 +892,7 @@ def _efc_limit_slide_hinge(
jntmargin,
Jqvel,
0.0,
ConstraintType.LIMIT_JOINT.value,
ConstraintType.LIMIT_JOINT,
jntid,
efc_type_out,
efc_id_out,
@@ -938,7 +938,6 @@ def _efc_limit_ball(
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, jntlimitedid = wp.tid()
timestep = opt_timestep[worldid]
jntid = jnt_limited_ball_adr[jntlimitedid]
qposadr = jnt_qposadr[jntid]
@@ -975,7 +974,7 @@ def _efc_limit_ball(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
pos,
@@ -986,7 +985,7 @@ def _efc_limit_ball(
jntmargin,
Jqvel,
0.0,
ConstraintType.LIMIT_JOINT.value,
ConstraintType.LIMIT_JOINT,
jntid,
efc_type_out,
efc_id_out,
@@ -1036,7 +1035,6 @@ def _efc_limit_tendon(
efc_frictionloss_out: wp.array2d(dtype=float),
):
worldid, tenlimitedid = wp.tid()
timestep = opt_timestep[worldid]
tenid = tendon_limited_adr[tenlimitedid]
tenrange = tendon_range[worldid, tenid]
@@ -1060,7 +1058,7 @@ def _efc_limit_tendon(
scl = float(dist_min < dist_max) * 2.0 - 1.0
adr = tendon_adr[tenid]
if wrap_type[adr] == wp.static(types.WrapType.JOINT.value):
if wrap_type[adr] == types.WrapType.JOINT:
ten_num = tendon_num[tenid]
for i in range(ten_num):
dofadr = jnt_dofadr[wrap_objid[adr + i]]
@@ -1075,7 +1073,7 @@ def _efc_limit_tendon(
_update_efc_row(
worldid,
timestep,
opt_timestep[worldid],
refsafe_in,
efcid,
pos,
@@ -1086,7 +1084,7 @@ def _efc_limit_tendon(
tenmargin,
Jqvel,
0.0,
ConstraintType.LIMIT_TENDON.value,
ConstraintType.LIMIT_TENDON,
tenid,
efc_type_out,
efc_id_out,
@@ -1159,8 +1157,8 @@ def _efc_contact_pyramidal(
if active:
worldid = worldid_in[conid]
efcid = wp.atomic_add(nefc_out, worldid, 1)
efcid = wp.atomic_add(nefc_out, worldid, 1)
if efcid >= njmax_in:
contact_efc_address_out[conid, dimid] = -1
return
@@ -1234,9 +1232,9 @@ def _efc_contact_pyramidal(
Jqvel += J * qvel_in[worldid, i]
if condim == 1:
efc_type = int(ConstraintType.CONTACT_FRICTIONLESS.value)
efc_type = ConstraintType.CONTACT_FRICTIONLESS
else:
efc_type = int(ConstraintType.CONTACT_PYRAMIDAL.value)
efc_type = ConstraintType.CONTACT_PYRAMIDAL
_update_efc_row(
worldid,
@@ -1323,8 +1321,8 @@ def _efc_contact_elliptic(
if active:
worldid = worldid_in[conid]
efcid = wp.atomic_add(nefc_out, worldid, 1)
efcid = wp.atomic_add(nefc_out, worldid, 1)
if efcid >= njmax_in:
contact_efc_address_out[conid, dimid] = -1
return
@@ -1402,9 +1400,9 @@ def _efc_contact_elliptic(
pos_aref = 0.0
if condim == 1:
efc_type = int(ConstraintType.CONTACT_FRICTIONLESS.value)
efc_type = ConstraintType.CONTACT_FRICTIONLESS
else:
efc_type = int(ConstraintType.CONTACT_ELLIPTIC.value)
efc_type = ConstraintType.CONTACT_ELLIPTIC
_update_efc_row(
worldid,
@@ -1454,22 +1452,13 @@ def make_constraint(m: types.Model, d: types.Data):
wp.launch(
zero_constraint_counts,
dim=d.nworld,
inputs=[
d.ne,
d.ne_connect,
d.ne_weld,
d.ne_jnt,
d.ne_ten,
d.nf,
d.nl,
d.nefc,
],
inputs=[d.ne, d.ne_connect, d.ne_weld, d.ne_jnt, d.ne_ten, d.nf, d.nl, d.nefc],
)
if not (m.opt.disableflags & types.DisableBit.CONSTRAINT.value):
if not (m.opt.disableflags & types.DisableBit.CONSTRAINT):
refsafe = m.opt.disableflags & types.DisableBit.REFSAFE
if not (m.opt.disableflags & types.DisableBit.EQUALITY.value):
if not (m.opt.disableflags & types.DisableBit.EQUALITY):
wp.launch(
_efc_equality_connect,
dim=(d.nworld, m.eq_connect_adr.size),
@@ -1632,19 +1621,12 @@ def make_constraint(m: types.Model, d: types.Data):
wp.launch(
_num_equality,
dim=(d.nworld,),
inputs=[
d.ne_connect,
d.ne_weld,
d.ne_jnt,
d.ne_ten,
],
outputs=[
d.ne,
],
dim=d.nworld,
inputs=[d.ne_connect, d.ne_weld, d.ne_jnt, d.ne_ten],
outputs=[d.ne],
)
if not (m.opt.disableflags & types.DisableBit.FRICTIONLOSS.value):
if not (m.opt.disableflags & types.DisableBit.FRICTIONLOSS):
wp.launch(
_efc_friction_dof,
dim=(d.nworld, m.nv),
@@ -1684,6 +1666,7 @@ def make_constraint(m: types.Model, d: types.Data):
m.tendon_solimp_fri,
m.tendon_frictionloss,
m.tendon_invweight0,
d.njmax,
d.qvel,
d.ten_J,
refsafe,
@@ -1704,122 +1687,116 @@ def make_constraint(m: types.Model, d: types.Data):
)
# limit
if not (m.opt.disableflags & types.DisableBit.LIMIT.value):
limit_ball = m.jnt_limited_ball_adr.size > 0
if limit_ball:
wp.launch(
_efc_limit_ball,
dim=(d.nworld, m.jnt_limited_ball_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_qposadr,
m.jnt_dofadr,
m.jnt_solref,
m.jnt_solimp,
m.jnt_range,
m.jnt_margin,
m.jnt_limited_ball_adr,
m.dof_invweight0,
d.njmax,
d.qpos,
d.qvel,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
if not (m.opt.disableflags & types.DisableBit.LIMIT):
wp.launch(
_efc_limit_ball,
dim=(d.nworld, m.jnt_limited_ball_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_qposadr,
m.jnt_dofadr,
m.jnt_solref,
m.jnt_solimp,
m.jnt_range,
m.jnt_margin,
m.jnt_limited_ball_adr,
m.dof_invweight0,
d.njmax,
d.qpos,
d.qvel,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
limit_slide_hinge = m.jnt_limited_slide_hinge_adr.size > 0
if limit_slide_hinge:
wp.launch(
_efc_limit_slide_hinge,
dim=(d.nworld, m.jnt_limited_slide_hinge_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_qposadr,
m.jnt_dofadr,
m.jnt_solref,
m.jnt_solimp,
m.jnt_range,
m.jnt_margin,
m.jnt_limited_slide_hinge_adr,
m.dof_invweight0,
d.njmax,
d.qpos,
d.qvel,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
wp.launch(
_efc_limit_slide_hinge,
dim=(d.nworld, m.jnt_limited_slide_hinge_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_qposadr,
m.jnt_dofadr,
m.jnt_solref,
m.jnt_solimp,
m.jnt_range,
m.jnt_margin,
m.jnt_limited_slide_hinge_adr,
m.dof_invweight0,
d.njmax,
d.qpos,
d.qvel,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
limit_tendon = m.tendon_limited_adr.size > 0
if limit_tendon:
wp.launch(
_efc_limit_tendon,
dim=(d.nworld, m.tendon_limited_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_dofadr,
m.tendon_adr,
m.tendon_num,
m.tendon_limited_adr,
m.tendon_solref_lim,
m.tendon_solimp_lim,
m.tendon_range,
m.tendon_margin,
m.tendon_invweight0,
m.wrap_objid,
m.wrap_type,
d.njmax,
d.qvel,
d.ten_length,
d.ten_J,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
wp.launch(
_efc_limit_tendon,
dim=(d.nworld, m.tendon_limited_adr.size),
inputs=[
m.nv,
m.opt.timestep,
m.jnt_dofadr,
m.tendon_adr,
m.tendon_num,
m.tendon_limited_adr,
m.tendon_solref_lim,
m.tendon_solimp_lim,
m.tendon_range,
m.tendon_margin,
m.tendon_invweight0,
m.wrap_objid,
m.wrap_type,
d.njmax,
d.qvel,
d.ten_length,
d.ten_J,
refsafe,
],
outputs=[
d.nl,
d.nefc,
d.efc.type,
d.efc.id,
d.efc.J,
d.efc.pos,
d.efc.margin,
d.efc.D,
d.efc.vel,
d.efc.aref,
d.efc.frictionloss,
],
)
# contact
if not (m.opt.disableflags & types.DisableBit.CONTACT.value):
if m.opt.cone == types.ConeType.PYRAMIDAL.value:
if not (m.opt.disableflags & types.DisableBit.CONTACT):
if m.opt.cone == types.ConeType.PYRAMIDAL:
wp.launch(
_efc_contact_pyramidal,
dim=(d.nconmax, 2 * (m.condim_max - 1) if m.condim_max > 1 else 1),
@@ -1863,7 +1840,7 @@ def make_constraint(m: types.Model, d: types.Data):
d.efc.frictionloss,
],
)
elif m.opt.cone == types.ConeType.ELLIPTIC.value:
elif m.opt.cone == types.ConeType.ELLIPTIC:
wp.launch(
_efc_contact_elliptic,
dim=(d.nconmax, m.condim_max),
@@ -21,10 +21,9 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import ConeType
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and MJWarp constraint calculations,
# mostly due to float precision
@@ -143,13 +142,13 @@ class ConstraintTest(parameterized.TestCase):
</mujoco>
"""
_, mjd, m, d = test_util.fixture(xml=xml, cone=cone, keyframe=0)
_, mjd, m, d = test_data.fixture(xml=xml, keyframe=0, overrides={"opt.cone": cone})
# fill with nan to check whether we are not reading uninitialized values
for arr in (d.efc.J, d.efc.D, d.efc.aref, d.efc.pos, d.efc.margin):
arr.fill_(wp.nan)
mjwarp.make_constraint(m, d)
mjw.make_constraint(m, d)
_assert_eq(d.ncon.numpy()[0], mjd.ncon, "ncon")
_assert_eq(d.efc.J.numpy()[0, : mjd.nefc, :].reshape(-1), mjd.efc_J, "efc_J")
@@ -165,14 +164,14 @@ class ConstraintTest(parameterized.TestCase):
def test_constraints(self, cone):
"""Test constraints."""
for key in range(3):
_, mjd, m, d = test_util.fixture("constraints.xml", sparse=False, cone=cone, keyframe=key)
_, mjd, m, d = test_data.fixture("constraints.xml", keyframe=key, overrides={"opt.cone": cone})
for arr in (d.ne, d.nefc, d.nf, d.nl, d.efc.type):
arr.fill_(-1)
for arr in (d.efc.J, d.efc.D, d.efc.vel, d.efc.aref, d.efc.pos, d.efc.margin):
arr.fill_(wp.nan)
mjwarp.make_constraint(m, d)
mjw.make_constraint(m, d)
_assert_eq(d.ne.numpy()[0], mjd.ne, "ne")
_assert_eq(d.nefc.numpy()[0], mjd.nefc, "nefc")
@@ -183,14 +182,14 @@ class ConstraintTest(parameterized.TestCase):
def test_limit_tendon(self):
"""Test limit tendon constraints."""
for keyframe in range(-1, 1):
_, mjd, m, d = test_util.fixture("tendon/tendon_limit.xml", sparse=False, keyframe=keyframe)
_, mjd, m, d = test_data.fixture("tendon/tendon_limit.xml", keyframe=keyframe)
for arr in (d.nefc, d.nl, d.efc.type):
arr.fill_(-1)
for arr in (d.efc.J, d.efc.D, d.efc.vel, d.efc.aref, d.efc.pos, d.efc.margin):
arr.fill_(wp.nan)
mjwarp.make_constraint(m, d)
mjw.make_constraint(m, d)
_assert_eq(d.nefc.numpy()[0], mjd.nefc, "nefc")
_assert_eq(d.nl.numpy()[0], mjd.nl, "nl")
@@ -199,7 +198,7 @@ class ConstraintTest(parameterized.TestCase):
def test_equality_tendon(self):
"""Test equality tendon constraints."""
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<option>
@@ -247,7 +246,7 @@ class ConstraintTest(parameterized.TestCase):
for arr in (d.efc.J, d.efc.D, d.efc.vel, d.efc.aref, d.efc.pos, d.efc.margin):
arr.fill_(wp.nan)
mjwarp.make_constraint(m, d)
mjw.make_constraint(m, d)
_assert_eq(d.nefc.numpy()[0], mjd.nefc, "nefc")
_assert_eq(d.ne.numpy()[0], mjd.ne, "ne")
+17 -15
View File
@@ -34,6 +34,7 @@ def _qderiv_actuator_passive(
# Model:
nu: int,
opt_timestep: wp.array(dtype=float),
opt_disableflags: int,
opt_is_sparse: bool,
dof_damping: wp.array2d(dtype=float),
actuator_dyntype: wp.array(dtype=int),
@@ -51,29 +52,28 @@ def _qderiv_actuator_passive(
# In:
qMi: wp.array(dtype=int),
qMj: wp.array(dtype=int),
actuation_enabled: bool,
passive_enabled: bool,
# Data out:
qM_integration_out: wp.array3d(dtype=float),
):
worldid, elemid = wp.tid()
dofiid = qMi[elemid]
dofjid = qMj[elemid]
qderiv = float(0.0)
for actid in range(nu):
if actuation_enabled:
if actuator_gaintype[actid] == int(GainType.AFFINE.value):
if not opt_disableflags & DisableBit.ACTUATION:
for actid in range(nu):
if actuator_gaintype[actid] == GainType.AFFINE:
gain = actuator_gainprm[worldid, actid][2]
else:
gain = 0.0
if actuator_biastype[actid] == int(BiasType.AFFINE.value):
if actuator_biastype[actid] == BiasType.AFFINE:
bias = actuator_biasprm[worldid, actid][2]
else:
bias = 0.0
if actuator_dyntype[actid] != int(DynType.NONE.value):
if actuator_dyntype[actid] != DynType.NONE:
act_first = actuator_actadr[actid]
act_last = act_first + actuator_actnum[actid] - 1
vel = bias + gain * act_in[worldid, act_last]
@@ -82,7 +82,9 @@ def _qderiv_actuator_passive(
qderiv += actuator_moment_in[worldid, actid, dofiid] * actuator_moment_in[worldid, actid, dofjid] * vel
if passive_enabled and dofiid == dofjid:
# TODO(team): fluid model derivative
if not opt_disableflags & DisableBit.DAMPER and dofiid == dofjid:
qderiv -= dof_damping[worldid, dofiid]
qderiv *= opt_timestep[worldid]
@@ -139,18 +141,17 @@ def deriv_smooth_vel(m: Model, d: Data, flg_forward: bool = True):
flg_forward (bool, optional): If True forward dynamics else inverse dynamics routine.
Default is True.
"""
actuation_enabled = not (m.opt.disableflags & DisableBit.ACTUATION)
passive_enabled = not (m.opt.disableflags & (DisableBit.SPRING | DisableBit.DAMPER))
qMi = m.qM_fullm_i if m.opt.is_sparse else m.dof_tri_row
qMj = m.qM_fullm_j if m.opt.is_sparse else m.dof_tri_col
if actuation_enabled or passive_enabled:
if ~(m.opt.disableflags & (DisableBit.ACTUATION | DisableBit.DAMPER)):
wp.launch(
_qderiv_actuator_passive,
dim=(d.nworld, qMi.size),
inputs=[
m.nu,
m.opt.timestep,
m.opt.disableflags,
m.opt.is_sparse,
m.dof_damping,
m.actuator_dyntype,
@@ -166,13 +167,14 @@ def deriv_smooth_vel(m: Model, d: Data, flg_forward: bool = True):
d.qM,
qMi,
qMj,
actuation_enabled,
passive_enabled,
],
outputs=[d.qM_integration],
)
else:
# TODO(team): directly utilize qM for these settings
wp.copy(d.qM_integration, d.qM)
if passive_enabled:
if not m.opt.disableflags & DisableBit.DAMPER:
wp.launch(
_qderiv_tendon_damping,
dim=(d.nworld, qMi.size),
+26 -26
View File
@@ -80,7 +80,7 @@ def _next_position(
qpos_next = qpos_out[worldid]
qvel = qvel_in[worldid]
if jnttype == wp.static(JointType.FREE.value):
if jnttype == JointType.FREE:
qpos_pos = wp.vec3(qpos[qpos_adr], qpos[qpos_adr + 1], qpos[qpos_adr + 2])
qvel_lin = wp.vec3(qvel[dof_adr], qvel[dof_adr + 1], qvel[dof_adr + 2]) * qvel_scale_in
@@ -104,7 +104,7 @@ def _next_position(
qpos_next[qpos_adr + 5] = qpos_quat_new[2]
qpos_next[qpos_adr + 6] = qpos_quat_new[3]
elif jnttype == wp.static(JointType.BALL.value):
elif jnttype == JointType.BALL:
qpos_quat = wp.quat(
qpos[qpos_adr + 0],
qpos[qpos_adr + 1],
@@ -157,7 +157,7 @@ def _next_act(
clamp: bool,
) -> float:
# advance actuation
if actuator_dyntype == wp.static(DynType.FILTEREXACT.value):
if actuator_dyntype == DynType.FILTEREXACT:
tau = wp.max(MJ_MINVAL, actuator_dynprm[0])
act = act_in + act_dot_scale * act_dot_in * tau * (1.0 - wp.exp(-opt_timestep / tau))
else:
@@ -393,7 +393,7 @@ def euler(m: Model, d: Data):
"""Euler integrator, semi-implicit in velocity."""
# integrate damping implicitly
if not m.opt.disableflags & DisableBit.EULERDAMP.value:
if not m.opt.disableflags & (DisableBit.EULERDAMP | DisableBit.DAMPER):
if m.opt.is_sparse:
_euler_sparse(m, d)
else:
@@ -520,12 +520,7 @@ def rungekutta4(m: Model, d: Data):
@event_scope
def implicit(m: Model, d: Data):
"""Integrates fully implicit in velocity."""
# compile-time constants
passive_enabled = not m.opt.disableflags & (DisableBit.SPRING.value | DisableBit.DAMPER.value)
actuation_enabled = (not m.opt.disableflags & DisableBit.ACTUATION.value) and m.actuator_affine_bias_gain
if passive_enabled or actuation_enabled:
if ~(m.opt.disableflags | ~(DisableBit.ACTUATION | DisableBit.SPRING | DisableBit.DAMPER)):
derivative.deriv_smooth_vel(m, d)
smooth.factor_solve_i(
m, d, d.qM_integration, d.qLD_integration, d.qLDiagInv_integration, d.qacc_integration, d.qfrc_integration
@@ -553,10 +548,8 @@ def fwd_position(m: Model, d: Data, factorize: bool = True):
smooth.transmission(m, d)
# TODO(team): sparse actuator_moment version
def _actuator_velocity(m: Model, d: Data):
NV = m.nv
@cache_kernel
def _create_actuator_velocity_kernel(NV: int):
@nested_kernel(module="unique", enable_backward=False)
def actuator_velocity(
# Data in:
@@ -572,8 +565,15 @@ def _actuator_velocity(m: Model, d: Data):
actuator_velocity_tile = wp.tile_reduce(wp.add, moment_qvel_tile)
actuator_velocity_out[worldid, actid] = actuator_velocity_tile[0]
return actuator_velocity
# TODO(team): sparse actuator_moment version
def _actuator_velocity(m: Model, d: Data):
NV = m.nv
wp.launch_tiled(
actuator_velocity,
_create_actuator_velocity_kernel(NV),
dim=(d.nworld, m.nu),
inputs=[
d.qvel,
@@ -681,13 +681,13 @@ def _actuator_force(
act_last = act_first + actuator_actnum[uid] - 1
dyntype = actuator_dyntype[uid]
if dyntype == int(DynType.INTEGRATOR.value):
if dyntype == DynType.INTEGRATOR:
act_dot = ctrl
elif dyntype == int(DynType.FILTER.value) or dyntype == int(DynType.FILTEREXACT.value):
elif dyntype == DynType.FILTER or dyntype == DynType.FILTEREXACT:
dynprm = actuator_dynprm[worldid, uid]
act = act_in[worldid, act_last]
act_dot = (ctrl - act) / wp.max(dynprm[0], MJ_MINVAL)
elif dyntype == int(DynType.MUSCLE.value):
elif dyntype == DynType.MUSCLE:
dynprm = actuator_dynprm[worldid, uid]
act = act_in[worldid, act_last]
act_dot = util_misc.muscle_dynamics(ctrl, act, dynprm)
@@ -697,7 +697,7 @@ def _actuator_force(
act_dot_out[worldid, act_last] = act_dot
if actuator_actearly[uid]:
if dyntype == int(DynType.INTEGRATOR.value) or dyntype == int(DynType.NONE.value):
if dyntype == DynType.INTEGRATOR or dyntype == DynType.NONE:
dynprm = actuator_dynprm[worldid, uid]
act = act_in[worldid, act_last]
@@ -722,11 +722,11 @@ def _actuator_force(
gainprm = actuator_gainprm[worldid, uid]
gain = 0.0
if gaintype == int(GainType.FIXED.value):
if gaintype == GainType.FIXED:
gain = gainprm[0]
elif gaintype == int(GainType.AFFINE.value):
elif gaintype == GainType.AFFINE:
gain = gainprm[0] + gainprm[1] * length + gainprm[2] * velocity
elif gaintype == int(GainType.MUSCLE.value):
elif gaintype == GainType.MUSCLE:
acc0 = actuator_acc0[uid]
lengthrange = actuator_lengthrange[uid]
gain = util_misc.muscle_gain(length, velocity, lengthrange, acc0, gainprm)
@@ -736,9 +736,9 @@ def _actuator_force(
biasprm = actuator_biasprm[worldid, uid]
bias = 0.0 # BiasType.NONE
if biastype == int(BiasType.AFFINE.value):
if biastype == BiasType.AFFINE:
bias = biasprm[0] + biasprm[1] * length + biasprm[2] * velocity
elif biastype == int(BiasType.MUSCLE.value):
elif biastype == BiasType.MUSCLE:
acc0 = actuator_acc0[uid]
lengthrange = actuator_lengthrange[uid]
bias = util_misc.muscle_bias(length, lengthrange, acc0, biasprm)
@@ -766,7 +766,7 @@ def _tendon_actuator_force(
):
worldid, actid = wp.tid()
if actuator_trntype[actid] == int(TrnType.TENDON.value):
if actuator_trntype[actid] == TrnType.TENDON:
tenid = actuator_trnid[actid][0]
# TODO(team): only compute for tendons with force limits?
wp.atomic_add(ten_actfrc_out[worldid], tenid, actuator_force_in[worldid, actid])
@@ -786,7 +786,7 @@ def _tendon_actuator_force_clamp(
):
worldid, actid = wp.tid()
if actuator_trntype[actid] == int(TrnType.TENDON.value):
if actuator_trntype[actid] == TrnType.TENDON:
tenid = actuator_trnid[actid][0]
if tendon_actfrclimited[tenid]:
ten_actfrc = ten_actfrc_in[worldid, tenid]
+102 -81
View File
@@ -21,12 +21,13 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import BiasType
from mujoco.mjx.third_party.mujoco_warp._src.types import GainType
from mujoco.mjx.third_party.mujoco_warp._src.types import IntegratorType
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import BiasType
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import EnableBit
from mujoco.mjx.third_party.mujoco_warp import GainType
from mujoco.mjx.third_party.mujoco_warp import IntegratorType
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and mjwarp smooth calculations - mostly
# due to float precision
@@ -43,39 +44,35 @@ class ForwardTest(parameterized.TestCase):
# TODO(team): test sparse when actuator_moment and/or ten_J have sparse representation
@parameterized.product(xml=["humanoid/humanoid.xml", "pendula.xml"])
def test_fwd_velocity(self, xml):
_, mjd, m, d = test_util.fixture(xml, kick=True)
_, mjd, m, d = test_data.fixture(xml, qvel_noise=0.01, ctrl_noise=0.1)
for arr in (d.actuator_velocity, d.qfrc_bias):
arr.zero_()
mjwarp.fwd_velocity(m, d)
mjw.fwd_velocity(m, d)
_assert_eq(d.actuator_velocity.numpy()[0], mjd.actuator_velocity, "actuator_velocity")
_assert_eq(d.qfrc_bias.numpy()[0], mjd.qfrc_bias, "qfrc_bias")
def test_fwd_velocity_tendon(self):
_, mjd, m, d = test_util.fixture("tendon/fixed.xml", sparse=False)
_, mjd, m, d = test_data.fixture("tendon/fixed.xml")
d.ten_velocity.zero_()
mjwarp.fwd_velocity(m, d)
mjw.fwd_velocity(m, d)
_assert_eq(d.ten_velocity.numpy()[0], mjd.ten_velocity, "ten_velocity")
@parameterized.parameters(
("actuation/actuation.xml", True),
("actuation/actuation.xml", False),
("actuation/actuators.xml", True),
("actuation/actuators.xml", False),
("actuation/muscle.xml", True),
("actuation/muscle.xml", False),
@parameterized.product(
xml=("actuation/actuation.xml", "actuation/actuators.xml", "actuation/muscle.xml"),
disableflags=(0, DisableBit.ACTUATION),
)
def test_actuation(self, xml, actuation):
mjm, mjd, m, d = test_util.fixture(xml, actuation=actuation, keyframe=0)
def test_actuation(self, xml, disableflags):
mjm, mjd, m, d = test_data.fixture(xml, keyframe=0, overrides={"opt.disableflags": disableflags})
for arr in (d.qfrc_actuator, d.actuator_force, d.act_dot):
arr.zero_()
mjwarp.fwd_actuation(m, d)
mjw.fwd_actuation(m, d)
_assert_eq(d.qfrc_actuator.numpy()[0], mjd.qfrc_actuator, "qfrc_actuator")
_assert_eq(d.actuator_force.numpy()[0], mjd.actuator_force, "actuator_force")
@@ -85,15 +82,15 @@ class ForwardTest(parameterized.TestCase):
# next activations
mujoco.mj_step(mjm, mjd)
mjwarp.step(m, d)
mjw.step(m, d)
_assert_eq(d.act.numpy()[0], mjd.act, "act")
# TODO(team): test actearly
@parameterized.parameters(True, False)
def test_clampctrl(self, clampctrl):
_, mjd, _, d = test_util.fixture(
@parameterized.parameters(0, DisableBit.CLAMPCTRL)
def test_clampctrl(self, disableflags):
_, mjd, _, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -110,43 +107,48 @@ class ForwardTest(parameterized.TestCase):
</keyframe>
</mujoco>
""",
clampctrl=clampctrl,
keyframe=0,
overrides={"opt.disableflags": disableflags},
)
_assert_eq(d.ctrl.numpy()[0], mjd.ctrl, "ctrl")
def test_fwd_acceleration(self):
_, mjd, m, d = test_util.fixture("humanoid/humanoid.xml", kick=True)
_, mjd, m, d = test_data.fixture("humanoid/humanoid.xml", qvel_noise=0.01, ctrl_noise=0.1)
for arr in (d.qfrc_smooth, d.qacc_smooth):
arr.zero_()
mjwarp.fwd_acceleration(m, d)
mjw.fwd_acceleration(m, d)
_assert_eq(d.qfrc_smooth.numpy()[0], mjd.qfrc_smooth, "qfrc_smooth")
_assert_eq(d.qacc_smooth.numpy()[0], mjd.qacc_smooth, "qacc_smooth")
@parameterized.parameters((True, True), (True, False), (False, True), (False, False))
def test_euler(self, eulerdamp, sparse):
mjm, mjd, _, _ = test_util.fixture("pendula.xml", kick=True, eulerdamp=eulerdamp, sparse=sparse)
@parameterized.product(
jacobian=(mujoco.mjtJacobian.mjJAC_AUTO, mujoco.mjtJacobian.mjJAC_DENSE), disableflags=(0, DisableBit.EULERDAMP)
)
def test_euler(self, jacobian, disableflags):
mjm, mjd, _, _ = test_data.fixture(
"pendula.xml",
qvel_noise=0.01,
ctrl_noise=0.1,
overrides={"opt.jacobian": jacobian, "opt.disableflags": DisableBit.CONTACT | disableflags},
)
self.assertTrue((mjm.dof_damping > 0).any())
m = mjwarp.put_model(mjm)
d = mjwarp.put_data(mjm, mjd)
m = mjw.put_model(mjm)
d = mjw.put_data(mjm, mjd)
mujoco.mj_forward(mjm, mjd)
mujoco.mj_Euler(mjm, mjd)
mjwarp.solve(m, d) # compute efc.Ma
mjwarp.euler(m, d)
mjw.solve(m, d) # compute efc.Ma
mjw.euler(m, d)
_assert_eq(d.qpos.numpy()[0], mjd.qpos, "qpos")
_assert_eq(d.qvel.numpy()[0], mjd.qvel, "qvel")
_assert_eq(d.act.numpy()[0], mjd.act, "act")
def test_rungekutta4(self):
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<option integrator="RK4" iterations="1" ls_iterations="1">
@@ -170,7 +172,7 @@ class ForwardTest(parameterized.TestCase):
keyframe=0,
)
mjwarp.rungekutta4(m, d)
mjw.rungekutta4(m, d)
mujoco.mj_RungeKutta(mjm, mjd, 4)
_assert_eq(d.qpos.numpy()[0], mjd.qpos, "qpos")
@@ -183,20 +185,25 @@ class ForwardTest(parameterized.TestCase):
d.qpos = wp.ones_like(d.qpos)
d.qvel = wp.ones_like(d.qvel)
d.act = wp.ones_like(d.act)
mjwarp.rungekutta4(m, d)
mjw.rungekutta4(m, d)
return d.qpos
_assert_eq(rk_step().numpy()[0], rk_step().numpy()[0], "qpos")
@parameterized.product(actuation=[True, False], passive=[True, False], sparse=[True, False])
def test_implicit(self, actuation, passive, sparse):
mjm, mjd, _, _ = test_util.fixture(
@parameterized.product(
jacobian=(mujoco.mjtJacobian.mjJAC_AUTO, mujoco.mjtJacobian.mjJAC_DENSE),
actuation=(0, DisableBit.ACTUATION),
spring=(0, DisableBit.SPRING),
damper=(0, DisableBit.DAMPER),
)
def test_implicit(self, jacobian, actuation, spring, damper):
mjm, mjd, _, _ = test_data.fixture(
"pendula.xml",
integrator=IntegratorType.IMPLICITFAST,
actuation=actuation,
spring=passive,
damper=passive,
sparse=sparse,
overrides={
"opt.jacobian": jacobian,
"opt.disableflags": DisableBit.CONTACT | actuation | spring | damper,
"opt.integrator": IntegratorType.IMPLICITFAST,
},
)
mjm.actuator_gainprm[:, 2] = np.random.uniform(low=0.01, high=10.0, size=mjm.actuator_gainprm[:, 2].shape)
@@ -216,78 +223,93 @@ class ForwardTest(parameterized.TestCase):
mjd.act = np.random.uniform(low=-0.1, high=0.1, size=mjd.act.shape)
mujoco.mj_forward(mjm, mjd)
m = mjwarp.put_model(mjm)
d = mjwarp.put_data(mjm, mjd)
m = mjw.put_model(mjm)
d = mjw.put_data(mjm, mjd)
mujoco.mj_implicit(mjm, mjd)
mjwarp.solve(m, d) # compute efc.Ma
mjwarp.implicit(m, d)
mjw.solve(m, d) # compute efc.Ma
mjw.implicit(m, d)
_assert_eq(d.qpos.numpy()[0], mjd.qpos, "qpos")
_assert_eq(d.act.numpy()[0], mjd.act, "act")
def test_implicit_position(self):
mjm, mjd, m, d = test_util.fixture("actuation/position.xml", keyframe=0, integrator=IntegratorType.IMPLICITFAST, kick=True)
mjm, mjd, m, d = test_data.fixture(
"actuation/position.xml",
keyframe=0,
qvel_noise=0.01,
ctrl_noise=0.1,
overrides={"opt.integrator": IntegratorType.IMPLICITFAST},
)
mujoco.mj_implicit(mjm, mjd)
mjwarp.solve(m, d) # compute efc.Ma
mjwarp.implicit(m, d)
mjw.solve(m, d) # compute efc.Ma
mjw.implicit(m, d)
_assert_eq(d.qpos.numpy()[0], mjd.qpos, "qpos")
_assert_eq(d.qvel.numpy()[0], mjd.qvel, "qvel")
def test_implicit_tendon_damping(self):
mjm, mjd, m, d = test_util.fixture("tendon/damping.xml", keyframe=0, integrator=IntegratorType.IMPLICITFAST, kick=True)
mjm, mjd, m, d = test_data.fixture(
"tendon/damping.xml",
keyframe=0,
qvel_noise=0.01,
ctrl_noise=0.1,
overrides={"opt.integrator": IntegratorType.IMPLICITFAST},
)
mujoco.mj_implicit(mjm, mjd)
mjwarp.solve(m, d) # compute efc.Ma
mjwarp.implicit(m, d)
mjw.solve(m, d) # compute efc.Ma
mjw.implicit(m, d)
_assert_eq(d.qpos.numpy()[0], mjd.qpos, "qpos")
_assert_eq(d.qvel.numpy()[0], mjd.qvel, "qvel")
@absltest.skipIf(not wp.get_device().is_cuda, "Skipping test that requires GPU.")
@parameterized.product(
xml=("humanoid/humanoid.xml", "pendula.xml", "constraints.xml", "collision.xml"), graph_conditional=(True, False)
)
def test_graph_capture(self, xml, graph_conditional):
# TODO(team): test more environments
if wp.get_device().is_cuda and wp.config.verify_cuda == False:
_, _, m, d = test_util.fixture(xml)
m.opt.graph_conditional = graph_conditional
_, _, m, d = test_data.fixture(xml, overrides={"opt.graph_conditional": graph_conditional})
with wp.ScopedCapture() as capture:
mjwarp.step(m, d)
with wp.ScopedCapture() as capture:
mjw.step(m, d)
# step a few times to ensure no errors at the step boundary
wp.capture_launch(capture.graph)
wp.capture_launch(capture.graph)
wp.capture_launch(capture.graph)
# step a few times to ensure no errors at the step boundary
wp.capture_launch(capture.graph)
wp.capture_launch(capture.graph)
wp.capture_launch(capture.graph)
self.assertTrue(d.time.numpy()[0] > 0.0)
self.assertTrue(d.time.numpy()[0] > 0.0)
def test_forward_energy(self):
_, mjd, _, d = test_util.fixture("humanoid/humanoid.xml", kick=True, energy=True)
_, mjd, _, d = test_data.fixture(
"humanoid/humanoid.xml", qvel_noise=0.01, ctrl_noise=0.1, overrides={"opt.enableflags": EnableBit.ENERGY}
)
_assert_eq(d.energy.numpy()[0][0], mjd.energy[0], "potential energy")
_assert_eq(d.energy.numpy()[0][1], mjd.energy[1], "kinetic energy")
def test_tendon_actuator_force_limits(self):
for keyframe in range(7):
_, mjd, m, d = test_util.fixture("actuation/tendon_force_limit.xml", keyframe=keyframe)
_, mjd, m, d = test_data.fixture("actuation/tendon_force_limit.xml", keyframe=keyframe)
d.actuator_force.zero_()
mjwarp.forward(m, d)
mjw.forward(m, d)
_assert_eq(d.actuator_force.numpy()[0], mjd.actuator_force, "actuator_force")
@parameterized.parameters(("humanoid/humanoid.xml", True), ("humanoid/humanoid.xml", False))
@parameterized.product(xml=("humanoid/humanoid.xml",), energy=(0, EnableBit.ENERGY))
def test_step1(self, xml, energy):
# TODO(team): test more mjcfs
mjm, mjd, m, d = test_util.fixture(xml, kick=True, energy=energy)
mjm, mjd, m, d = test_data.fixture(
xml, qpos_noise=0.1, qvel_noise=0.01, ctrl_noise=0.1, overrides={"opt.enableflags": energy}
)
# some of the fields updated by step1
step1_field = [
@@ -360,7 +382,7 @@ class ForwardTest(parameterized.TestCase):
attr.zero_()
mujoco.mj_step1(mjm, mjd)
mjwarp.step1(m, d)
mjw.step1(m, d)
for arr in step1_field:
d_arr, is_nefc = _getattr(arr)
@@ -395,7 +417,7 @@ class ForwardTest(parameterized.TestCase):
vec_wp = wp.array(vec, dtype=float)
res_wp = wp.zeros((1, mjm.nv), dtype=float)
mjwarp.solve_m(m, d, res_wp, vec_wp)
mjw.solve_m(m, d, res_wp, vec_wp)
d_arr = res_wp.numpy()[0]
mjd_arr = res[0]
@@ -407,13 +429,12 @@ class ForwardTest(parameterized.TestCase):
# TODO(team): sensor_pos
# TODO(team): sensor_vel
@parameterized.parameters(
("humanoid/humanoid.xml", IntegratorType.EULER),
("humanoid/humanoid.xml", IntegratorType.IMPLICITFAST),
("humanoid/humanoid.xml", IntegratorType.RK4),
@parameterized.product(
xml=("humanoid/humanoid.xml",),
integrator=(IntegratorType.EULER, IntegratorType.IMPLICITFAST, IntegratorType.RK4),
)
def test_step2(self, xml, integrator):
mjm, mjd, m, _ = test_util.fixture(xml, kick=True, integrator=integrator)
mjm, mjd, m, _ = test_data.fixture(xml, qvel_noise=0.01, ctrl_noise=0.1, overrides={"opt.integrator": integrator})
# some of the fields updated by step2
step2_field = [
@@ -445,7 +466,7 @@ class ForwardTest(parameterized.TestCase):
mjd.qfrc_applied = qfrc_applied
mjd.xfrc_applied = xfrc_applied
d = mjwarp.put_data(mjm, mjd)
d = mjw.put_data(mjm, mjd)
for arr in step2_field:
if arr in ["qpos", "qvel"]:
@@ -459,7 +480,7 @@ class ForwardTest(parameterized.TestCase):
attr.zero_()
mujoco.mj_step2(mjm, mjd)
mjwarp.step2(m, d)
mjw.step2(m, d)
for arr in step2_field:
d_arr, is_efc = _getattr(arr)
+34 -30
View File
@@ -21,12 +21,12 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import IntegratorType
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import inverse
from mujoco.mjx.third_party.mujoco_warp._src import support
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import IntegratorType
def _assert_eq(a, b, name):
@@ -60,20 +60,19 @@ _XML = """
class InverseTest(parameterized.TestCase):
@parameterized.product(
integrator=[IntegratorType.EULER, IntegratorType.IMPLICITFAST],
invdiscrete=[True, False],
sparse=[True, False],
integrator=(IntegratorType.EULER, IntegratorType.IMPLICITFAST),
jacobian=(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE),
invdiscrete=(True, False),
)
def test_inverse(self, integrator, invdiscrete, sparse):
def test_inverse(self, integrator, jacobian, invdiscrete):
"""Tests inverse dynamics."""
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
xml=_XML,
contact=False,
integrator=integrator,
kick=True,
applied=True,
nstep=10,
sparse=sparse,
qvel_noise=0.01,
ctrl_noise=0.1,
qfrc_noise=0.1,
xfrc_noise=0.1,
overrides={"opt.integrator": integrator, "opt.disableflags": DisableBit.CONTACT, "opt.jacobian": jacobian},
)
# discrete qacc
@@ -97,29 +96,34 @@ class InverseTest(parameterized.TestCase):
mujoco.mj_forward(mjm, mjd)
mjd.qacc = qacc_fd
m = mjwarp.put_model(mjm)
d = mjwarp.put_data(mjm, mjd)
m = mjw.put_model(mjm)
d = mjw.put_data(mjm, mjd)
qacc = d.qacc.numpy()[0].copy()
qfrc_constraint = d.qfrc_constraint.numpy()[0].copy()
# qfrc_inverse = qfrc_applied + J.T @ xfrc_applied + qfrc_actuator
qfrc_xfrc_applied = wp.zeros((d.nworld, m.nv), dtype=float)
support.xfrc_accumulate(m, d, qfrc_xfrc_applied)
mjw.xfrc_accumulate(m, d, qfrc_xfrc_applied)
qfrc_inverse = d.qfrc_applied.numpy()[0] + d.qfrc_actuator.numpy()[0] + qfrc_xfrc_applied.numpy()[0]
for arr in (d.qfrc_constraint, d.qfrc_inverse):
arr.zero_()
mjwarp.inverse(m, d)
mjw.inverse(m, d)
_assert_eq(d.qfrc_constraint.numpy()[0], qfrc_constraint, "qfrc_constraint")
_assert_eq(d.qfrc_inverse.numpy()[0], qfrc_inverse, "qfrc_inverse")
_assert_eq(d.qacc.numpy()[0], qacc, "qacc")
def test_discrete_acc_eulerdamp(self):
_, _, m, d = test_util.fixture(
xml=_XML, integrator=IntegratorType.EULER, eulerdamp=False, kick=True, applied=True, nstep=10
_, _, m, d = test_data.fixture(
xml=_XML,
qvel_noise=0.01,
ctrl_noise=0.1,
qfrc_noise=0.1,
xfrc_noise=0.1,
overrides={"opt.integrator": IntegratorType.EULER, "opt.disableflags": DisableBit.EULERDAMP},
)
qacc = wp.zeros((1, m.nv), dtype=float)
qfrc = wp.zeros((1, m.nv), dtype=float)
@@ -127,7 +131,7 @@ class InverseTest(parameterized.TestCase):
_assert_eq(qacc.numpy()[0], d.qacc.numpy()[0], "qacc")
def test_discrete_acc_rk4(self):
_, _, m, d = test_util.fixture(xml=_XML, integrator=IntegratorType.RK4)
_, _, m, d = test_data.fixture(xml=_XML, overrides={"opt.integrator": IntegratorType.RK4})
qacc = wp.zeros((1, m.nv), dtype=float)
qfrc = wp.zeros((1, m.nv), dtype=float)
@@ -136,14 +140,14 @@ class InverseTest(parameterized.TestCase):
def test_inverse_tendon_armature(self):
"""Tests inverse dynamics with tendon armature."""
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
"tendon/armature.xml",
constraint=False,
gravity=False,
kick=True,
applied=True,
nstep=10,
keyframe=0,
qvel_noise=0.01,
ctrl_noise=0.1,
qfrc_noise=0.1,
xfrc_noise=0.1,
overrides={"opt.disableflags": DisableBit.GRAVITY | DisableBit.CONSTRAINT},
)
qacc = d.qacc.numpy()[0].copy()
@@ -151,13 +155,13 @@ class InverseTest(parameterized.TestCase):
# qfrc_inverse = qfrc_applied + J.T @ xfrc_applied + qfrc_actuator
qfrc_xfrc_applied = wp.zeros((d.nworld, m.nv), dtype=float)
support.xfrc_accumulate(m, d, qfrc_xfrc_applied)
mjw.xfrc_accumulate(m, d, qfrc_xfrc_applied)
qfrc_inverse = d.qfrc_applied.numpy()[0] + d.qfrc_actuator.numpy()[0] + qfrc_xfrc_applied.numpy()[0]
for arr in (d.qfrc_constraint, d.qfrc_inverse):
arr.zero_()
mjwarp.inverse(m, d)
mjw.inverse(m, d)
_assert_eq(d.qfrc_constraint.numpy()[0], qfrc_constraint, "qfrc_constraint")
_assert_eq(d.qfrc_inverse.numpy()[0], qfrc_inverse, "qfrc_inverse")
+204 -45
View File
@@ -13,19 +13,15 @@
# limitations under the License.
# ==============================================================================
from typing import Optional, Tuple
from typing import Any, Optional, Sequence, Union
import mujoco
import numpy as np
import warp as wp
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import conditional_graph_supported
from mujoco.mjx.third_party.mujoco_warp._src import math
from mujoco.mjx.third_party.mujoco_warp._src import types
# number of max iterations to run GJK/EPA
MJ_CCD_ITERATIONS = 12
from mujoco.mjx.third_party.mujoco_warp._src import warp_util
# max number of worlds supported
MAX_WORLDS = 2**24
@@ -76,6 +72,12 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
geom_plugin_index = np.full_like(mjm.geom_type, -1)
if mjm.nplugin > 0:
if (mjm.body_plugin != -1).any():
raise NotImplementedError("Body plugins not supported.")
if (mjm.actuator_plugin != -1).any():
raise NotImplementedError("Actuator plugins not supported.")
if (mjm.sensor_plugin != -1).any():
raise NotImplementedError("Sensor plugins not supported.")
for i in range(len(mjm.geom_plugin)):
if mjm.geom_plugin[i] != -1:
p = mjm.geom_plugin[i]
@@ -122,6 +124,12 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
if mjm.opt.noslip_iterations > 0:
raise NotImplementedError(f"noslip solver not implemented.")
if (mjm.opt.viscosity > 0 or mjm.opt.density > 0) and mjm.opt.integrator in (
mujoco.mjtIntegrator.mjINT_IMPLICITFAST,
mujoco.mjtIntegrator.mjINT_IMPLICIT,
):
raise NotImplementedError(f"Implicit integrators and fluid model not implemented.")
# TODO(team): remove after _update_gradient for Newton uses tile operations for islands
nv_max = 60
if mjm.nv > nv_max and mjm.opt.jacobian == mujoco.mjtJacobian.mjJAC_DENSE:
@@ -308,7 +316,7 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
mocap_bodyid = mocap_bodyid[mjm.body_mocapid[mjm.body_mocapid >= 0].argsort()]
# precalculated geom pairs
filterparent = not (mjm.opt.disableflags & types.DisableBit.FILTERPARENT.value)
filterparent = not (mjm.opt.disableflags & types.DisableBit.FILTERPARENT)
geom1, geom2 = np.triu_indices(mjm.ngeom, k=1)
nxn_geom_pair = np.stack((geom1, geom2), axis=1)
@@ -362,7 +370,7 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
# Disable collisions if there are no potentially colliding pairs
if np.sum(geom_type_pair_count) == 0:
mjm.opt.disableflags |= types.DisableBit.CONTACT.value
mjm.opt.disableflags |= types.DisableBit.CONTACT
def create_nmodel_batched_array(mjm_array, dtype, expand_dim=True):
array = wp.array(mjm_array, dtype=dtype)
@@ -396,6 +404,58 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
condim = np.concatenate((mjm.geom_condim, mjm.pair_dim))
condim_max = np.max(condim) if len(condim) > 0 else 0
# collision sensors
is_collision_sensor = np.isin(
mjm.sensor_type, [mujoco.mjtSensor.mjSENS_GEOMDIST, mujoco.mjtSensor.mjSENS_GEOMNORMAL, mujoco.mjtSensor.mjSENS_GEOMFROMTO]
)
sensor_collision_adr = np.nonzero(is_collision_sensor)[0]
collision_sensor_adr = np.full(mjm.nsensor, -1)
collision_sensor_adr[sensor_collision_adr] = np.arange(len(sensor_collision_adr))
if is_collision_sensor.any():
def _collision_sensor_check(sensor_type, sensor_id, geom_type, err_msg):
for type_, id_ in zip(sensor_type, sensor_id):
if type_ == mujoco.mjtObj.mjOBJ_BODY:
geomnum = mjm.body_geomnum[id_]
geomadr = mjm.body_geomadr[id_]
for geomid in range(geomadr, geomadr + geomnum):
if mjm.geom_type[geomid] == geom_type:
raise NotImplementedError(err_msg)
elif type_ == mujoco.mjtObj.mjOBJ_GEOM:
if mjm.geom_type[id_] == geom_type:
raise NotImplementedError(err_msg)
sensor_collision_objtype = mjm.sensor_objtype[is_collision_sensor]
sensor_collision_objid = mjm.sensor_objid[is_collision_sensor]
sensor_collision_reftype = mjm.sensor_reftype[is_collision_sensor]
sensor_collision_refid = mjm.sensor_refid[is_collision_sensor]
_collision_sensor_check(
sensor_collision_objtype,
sensor_collision_objid,
mujoco.mjtGeom.mjGEOM_PLANE,
"Collision sensors with planes are not implemented.",
)
_collision_sensor_check(
sensor_collision_reftype,
sensor_collision_refid,
mujoco.mjtGeom.mjGEOM_PLANE,
"Collision sensors with planes are not implemented.",
)
_collision_sensor_check(
sensor_collision_objtype,
sensor_collision_objid,
mujoco.mjtGeom.mjGEOM_HFIELD,
"Collision sensors with height fields are not implemented.",
)
_collision_sensor_check(
sensor_collision_reftype,
sensor_collision_refid,
mujoco.mjtGeom.mjGEOM_HFIELD,
"Collision sensors with height fields are not implemented.",
)
m = types.Model(
nq=mjm.nq,
nv=mjm.nv,
@@ -456,13 +516,10 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
is_sparse=bool(is_sparse),
ls_parallel=False,
ls_parallel_min_step=1.0e-6, # TODO(team): determine good default setting
gjk_iterations=MJ_CCD_ITERATIONS,
epa_iterations=MJ_CCD_ITERATIONS,
ccd_iterations=mjm.opt.ccd_iterations,
broadphase=int(broadphase),
broadphase_filter=int(
types.BroadphaseFilter.PLANE.value | types.BroadphaseFilter.SPHERE.value | types.BroadphaseFilter.OBB.value
),
graph_conditional=True and conditional_graph_supported(),
broadphase_filter=int(types.BroadphaseFilter.PLANE | types.BroadphaseFilter.SPHERE | types.BroadphaseFilter.OBB),
graph_conditional=True and warp_util.conditional_graph_supported(),
sdf_initpoints=mjm.opt.sdf_initpoints,
sdf_iterations=mjm.opt.sdf_iterations,
run_collision_detection=True,
@@ -648,10 +705,10 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
eq_solimp=create_nmodel_batched_array(mjm.eq_solimp, dtype=types.vec5),
eq_data=create_nmodel_batched_array(mjm.eq_data, dtype=types.vec11),
# pre-compute indices of equality constraints
eq_connect_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.CONNECT.value)[0], dtype=int),
eq_wld_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.WELD.value)[0], dtype=int),
eq_jnt_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.JOINT.value)[0], dtype=int),
eq_ten_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.TENDON.value)[0], dtype=int),
eq_connect_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.CONNECT)[0], dtype=int),
eq_wld_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.WELD)[0], dtype=int),
eq_jnt_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.JOINT)[0], dtype=int),
eq_ten_adr=wp.array(np.nonzero(mjm.eq_type == types.EqType.TENDON)[0], dtype=int),
actuator_moment_tiles_nv=actuator_moment_tiles_nv,
actuator_moment_tiles_nu=actuator_moment_tiles_nu,
actuator_trntype=wp.array(mjm.actuator_trntype, dtype=int),
@@ -676,11 +733,6 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
actuator_acc0=wp.array(mjm.actuator_acc0, dtype=float),
actuator_lengthrange=wp.array(mjm.actuator_lengthrange, dtype=wp.vec2),
exclude_signature=wp.array(mjm.exclude_signature, dtype=int),
# short-circuiting here allows us to skip a lot of code in implicit integration
actuator_affine_bias_gain=bool(
np.any(mjm.actuator_biastype == types.BiasType.AFFINE.value)
or np.any(mjm.actuator_gaintype == types.GainType.AFFINE.value)
),
nxn_geom_pair=wp.array(nxn_geom_pair, dtype=wp.vec2i),
nxn_geom_pair_filtered=wp.array(nxn_geom_pair_filtered, dtype=wp.vec2i),
nxn_pairid=wp.array(nxn_pairid, dtype=int),
@@ -781,6 +833,7 @@ def put_model(mjm: mujoco.MjModel) -> types.Model:
),
sensor_rangefinder_adr=wp.array(sensor_rangefinder_adr, dtype=int),
rangefinder_sensor_adr=wp.array(rangefinder_sensor_adr, dtype=int),
collision_sensor_adr=wp.array(collision_sensor_adr, dtype=int),
sensor_touch_adr=wp.array(
np.nonzero(mjm.sensor_type == mujoco.mjtSensor.mjSENS_TOUCH)[0],
dtype=int,
@@ -1061,17 +1114,17 @@ def make_data(mjm: mujoco.MjModel, nworld: int = 1, nconmax: int = -1, njmax: in
collision_worldid=wp.zeros((nconmax,), dtype=int),
ncollision=wp.zeros((1,), dtype=int),
# narrowphase (EPA polytope)
epa_vert=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert1=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert2=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert_index1=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=int),
epa_vert_index2=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=int),
epa_face=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=wp.vec3i),
epa_pr=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_norm2=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=float),
epa_index=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_map=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_horizon=wp.zeros(shape=(nconmax, 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_vert=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert1=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert2=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert_index1=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=int),
epa_vert_index2=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=int),
epa_face=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=wp.vec3i),
epa_pr=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_norm2=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=float),
epa_index=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=int),
epa_map=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=int),
epa_horizon=wp.zeros(shape=(nconmax, 2 * types.MJ_MAX_EPAHORIZON), dtype=int),
multiccd_polygon=wp.zeros(shape=(nconmax, 2 * max_npolygon), dtype=wp.vec3),
multiccd_clipped=wp.zeros(shape=(nconmax, 2 * max_npolygon), dtype=wp.vec3),
multiccd_pnormal=wp.zeros(shape=(nconmax, max_npolygon), dtype=wp.vec3),
@@ -1435,17 +1488,17 @@ def put_data(
collision_worldid=wp.empty(nconmax, dtype=int),
ncollision=wp.zeros(1, dtype=int),
# narrowphase (EPA polytope)
epa_vert=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert1=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert2=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_vert_index1=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=int),
epa_vert_index2=wp.zeros(shape=(nconmax, 5 + MJ_CCD_ITERATIONS), dtype=int),
epa_face=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=wp.vec3i),
epa_pr=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=wp.vec3),
epa_norm2=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=float),
epa_index=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_map=wp.zeros(shape=(nconmax, 6 + 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_horizon=wp.zeros(shape=(nconmax, 6 * MJ_CCD_ITERATIONS), dtype=int),
epa_vert=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert1=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert2=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_vert_index1=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=int),
epa_vert_index2=wp.zeros(shape=(nconmax, 5 + mjm.opt.ccd_iterations), dtype=int),
epa_face=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=wp.vec3i),
epa_pr=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=wp.vec3),
epa_norm2=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=float),
epa_index=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=int),
epa_map=wp.zeros(shape=(nconmax, 6 + types.MJ_MAX_EPAFACES * mjm.opt.ccd_iterations), dtype=int),
epa_horizon=wp.zeros(shape=(nconmax, 2 * types.MJ_MAX_EPAHORIZON), dtype=int),
multiccd_polygon=wp.zeros(shape=(nconmax, 2 * max_npolygon), dtype=wp.vec3),
multiccd_clipped=wp.zeros(shape=(nconmax, 2 * max_npolygon), dtype=wp.vec3),
multiccd_pnormal=wp.zeros(shape=(nconmax, max_npolygon), dtype=wp.vec3),
@@ -1844,3 +1897,109 @@ def reset_data(m: types.Model, d: types.Data):
d.sensordata,
],
)
def override_model(model: Union[types.Model, mujoco.MjModel], overrides: Union[dict[str, Any], Sequence[str]]):
"""Overrides model parameters.
Overrides are of the format:
opt.iterations = 1
opt.ls_parallel = True
opt.cone = pyramidal
opt.disableflags = contact | spring
"""
enum_fields = {
"opt.broadphase": types.BroadphaseType,
"opt.broadphase_filter": types.BroadphaseFilter,
"opt.cone": types.ConeType,
"opt.disableflags": types.DisableBit,
"opt.enableflags": types.EnableBit,
"opt.integrator": types.IntegratorType,
"opt.solver": types.SolverType,
}
mjw_only_fields = {"opt.broadphase", "opt.broadphase_filter", "opt.ls_parallel", "opt.graph_conditional"}
mj_only_fields = {"opt.jacobian"}
if not isinstance(overrides, dict):
overrides_dict = {}
for override in overrides:
if "=" not in override:
raise ValueError(f"Invalid override format: {override}")
k, v = override.split("=", 1)
overrides_dict[k.strip()] = v.strip()
overrides = overrides_dict
for key, val in overrides.items():
# skip overrides on MjModel for properties that are only on mjw.Model
if key in mjw_only_fields and isinstance(model, mujoco.MjModel):
continue
if key in mj_only_fields and isinstance(model, types.Model):
continue
obj, attrs = model, key.split(".")
for i, attr in enumerate(attrs):
if not hasattr(obj, attr):
raise ValueError(f"Unrecognized model field: {key}")
if i < len(attrs) - 1:
obj = getattr(obj, attr)
continue
typ = type(getattr(obj, attr))
if key in enum_fields and isinstance(val, str):
# special case: enum value
enum_members = val.split("|")
val = 0
for enum_member in enum_members:
enum_member = enum_member.strip().upper()
if enum_member not in enum_fields[key].__members__:
raise ValueError(f"Unrecognized enum value for {enum_fields[key].__name__}: {enum_member}")
val |= int(enum_fields[key][enum_member])
elif typ is bool and isinstance(val, str):
# special case: "true", "TRUE", "false", "FALSE" etc.
if val.upper() not in ("TRUE", "FALSE"):
raise ValueError(f"Unrecognized value for field: {key}")
val = val.upper() == "TRUE"
else:
val = typ(val)
setattr(obj, attr, val)
def find_keys(model: mujoco.MjModel, keyname_prefix: str) -> list[int]:
"""Finds keyframes that start with keyname_prefix."""
keys = []
for keyid in range(model.nkey):
name = mujoco.mj_id2name(model, mujoco.mjtObj.mjOBJ_KEY, keyid)
if name.startswith(keyname_prefix):
keys.append(keyid)
return keys
def make_trajectory(model: mujoco.MjModel, keys: list[int]) -> np.ndarray:
"""Make a ctrl trajectory with linear interpolation."""
ctrls = []
prev_ctrl_key = np.zeros(model.nu, dtype=np.float64)
prev_time, time = 0.0, 0.0
for key in keys:
ctrl_key, ctrl_time = model.key_ctrl[key], model.key_time[key]
if not ctrls and ctrl_time != 0.0:
raise ValueError("first keyframe must have time 0.0")
elif ctrls and ctrl_time <= prev_time:
raise ValueError("keyframes must be in time order")
while time < ctrl_time:
frac = (time - prev_time) / (ctrl_time - prev_time)
ctrls.append(prev_ctrl_key * (1 - frac) + ctrl_key * frac)
time += model.opt.timestep
ctrls.append(ctrl_key)
time += model.opt.timestep
prev_ctrl_key = ctrl_key
prev_time = time
return np.array(ctrls)
+16 -16
View File
@@ -27,9 +27,9 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.io import MAX_WORLDS
_IO_TEST_MODELS = (
@@ -189,8 +189,8 @@ def _leading_dims_scale_w_nworld(test_obj, d1: Any, d2: Any, nworld1: int, nworl
class IOTest(parameterized.TestCase):
def test_put_model_nworld_array(self):
"""Tests that put_model arrays with nworld leading dim have `_is_batched`."""
mjm, *_ = test_util.fixture("pendula.xml")
m1 = mjwarp.put_model(mjm)
mjm, *_ = test_data.fixture("pendula.xml")
m1 = mjw.put_model(mjm)
self.assertTrue(hasattr(m1.geom_pos, "_is_batched"))
self.assertEqual(m1.geom_pos.shape[0], MAX_WORLDS)
@@ -208,36 +208,36 @@ class IOTest(parameterized.TestCase):
@parameterized.parameters(*_IO_TEST_MODELS)
def test_put_data_nworld_array(self, xml):
"""Tests that put_data arrays that scale with nworld have leading dim nworld."""
mjm, mjd, _, _ = test_util.fixture(xml)
d1 = mjwarp.put_data(mjm, mjd, nworld=1, nconmax=3_000, njmax=3_000)
dn = mjwarp.put_data(mjm, mjd, nworld=133, nconmax=3_000, njmax=3_000)
mjm, mjd, _, _ = test_data.fixture(xml)
d1 = mjw.put_data(mjm, mjd, nworld=1, nconmax=3_000, njmax=3_000)
dn = mjw.put_data(mjm, mjd, nworld=133, nconmax=3_000, njmax=3_000)
_leading_dims_scale_w_nworld(self, d1, dn, 1, 133)
def test_public_api_jax_compat(self):
"""Tests that annotations meet a set of criteria for JAX compat."""
_check_annotation_compat(mjwarp.Model.__annotations__, "Model.")
_check_annotation_compat(mjwarp.Data.__annotations__, "Data.")
_check_annotation_compat(mjw.Model.__annotations__, "Model.")
_check_annotation_compat(mjw.Data.__annotations__, "Data.")
@parameterized.parameters(*_IO_TEST_MODELS)
def test_types_match_annotations(self, xml):
"""Tests that the types of dataclass fields match the annotations."""
mjm, _, m, d = test_util.fixture(xml)
mjm, _, m, d = test_data.fixture(xml)
_check_type_matches_annotation(self, m, "Model.")
_check_type_matches_annotation(self, d, "Data.")
d = mjwarp.make_data(mjm, nworld=2)
d = mjw.make_data(mjm, nworld=2)
_check_type_matches_annotation(self, d, "Data.")
@parameterized.parameters(*_IO_TEST_MODELS)
def test_make_put_data_dims_match(self, xml):
"""Tests that make_data and put_data have matching dimensions."""
mjm, mjd, _, _ = test_util.fixture(xml)
dm2 = mjwarp.make_data(mjm, nworld=2, nconmax=3_000, njmax=4_200)
dm3 = mjwarp.make_data(mjm, nworld=3, nconmax=3_000, njmax=4_200)
mjm, mjd, _, _ = test_data.fixture(xml)
dm2 = mjw.make_data(mjm, nworld=2, nconmax=3_000, njmax=4_200)
dm3 = mjw.make_data(mjm, nworld=3, nconmax=3_000, njmax=4_200)
dp2 = mjwarp.put_data(mjm, mjd, nworld=2, nconmax=3_000, njmax=4_200)
dp3 = mjwarp.put_data(mjm, mjd, nworld=3, nconmax=3_000, njmax=4_200)
dp2 = mjw.put_data(mjm, mjd, nworld=2, nconmax=3_000, njmax=4_200)
dp3 = mjw.put_data(mjm, mjd, nworld=3, nconmax=3_000, njmax=4_200)
_dims_match(self, dm2, dp2)
_dims_match(self, dm3, dp3)
+94 -7
View File
@@ -22,8 +22,7 @@ from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp import test_data
def _assert_eq(a, b, name):
@@ -45,7 +44,7 @@ _IO_TEST_MODELS = (
class IOTest(parameterized.TestCase):
def test_make_put_data(self):
"""Tests that make_data and put_data are producing the same shapes for all arrays."""
mjm, _, _, d = test_util.fixture("pendula.xml")
mjm, _, _, d = test_data.fixture("pendula.xml")
md = mjwarp.make_data(mjm, nconmax=512, njmax=512)
# same number of fields
@@ -148,7 +147,7 @@ class IOTest(parameterized.TestCase):
def test_noslip_solver(self):
with self.assertRaises(NotImplementedError):
test_util.fixture(
test_data.fixture(
xml="""
<mujoco>
<option noslip_iterations="1"/>
@@ -182,8 +181,7 @@ class IOTest(parameterized.TestCase):
"qM",
]
nworld = 1
mjm, mjd, m, d = test_util.fixture(xml, nworld=nworld)
mjm, mjd, m, d = test_data.fixture(xml)
nconmax = d.nconmax
# data fields
@@ -220,7 +218,7 @@ class IOTest(parameterized.TestCase):
def test_sdf(self):
"""Tests that an SDF can be loaded."""
mjm, mjd, m, d = test_util.fixture(fname="collision_sdf/cow.xml", qpos0=True)
mjm, mjd, m, d = test_data.fixture("collision_sdf/cow.xml")
self.assertIsInstance(m.oct_aabb, wp.array)
self.assertEqual(m.oct_aabb.dtype, wp.vec3)
@@ -228,6 +226,95 @@ class IOTest(parameterized.TestCase):
if m.oct_aabb.size > 0:
self.assertEqual(m.oct_aabb.shape[1], 2)
@parameterized.parameters(
('<distance geom1="plane" geom2="sphere"/>', NotImplementedError),
('<distance geom1="sphere" geom2="plane"/>', NotImplementedError),
('<distance geom1="hfield" geom2="sphere"/>', ValueError),
('<distance geom1="sphere" geom2="hfield"/>', ValueError),
)
def test_collision_sensors(self, sensor, err):
"""Tests for collision sensors that are not implemented."""
with self.assertRaises(err):
test_data.fixture(
xml=f"""
<mujoco>
<asset>
<hfield name="hfield" nrow="2" ncol="2" size="1 1 1 1"/>
</asset>
<worldbody>
<geom name="plane" type="plane" size="10 10 .01"/>
<geom name="hfield" type="hfield" hfield="hfield"/>
<body>
<geom name="sphere" type="sphere" size=".1"/>
<joint type="slide" axis="0 0 1"/>
</body>
</worldbody>
<sensor>
{sensor}
</sensor>
</mujoco>
"""
)
def test_implicit_integrator_fluid_model(self):
"""Tests for implicit integrator with fluid model."""
with self.assertRaises(NotImplementedError):
test_data.fixture(
xml="""
<mujoco>
<option viscosity="1" density="1" integrator="implicitfast"/>
<worldbody>
<body>
<geom type="sphere" size=".1"/>
<freejoint/>
</body>
</worldbody>
</mujoco>
"""
)
def test_plugin(self):
with self.assertRaises(NotImplementedError):
test_data.fixture(
xml="""
<mujoco>
<extension>
<plugin plugin="mujoco.pid"/>
<plugin plugin="mujoco.sensor.touch_grid"/>
<plugin plugin="mujoco.elasticity.cable"/>
</extension>
<worldbody>
<geom type="plane" size="10 10 .001"/>
<body>
<joint name="joint" type="slide"/>
<geom type="sphere" size=".1"/>
<site name="site"/>
</body>
<composite type="cable" curve="s" count="41 1 1" size="1" offset="-.3 0 .6" initial="none">
<plugin plugin="mujoco.elasticity.cable">
<config key="twist" value="1e7"/>
<config key="bend" value="4e6"/>
<config key="vmax" value="0.05"/>
</plugin>
<joint kind="main" damping=".015"/>
<geom type="capsule" size=".005" rgba=".8 .2 .1 .1" condim="1"/>
</composite>
</worldbody>
<actuator>
<plugin plugin="mujoco.pid" joint="joint"/>
</actuator>
<sensor>
<plugin plugin="mujoco.sensor.touch_grid" objtype="site" objname="site">
<config key="size" value="7 7"/>
<config key="fov" value="45 45"/>
<config key="gamma" value="0"/>
<config key="nchannel" value="3"/>
</plugin>
</sensor>
</mujoco>
"""
)
if __name__ == "__main__":
wp.init()
+8 -11
View File
@@ -19,8 +19,8 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src.test_util import fixture
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import test_data
# TODO(team): JAX test is temporary, remove after we land MJX:Warp
@@ -47,16 +47,13 @@ class JAXTest(parameterized.TestCase):
NCONTACTS = 16
UNROLL_LENGTH = 1
mjm, _, m, d = fixture(
xml,
nworld=NWORLDS,
nconmax=NWORLDS * NCONTACTS,
njmax=NCONTACTS * 4,
iterations=1,
ls_iterations=4,
kick=True,
mjm, mjd, _, _ = test_data.fixture(
xml, qvel_noise=0.01, ctrl_noise=0.1, overrides={"opt.iterations": 1, "opt.ls_iterations": 4}
)
m = mjw.put_model(mjm)
m.opt.graph_conditional = graph_conditional
d = mjw.put_data(mjm, mjd, nworld=2, nconmax=NCONTACTS, njmax=4 * NCONTACTS)
def warp_step(
qpos_in: wp.array(dtype=wp.float32, ndim=2),
@@ -66,7 +63,7 @@ class JAXTest(parameterized.TestCase):
):
wp.copy(d.qpos, qpos_in)
wp.copy(d.qvel, qvel_in)
mjwarp.step(m, d)
mjw.step(m, d)
wp.copy(qpos_out, d.qpos)
wp.copy(qvel_out, d.qvel)
+50 -31
View File
@@ -30,6 +30,7 @@ wp.set_module_options({"enable_backward": False})
@wp.kernel
def _spring_damper_dof_passive(
# Model:
opt_disableflags: int,
qpos_spring: wp.array2d(dtype=float),
jnt_type: wp.array(dtype=int),
jnt_qposadr: wp.array(dtype=int),
@@ -48,8 +49,8 @@ def _spring_damper_dof_passive(
stiffness = jnt_stiffness[worldid, jntid]
damping = dof_damping[worldid, dofid]
has_stiffness = stiffness != 0.0
has_damping = damping != 0.0
has_stiffness = stiffness != 0.0 and not opt_disableflags & DisableBit.SPRING
has_damping = damping != 0.0 and not opt_disableflags & DisableBit.DAMPER
if not has_stiffness:
qfrc_spring_out[worldid, dofid] = 0.0
@@ -63,7 +64,7 @@ def _spring_damper_dof_passive(
jnttype = jnt_type[jntid]
qposid = jnt_qposadr[jntid]
if jnttype == wp.static(JointType.FREE.value):
if jnttype == JointType.FREE:
# spring
if has_stiffness:
dif = wp.vec3(
@@ -100,7 +101,7 @@ def _spring_damper_dof_passive(
qfrc_damper_out[worldid, dofid + 3] = -damping * qvel_in[worldid, dofid + 3]
qfrc_damper_out[worldid, dofid + 4] = -damping * qvel_in[worldid, dofid + 4]
qfrc_damper_out[worldid, dofid + 5] = -damping * qvel_in[worldid, dofid + 5]
elif jnttype == wp.static(JointType.BALL.value):
elif jnttype == JointType.BALL:
# spring
if has_stiffness:
rot = wp.quat(
@@ -147,6 +148,9 @@ def _spring_damper_tendon_passive(
ten_velocity_in: wp.array2d(dtype=float),
ten_length_in: wp.array2d(dtype=float),
ten_J_in: wp.array3d(dtype=float),
# In:
dsbl_spring: bool,
dsbl_damper: bool,
# Data out:
qfrc_spring_out: wp.array2d(dtype=float),
qfrc_damper_out: wp.array2d(dtype=float),
@@ -156,12 +160,15 @@ def _spring_damper_tendon_passive(
stiffness = tendon_stiffness[worldid, tenid]
damping = tendon_damping[worldid, tenid]
if stiffness == 0.0 and damping == 0.0:
has_stiffness = stiffness != 0.0 and not dsbl_spring
has_damping = damping != 0.0 and not dsbl_damper
if not has_stiffness and not has_damping:
return
J = ten_J_in[worldid, tenid, dofid]
if stiffness:
if has_stiffness:
# compute spring force along tendon
length = ten_length_in[worldid, tenid]
lengthspring = tendon_lengthspring[worldid, tenid]
@@ -178,7 +185,7 @@ def _spring_damper_tendon_passive(
# transform to joint torque
wp.atomic_add(qfrc_spring_out[worldid], dofid, J * frc_spring)
if damping:
if has_damping:
# compute damper linear force along tendon
frc_damper = -damping * ten_velocity_in[worldid, tenid]
@@ -388,6 +395,8 @@ def _flex_elasticity(
flexvert_xpos_in: wp.array2d(dtype=wp.vec3),
flexedge_length_in: wp.array2d(dtype=float),
flexedge_velocity_in: wp.array2d(dtype=float),
# In:
dsbl_damper: bool,
# Data out:
qfrc_spring_out: wp.array2d(dtype=float),
):
@@ -403,7 +412,10 @@ def _flex_elasticity(
wp.mat(0, 1, 1, 2, 2, 0, 2, 3, 0, 3, 1, 3, shape=(6, 2), dtype=int),
wp.mat(1, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, shape=(6, 2), dtype=int),
)
kD = flex_damping[f] / timestep
if timestep > 0.0 and not dsbl_damper:
kD = flex_damping[f] / timestep
else:
kD = 0.0
gradient = wp.mat(0.0, shape=(6, 6))
for e in range(nedge):
@@ -506,8 +518,10 @@ def _flex_bending(
@event_scope
def passive(m: Model, d: Data):
"""Adds all passive forces."""
dsbl_spring = m.opt.disableflags & DisableBit.SPRING
dsbl_damper = m.opt.disableflags & DisableBit.DAMPER
if m.opt.disableflags & (DisableBit.SPRING | DisableBit.DAMPER):
if dsbl_spring and dsbl_damper:
d.qfrc_spring.zero_()
d.qfrc_damper.zero_()
d.qfrc_gravcomp.zero_()
@@ -519,6 +533,7 @@ def passive(m: Model, d: Data):
_spring_damper_dof_passive,
dim=(d.nworld, m.njnt),
inputs=[
m.opt.disableflags,
m.qpos_spring,
m.jnt_type,
m.jnt_qposadr,
@@ -542,6 +557,8 @@ def passive(m: Model, d: Data):
d.ten_velocity,
d.ten_length,
d.ten_J,
dsbl_spring,
dsbl_damper,
],
outputs=[
d.qfrc_spring,
@@ -549,28 +566,30 @@ def passive(m: Model, d: Data):
],
)
wp.launch(
_flex_elasticity,
dim=(d.nworld, m.nflexelem),
inputs=[
m.opt.timestep,
m.body_dofadr,
m.flex_dim,
m.flex_vertadr,
m.flex_edgeadr,
m.flex_elemedgeadr,
m.flex_vertbodyid,
m.flex_elem,
m.flex_elemedge,
m.flexedge_length0,
m.flex_stiffness,
m.flex_damping,
d.flexvert_xpos,
d.flexedge_length,
d.flexedge_velocity,
],
outputs=[d.qfrc_spring],
)
if not dsbl_spring:
wp.launch(
_flex_elasticity,
dim=(d.nworld, m.nflexelem),
inputs=[
m.opt.timestep,
m.body_dofadr,
m.flex_dim,
m.flex_vertadr,
m.flex_edgeadr,
m.flex_elemedgeadr,
m.flex_vertbodyid,
m.flex_elem,
m.flex_elemedge,
m.flexedge_length0,
m.flex_stiffness,
m.flex_damping,
d.flexvert_xpos,
d.flexedge_length,
d.flexedge_velocity,
dsbl_damper,
],
outputs=[d.qfrc_spring],
)
wp.launch(
_flex_bending,
dim=(d.nworld, m.nflexedge),
+25 -16
View File
@@ -15,14 +15,15 @@
"""Tests for passive force functions."""
import mujoco
import numpy as np
import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and MJWarp passive force calculations - mostly
# due to float precision
@@ -36,15 +37,22 @@ def _assert_eq(a, b, name):
class PassiveTest(parameterized.TestCase):
@parameterized.product(passive=[True, False], gravity=[True, False])
def test_passive(self, passive, gravity):
@parameterized.product(spring=(0, DisableBit.SPRING), damper=(0, DisableBit.DAMPER), gravity=(0, DisableBit.GRAVITY))
def test_passive(self, spring, damper, gravity):
"""Tests passive."""
_, mjd, m, d = test_util.fixture("pendula.xml", spring=passive, damper=passive, gravity=gravity, kick=True, applied=True)
_, mjd, m, d = test_data.fixture(
"pendula.xml",
qvel_noise=0.01,
ctrl_noise=0.1,
qfrc_noise=0.1,
xfrc_noise=0.1,
overrides={"opt.disableflags": DisableBit.CONTACT | spring | damper | gravity},
)
for arr in (d.qfrc_spring, d.qfrc_damper, d.qfrc_gravcomp, d.qfrc_passive):
arr.zero_()
mjwarp.passive(m, d)
mjw.passive(m, d)
_assert_eq(d.qfrc_spring.numpy()[0], mjd.qfrc_spring, "qfrc_spring")
_assert_eq(d.qfrc_damper.numpy()[0], mjd.qfrc_damper, "qfrc_damper")
@@ -62,7 +70,7 @@ class PassiveTest(parameterized.TestCase):
def test_fluid(self, density, viscosity, wind0, wind1, wind2):
"""Tests fluid model."""
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml=f"""
<mujoco>
<option density="{density}" viscosity="{viscosity}" wind="{wind0} {wind1} {wind2}"/>
@@ -83,16 +91,18 @@ class PassiveTest(parameterized.TestCase):
for arr in (d.qfrc_passive, d.qfrc_fluid):
arr.zero_()
mjwarp.passive(m, d)
mjw.passive(m, d)
_assert_eq(d.qfrc_passive.numpy()[0], mjd.qfrc_passive, "qfrc_passive")
_assert_eq(d.qfrc_fluid.numpy()[0], mjd.qfrc_fluid, "qfrc_fluid")
@parameterized.parameters((True, True), (True, False), (False, True), (False, False))
def test_gravcomp(self, sparse, gravity):
@parameterized.product(
jacobian=(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE), gravity=(0, DisableBit.GRAVITY)
)
def test_gravcomp(self, jacobian, gravity):
"""Tests gravity compensation."""
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<option gravity="1 2 3">
@@ -124,15 +134,14 @@ class PassiveTest(parameterized.TestCase):
</actuator>
</mujoco>
""",
gravity=gravity,
sparse=sparse,
overrides={"opt.disableflags": DisableBit.CONTACT | gravity, "opt.jacobian": jacobian},
)
for arr in (d.qfrc_passive, d.qfrc_gravcomp, d.qfrc_actuator):
arr.zero_()
mjwarp.passive(m, d)
mjwarp.fwd_actuation(m, d)
mjw.passive(m, d)
mjw.fwd_actuation(m, d)
_assert_eq(d.qfrc_passive.numpy()[0], mjd.qfrc_passive, "qfrc_passive")
_assert_eq(d.qfrc_gravcomp.numpy()[0], mjd.qfrc_gravcomp, "qfrc_gravcomp")
+9 -9
View File
@@ -408,7 +408,7 @@ def _ray_hfield(
id: int,
):
# check geom type
if geom_type[id] != int(GeomType.HFIELD.value):
if geom_type[id] != GeomType.HFIELD:
return wp.inf
# hfield id and dimensions
@@ -608,17 +608,17 @@ def ray_geom(pos: wp.vec3, mat: wp.mat33, size: wp.vec3, pnt: wp.vec3, vec: wp.v
"""Returns distance along ray to intersection with geom, or infinity if none."""
# TODO(team): static loop unrolling to remove unnecessary branching
if geomtype == int(GeomType.PLANE.value):
if geomtype == GeomType.PLANE:
return _ray_plane(pos, mat, size, pnt, vec)
elif geomtype == int(GeomType.SPHERE.value):
elif geomtype == GeomType.SPHERE:
return _ray_sphere(pos, size[0] * size[0], pnt, vec)
elif geomtype == int(GeomType.CAPSULE.value):
elif geomtype == GeomType.CAPSULE:
return _ray_capsule(pos, mat, size, pnt, vec)
elif geomtype == int(GeomType.ELLIPSOID.value):
elif geomtype == GeomType.ELLIPSOID:
return _ray_ellipsoid(pos, mat, size, pnt, vec)
elif geomtype == int(GeomType.CYLINDER.value):
elif geomtype == GeomType.CYLINDER:
return _ray_cylinder(pos, mat, size, pnt, vec)
elif geomtype == int(GeomType.BOX.value):
elif geomtype == GeomType.BOX:
dist, _ = _ray_box(pos, mat, size, pnt, vec)
return dist
else:
@@ -675,7 +675,7 @@ def _ray_geom_mesh(
mat = geom_xmat_in[worldid, geomid]
type = geom_type[geomid]
if type == int(GeomType.MESH.value):
if type == GeomType.MESH:
return ray_mesh(
nmeshface,
mesh_vertadr,
@@ -688,7 +688,7 @@ def _ray_geom_mesh(
pnt,
vec,
)
elif type == int(GeomType.HFIELD.value):
elif type == GeomType.HFIELD:
return _ray_hfield(
geom_type,
geom_dataid,
+33 -33
View File
@@ -19,9 +19,9 @@ import numpy as np
import warp as wp
from absl.testing import absltest
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import vec6
# tolerance for difference between MuJoCo and MJX ray calculations - mostly
@@ -38,11 +38,11 @@ def _assert_eq(a, b, name):
class RayTest(absltest.TestCase):
def test_ray_nothing(self):
"""Tests that ray returns -1 when nothing is hit."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
pnt = wp.array([wp.vec3(12.146, 1.865, 3.895)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.vec3(0.0, 0.0, -1.0)], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0] # Extract from [[-1]]
dist_np = dist.numpy()[0, 0] # Extract from [[-1.]]
@@ -51,12 +51,12 @@ class RayTest(absltest.TestCase):
def test_ray_plane(self):
"""Tests ray<>plane matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# looking down at a slight angle
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -68,7 +68,7 @@ class RayTest(absltest.TestCase):
# looking on wrong side of plane
pnt = wp.array([wp.vec3(0.0, 0.0, -0.5)], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -77,12 +77,12 @@ class RayTest(absltest.TestCase):
def test_ray_sphere(self):
"""Tests ray<>sphere matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# looking down at sphere at a slight angle
pnt = wp.array([wp.vec3(0.0, 0.0, 1.6)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -94,12 +94,12 @@ class RayTest(absltest.TestCase):
def test_ray_capsule(self):
"""Tests ray<>capsule matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# looking down at capsule at a slight angle
pnt = wp.array([wp.vec3(0.5, 1.0, 1.6)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.0, 0.05, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -112,7 +112,7 @@ class RayTest(absltest.TestCase):
# looking up at capsule from below
pnt = wp.array([wp.vec3(-0.5, 1.0, 0.05)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.0, 0.05, 1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -125,7 +125,7 @@ class RayTest(absltest.TestCase):
# looking at cylinder of capsule from the side
pnt = wp.array([wp.vec3(0.0, 1.0, 0.75)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(1.0, 0.0, 0.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -137,26 +137,26 @@ class RayTest(absltest.TestCase):
def test_ray_cylinder(self):
"""Tests ray<>cylinder matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
pnt = wp.array([wp.vec3(2.0, 0.0, 0.05)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.0, 0.05, 1.0))], dtype=wp.vec3).reshape((1, 1))
mj_geomid = np.zeros(1, dtype=np.int32)
mj_dist = mujoco.mj_ray(mjm, mjd, pnt.numpy()[0, 0], vec.numpy()[0, 0], None, 1, -1, mj_geomid)
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
_assert_eq(geomid.numpy()[0, 0], mj_geomid[0], "geomid")
_assert_eq(dist.numpy()[0, 0], mj_dist, "dist")
def test_ray_box(self):
"""Tests ray<>box matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# looking down at box at a slight angle
pnt = wp.array([wp.vec3(1.0, 0.0, 1.6)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.0, 0.05, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -169,7 +169,7 @@ class RayTest(absltest.TestCase):
# looking up at box from below
pnt = wp.array([wp.vec3(1.0, 0.0, 0.05)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.0, 0.05, 1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -181,12 +181,12 @@ class RayTest(absltest.TestCase):
def test_ray_mesh(self):
"""Tests ray<>mesh matches MuJoCo."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# look at the tetrahedron
pnt = wp.array([wp.vec3(2.0, 2.0, 2.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(-1.0, -1.0, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -200,7 +200,7 @@ class RayTest(absltest.TestCase):
# look away from the dodecahedron
pnt = wp.array([wp.vec3(4.0, 2.0, 2.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(2.0, 1.0, 1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
_assert_eq(geomid_np, -1, "geom_id")
@@ -208,7 +208,7 @@ class RayTest(absltest.TestCase):
# look at the dodecahedron
pnt = wp.array([wp.vec3(4.0, 2.0, 2.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(-2.0, -1.0, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -220,11 +220,11 @@ class RayTest(absltest.TestCase):
_assert_eq(dist_np, mj_dist, "dist-dodecahedron")
def test_ray_hfield(self):
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
pnt = wp.array([wp.vec3(0.0, 2.0, 2.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.vec3(0.0, 0.0, -1.0)], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
mj_geomid = np.zeros(1, dtype=np.int32)
mj_dist = mujoco.mj_ray(mjm, mjd, pnt.numpy()[0, 0], vec.numpy()[0, 0], None, 1, -1, mj_geomid)
@@ -234,13 +234,13 @@ class RayTest(absltest.TestCase):
def test_ray_geomgroup(self):
"""Tests ray geomgroup filter."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# hits plane with geom_group[0] = 1
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
geomgroup = vec6(1, 0, 0, 0, 0, 0)
dist, geomid = mjwarp.ray(m, d, pnt, vec, geomgroup=geomgroup)
dist, geomid = mjw.ray(m, d, pnt, vec, geomgroup=geomgroup)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -255,7 +255,7 @@ class RayTest(absltest.TestCase):
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
geomgroup = vec6(0, 0, 0, 0, 0, 0)
dist, geomid = mjwarp.ray(m, d, pnt, vec, geomgroup=geomgroup)
dist, geomid = mjw.ray(m, d, pnt, vec, geomgroup=geomgroup)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -264,12 +264,12 @@ class RayTest(absltest.TestCase):
def test_ray_flg_static(self):
"""Tests ray flg_static filter."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# nothing hit with flg_static = False
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec, flg_static=False)
dist, geomid = mjw.ray(m, d, pnt, vec, flg_static=False)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -278,12 +278,12 @@ class RayTest(absltest.TestCase):
def test_ray_bodyexclude(self):
"""Tests ray bodyexclude filter."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# nothing hit with bodyexclude = 0 (world body)
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec, bodyexclude=0)
dist, geomid = mjw.ray(m, d, pnt, vec, bodyexclude=0)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
@@ -292,7 +292,7 @@ class RayTest(absltest.TestCase):
def test_ray_invisible(self):
"""Tests ray doesn't hit transparent geoms."""
mjm, mjd, m, d = test_util.fixture("ray.xml")
mjm, mjd, m, d = test_data.fixture("ray.xml")
# nothing hit with transparent geoms
m.geom_rgba = wp.array2d([[wp.vec4(0.0, 0.0, 0.0, 0.0)] * 8], dtype=wp.vec4)
@@ -300,7 +300,7 @@ class RayTest(absltest.TestCase):
pnt = wp.array([wp.vec3(2.0, 1.0, 3.0)], dtype=wp.vec3).reshape((1, 1))
vec = wp.array([wp.normalize(wp.vec3(0.1, 0.2, -1.0))], dtype=wp.vec3).reshape((1, 1))
dist, geomid = mjwarp.ray(m, d, pnt, vec)
dist, geomid = mjw.ray(m, d, pnt, vec)
wp.synchronize()
geomid_np = geomid.numpy()[0, 0]
dist_np = dist.numpy()[0, 0]
File diff suppressed because it is too large Load Diff
+130 -41
View File
@@ -15,17 +15,15 @@
"""Tests for sensor functions."""
import itertools
import mujoco
import numpy as np
import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and MJWarp calculations - mostly
# due to float precision
@@ -41,7 +39,7 @@ def _assert_eq(a, b, name):
class SensorTest(parameterized.TestCase):
def test_sensor(self):
"""Test sensors."""
mjm, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<option gravity="-1 -1 -1"/>
@@ -288,21 +286,22 @@ class SensorTest(parameterized.TestCase):
</mujoco>
""",
keyframe=0,
kick=True,
qvel_noise=0.01,
ctrl_noise=0.1,
)
d.sensordata.zero_()
mjwarp.sensor_pos(m, d)
mjwarp.sensor_vel(m, d)
mjwarp.sensor_acc(m, d)
mjw.sensor_pos(m, d)
mjw.sensor_vel(m, d)
mjw.sensor_acc(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
def test_rangefinder(self):
"""Test rangefinder."""
for keyframe in range(2):
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<compiler angle="degree"/>
@@ -333,14 +332,14 @@ class SensorTest(parameterized.TestCase):
d.sensordata.zero_()
mjwarp.sensor_pos(m, d)
mjw.sensor_pos(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
def test_touch_sensor(self):
"""Test touch sensor."""
for keyframe in range(2):
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -377,35 +376,35 @@ class SensorTest(parameterized.TestCase):
d.sensordata.zero_()
mjwarp.sensor_acc(m, d)
mjw.sensor_acc(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
def test_tendon_sensor(self):
"""Test tendon sensors."""
_, mjd, m, d = test_util.fixture("tendon/fixed.xml", keyframe=0, sparse=False)
_, mjd, m, d = test_data.fixture("tendon/fixed.xml", keyframe=0)
d.sensordata.zero_()
mjwarp.sensor_pos(m, d)
mjwarp.sensor_vel(m, d)
mjw.sensor_pos(m, d)
mjw.sensor_vel(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
@parameterized.parameters("humanoid/humanoid.xml", "constraints.xml")
def test_energy(self, xml):
mjm, mjd, m, d = test_util.fixture(xml, constraint=False, kick=True)
mjm, mjd, m, d = test_data.fixture(
xml, qvel_noise=0.01, ctrl_noise=0.1, overrides={"opt.disableflags": DisableBit.CONSTRAINT}
)
d.energy.zero_()
mujoco.mj_energyPos(mjm, mjd)
mjwarp.energy_pos(m, d)
mjw.energy_pos(m, d)
_assert_eq(d.energy.numpy()[0][0], mjd.energy[0], "potential energy")
mujoco.mj_energyVel(mjm, mjd)
mjwarp.energy_vel(m, d)
mjw.energy_vel(m, d)
_assert_eq(d.energy.numpy()[0][1], mjd.energy[1], "kinetic energy")
@parameterized.parameters(
@@ -418,18 +417,18 @@ class SensorTest(parameterized.TestCase):
contact_sensor = ""
# data combinations
datas = ["found", "force dist normal", "torque pos tangent", "found force torque dist pos normal tangent"]
datas = ("found", "force dist normal", "torque pos tangent", "found force torque dist pos normal tangent")
for geoms in [
for geoms in (
'geom2="plane"',
'geom1="plane" geom2="geom"',
'geom1="geom" geom2="plane"',
'body1="plane"',
'body1="plane" body2="geom"',
'body1="geom" body2="plane"',
]:
for num in [1, 5]:
for reduce in [None, "mindist", "maxforce"]:
):
for num in (1, 5):
for reduce in (None, "mindist", "maxforce"):
for data in datas:
contact_sensor += f'<contact {geoms} num="{num}"'
if reduce is not None:
@@ -462,12 +461,10 @@ class SensorTest(parameterized.TestCase):
</mujoco>
"""
_, mjd, m, d = test_util.fixture(xml=_MJCF, keyframe=0)
_, mjd, m, d = test_data.fixture(xml=_MJCF, keyframe=0)
d.sensordata.zero_()
mjwarp.forward(m, d)
print(f"ncon: {d.ncon.numpy()}")
mjw.forward(m, d)
sensordata = d.sensordata.numpy()[0]
_assert_eq(sensordata, mjd.sensordata, "sensordata")
@@ -475,7 +472,7 @@ class SensorTest(parameterized.TestCase):
def test_contact_sensor_subtree(self):
"""Test contact sensor with subtree matching semantics."""
_MJCF = f"""
_MJCF = """
<mujoco>
<worldbody>
<geom type="plane" size="2 2 .01"/>
@@ -506,16 +503,16 @@ class SensorTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_MJCF, nconmax=12, njmax=48, keyframe=0)
_, _, m, d = test_data.fixture(xml=_MJCF, keyframe=0)
d.sensordata.zero_()
mjwarp.forward(m, d)
mjw.forward(m, d)
_assert_eq(d.sensordata.numpy()[0], np.array([4, 4, 4, 2, 1, 0, 1]), "found")
def test_contact_sensor_subtree_found_zero(self):
"""Test contact sensor with subtree matching semantics generates found=0."""
_MJCF = f"""
_MJCF = """
<mujoco>
<worldbody>
<geom type="plane" size="2 2 .01"/>
@@ -541,17 +538,17 @@ class SensorTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
_, _, m, d = test_util.fixture(xml=_MJCF, nconmax=2, njmax=8, keyframe=0)
_, _, m, d = test_data.fixture(xml=_MJCF, keyframe=0)
d.sensordata.fill_(wp.inf)
mjwarp.forward(m, d)
mjw.forward(m, d)
_assert_eq(d.ncon.numpy()[0], 2, "ncon")
_assert_eq(d.sensordata.numpy()[0], 0, "found")
@parameterized.product(site_geom=["sphere", "capsule", "ellipsoid", "cylinder", "box"], key_pos=["0 0 10", "0 0 .09"])
def test_contact_sensor_site(self, site_geom, key_pos):
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml=f"""
<mujoco>
<worldbody>
@@ -574,13 +571,13 @@ class SensorTest(parameterized.TestCase):
)
d.sensordata.zero_()
mjwarp.forward(m, d)
mjw.forward(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
def test_contact_sensor_netforce(self):
"""Test contact sensor with netforce reduction."""
_, mjd, m, d = test_util.fixture(
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -603,11 +600,103 @@ class SensorTest(parameterized.TestCase):
)
d.sensordata.zero_()
mjwarp.forward(m, d)
mjw.forward(m, d)
sensordata = d.sensordata.numpy()[0]
_assert_eq(sensordata, mjd.sensordata, "sensordata")
self.assertTrue(sensordata.any()) # check that sensordata is not empty
@parameterized.parameters(
("sphere", "sphere"),
("box", "box"),
("capsule", "box"),
)
def test_sensor_collision(self, geom1, geom2):
"""Tests collision sensors: distance, normal, fromto."""
# TODO(team): test plane
_, mjd, m, d = test_data.fixture(
xml=f"""
<mujoco>
<worldbody>
<body name="geom0">
<geom name="geom0" type="{geom1}" size=".1 .1 .1"/>
</body>
<body name="geom1">
<geom name="geom1" type="{geom2}" size=".1 .1 .1"/>
<joint type="slide" axis="0 0 1"/>
</body>
<body name="geomgeom" pos="1 0 0">
<geom type="box" size=".075 .075 .075" pos=".2 0 0"/>
<joint type="slide" axis="0 0 1"/>
</body>
</worldbody>
<keyframe>
<key qpos="1 2"/>
</keyframe>
<sensor>
<distance geom1="geom0" geom2="geom1" cutoff=".001"/>
<distance geom1="geom0" geom2="geom1" cutoff=".9"/>
<distance geom1="geom0" geom2="geom1" cutoff=".91"/>
<distance geom1="geom0" geom2="geom1" cutoff="1"/>
<normal geom1="geom0" geom2="geom1" cutoff=".001"/>
<normal geom1="geom0" geom2="geom1" cutoff="1"/>
<normal geom1="geom1" geom2="geom0" cutoff="1"/>
<fromto geom1="geom0" geom2="geom1" cutoff=".001"/>
<fromto geom1="geom0" geom2="geom1" cutoff="1"/>
<fromto geom1="geom1" geom2="geom0" cutoff="1"/>
<distance body1="geom0" body2="geomgeom" cutoff="5"/>
<distance body1="geomgeom" body2="geom0" cutoff="5"/>
<normal body1="geom0" body2="geomgeom" cutoff="5"/>
<normal body1="geomgeom" body2="geom0" cutoff="5"/>
<fromto body1="geom0" body2="geomgeom" cutoff="5"/>
<fromto body1="geomgeom" body2="geom0" cutoff="5"/>
</sensor>
</mujoco>
""",
keyframe=0,
)
d.sensordata.fill_(wp.inf)
mjw.forward(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
@parameterized.parameters(0, 1)
def test_insidesite(self, keyframe):
_, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
<site name="refsite" type="sphere" size=".1"/>
<body name="body">
<geom name="geom" type="sphere" size=".1"/>
<site name="site"/>
<camera name="camera"/>
<joint type="slide" axis="1 0 0"/>
</body>
</worldbody>
<sensor>
<insidesite site="refsite" objtype="xbody" objname="body"/>
<insidesite site="refsite" objtype="body" objname="body"/>
<insidesite site="refsite" objtype="geom" objname="geom"/>
<insidesite site="refsite" objtype="site" objname="site"/>
<insidesite site="refsite" objtype="camera" objname="camera"/>
</sensor>
<keyframe>
<key qpos="0"/>
<key qpos="1"/>
</keyframe>
</mujoco>
""",
keyframe=keyframe,
)
d.sensordata.fill_(wp.inf)
mjw.forward(m, d)
_assert_eq(d.sensordata.numpy()[0], mjd.sensordata, "sensordata")
if __name__ == "__main__":
wp.init()
+51 -52
View File
@@ -98,7 +98,7 @@ def _kinematics_level(
pid = body_parentid[bodyid]
xpos = (xmat_in[worldid, pid] * body_pos[worldid, bodyid]) + xpos_in[worldid, pid]
xquat = math.mul_quat(xquat_in[worldid, pid], body_quat[worldid, bodyid])
elif jntnum == 1 and jnt_type[jntadr] == wp.static(JointType.FREE.value):
elif jntnum == 1 and jnt_type[jntadr] == JointType.FREE:
# free joint
qadr = jnt_qposadr[jntadr]
xpos = wp.vec3(qpos[qadr], qpos[qadr + 1], qpos[qadr + 2])
@@ -120,7 +120,7 @@ def _kinematics_level(
xanchor = math.rot_vec_quat(jnt_pos[worldid, jntadr], xquat) + xpos
xaxis = math.rot_vec_quat(jnt_axis_, xquat)
if jnt_type_ == wp.static(JointType.BALL.value):
if jnt_type_ == JointType.BALL:
qloc = wp.quat(
qpos[qadr + 0],
qpos[qadr + 1],
@@ -131,9 +131,9 @@ def _kinematics_level(
xquat = math.mul_quat(xquat, qloc)
# correct for off-center rotation
xpos = xanchor - math.rot_vec_quat(jnt_pos[worldid, jntadr], xquat)
elif jnt_type_ == wp.static(JointType.SLIDE.value):
elif jnt_type_ == JointType.SLIDE:
xpos += xaxis * (qpos[qadr] - qpos0[worldid, qadr])
elif jnt_type_ == wp.static(JointType.HINGE.value):
elif jnt_type_ == JointType.HINGE:
qpos0_ = qpos0[worldid, qadr]
qloc_ = math.axis_angle_to_quat(jnt_axis_, qpos[qadr] - qpos0_)
xquat = math.mul_quat(xquat, qloc_)
@@ -458,7 +458,7 @@ def _cdof(
offset = subtree_com_in[worldid, body_rootid[bodyid]] - xanchor_in[worldid, jntid]
res = cdof_out[worldid]
if jnt_type_ == wp.static(JointType.FREE.value):
if jnt_type_ == JointType.FREE:
res[dofid + 0] = wp.spatial_vector(0.0, 0.0, 0.0, 1.0, 0.0, 0.0)
res[dofid + 1] = wp.spatial_vector(0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
res[dofid + 2] = wp.spatial_vector(0.0, 0.0, 0.0, 0.0, 0.0, 1.0)
@@ -466,14 +466,14 @@ def _cdof(
res[dofid + 3] = wp.spatial_vector(xmat[0], wp.cross(xmat[0], offset))
res[dofid + 4] = wp.spatial_vector(xmat[1], wp.cross(xmat[1], offset))
res[dofid + 5] = wp.spatial_vector(xmat[2], wp.cross(xmat[2], offset))
elif jnt_type_ == wp.static(JointType.BALL.value): # ball
elif jnt_type_ == JointType.BALL: # ball
# I_3 rotation in child frame (assume no subsequent rotations)
res[dofid + 0] = wp.spatial_vector(xmat[0], wp.cross(xmat[0], offset))
res[dofid + 1] = wp.spatial_vector(xmat[1], wp.cross(xmat[1], offset))
res[dofid + 2] = wp.spatial_vector(xmat[2], wp.cross(xmat[2], offset))
elif jnt_type_ == wp.static(JointType.SLIDE.value):
elif jnt_type_ == JointType.SLIDE:
res[dofid] = wp.spatial_vector(wp.vec3(0.0), xaxis)
elif jnt_type_ == wp.static(JointType.HINGE.value): # hinge
elif jnt_type_ == JointType.HINGE: # hinge
res[dofid] = wp.spatial_vector(xaxis, wp.cross(xaxis, offset))
@@ -532,9 +532,7 @@ def _cam_local_to_global(
cam_xmat_out: wp.array2d(dtype=wp.mat33),
):
worldid, camid = wp.tid()
is_target_cam = (cam_mode[camid] == wp.static(CamLightType.TARGETBODY.value)) or (
cam_mode[camid] == wp.static(CamLightType.TARGETBODYCOM.value)
)
is_target_cam = (cam_mode[camid] == CamLightType.TARGETBODY) or (cam_mode[camid] == CamLightType.TARGETBODYCOM)
invalid_target = is_target_cam and (cam_targetbodyid[camid] < 0)
if invalid_target:
bodyid = cam_bodyid[camid]
@@ -542,22 +540,20 @@ def _cam_local_to_global(
xquat = xquat_in[worldid, bodyid]
cam_xpos_out[worldid, camid] = xpos + math.rot_vec_quat(cam_pos[worldid, camid], xquat)
cam_xmat_out[worldid, camid] = math.quat_to_mat(math.mul_quat(xquat, cam_quat[worldid, camid]))
elif cam_mode[camid] == wp.static(CamLightType.TRACK.value):
elif cam_mode[camid] == CamLightType.TRACK:
cam_xmat_out[worldid, camid] = cam_mat0[worldid, camid]
body_xpos = xpos_in[worldid, cam_bodyid[camid]]
cam_xpos_out[worldid, camid] = body_xpos + cam_pos0[worldid, camid]
elif cam_mode[camid] == wp.static(CamLightType.TRACKCOM.value):
elif cam_mode[camid] == CamLightType.TRACKCOM:
cam_xmat_out[worldid, camid] = cam_mat0[worldid, camid]
cam_xpos_out[worldid, camid] = subtree_com_in[worldid, cam_bodyid[camid]] + cam_poscom0[worldid, camid]
elif cam_mode[camid] == wp.static(CamLightType.TARGETBODY.value) or cam_mode[camid] == wp.static(
CamLightType.TARGETBODYCOM.value
):
elif cam_mode[camid] == CamLightType.TARGETBODY or cam_mode[camid] == CamLightType.TARGETBODYCOM:
bodyid = cam_bodyid[camid]
xpos = xpos_in[worldid, bodyid]
xquat = xquat_in[worldid, bodyid]
cam_xpos_out[worldid, camid] = xpos + math.rot_vec_quat(cam_pos[worldid, camid], xquat)
pos = xpos_in[worldid, cam_targetbodyid[camid]]
if cam_mode[camid] == wp.static(CamLightType.TARGETBODYCOM.value):
if cam_mode[camid] == CamLightType.TARGETBODYCOM:
pos = subtree_com_in[worldid, cam_targetbodyid[camid]]
# zaxis = -desired camera direction, in global frame
mat_3 = wp.normalize(cam_xpos_out[worldid, camid] - pos)
@@ -599,9 +595,7 @@ def _light_local_to_global(
light_xdir_out: wp.array2d(dtype=wp.vec3),
):
worldid, lightid = wp.tid()
is_target_light = (light_mode[lightid] == wp.static(CamLightType.TARGETBODY.value)) or (
light_mode[lightid] == wp.static(CamLightType.TARGETBODYCOM.value)
)
is_target_light = (light_mode[lightid] == CamLightType.TARGETBODY) or (light_mode[lightid] == CamLightType.TARGETBODYCOM)
invalid_target = is_target_light and (light_targetbodyid[lightid] < 0)
if invalid_target:
bodyid = light_bodyid[lightid]
@@ -610,22 +604,20 @@ def _light_local_to_global(
light_xpos_out[worldid, lightid] = xpos + math.rot_vec_quat(light_pos[worldid, lightid], xquat)
light_xdir_out[worldid, lightid] = math.rot_vec_quat(light_dir[worldid, lightid], xquat)
return
elif light_mode[lightid] == wp.static(CamLightType.TRACK.value):
elif light_mode[lightid] == CamLightType.TRACK:
light_xdir_out[worldid, lightid] = light_dir0[worldid, lightid]
body_xpos = xpos_in[worldid, light_bodyid[lightid]]
light_xpos_out[worldid, lightid] = body_xpos + light_pos0[worldid, lightid]
elif light_mode[lightid] == wp.static(CamLightType.TRACKCOM.value):
elif light_mode[lightid] == CamLightType.TRACKCOM:
light_xdir_out[worldid, lightid] = light_dir0[worldid, lightid]
light_xpos_out[worldid, lightid] = subtree_com_in[worldid, light_bodyid[lightid]] + light_poscom0[worldid, lightid]
elif light_mode[lightid] == wp.static(CamLightType.TARGETBODY.value) or light_mode[lightid] == wp.static(
CamLightType.TARGETBODYCOM.value
):
elif light_mode[lightid] == CamLightType.TARGETBODY or light_mode[lightid] == CamLightType.TARGETBODYCOM:
bodyid = light_bodyid[lightid]
xpos = xpos_in[worldid, bodyid]
xquat = xquat_in[worldid, bodyid]
light_xpos_out[worldid, lightid] = xpos + math.rot_vec_quat(light_pos[worldid, lightid], xquat)
pos = xpos_in[worldid, light_targetbodyid[lightid]]
if light_mode[lightid] == wp.static(CamLightType.TARGETBODYCOM.value):
if light_mode[lightid] == CamLightType.TARGETBODYCOM:
pos = subtree_com_in[worldid, light_targetbodyid[lightid]]
light_xdir_out[worldid, lightid] = pos - light_xpos_out[worldid, lightid]
else:
@@ -1180,7 +1172,7 @@ def _cfrc_ext_equality(
id = efc_id_in[worldid, efcid]
eq_data_ = eq_data[worldid, id]
body_semantic = eq_objtype[id] == wp.static(ObjType.BODY.value)
body_semantic = eq_objtype[id] == ObjType.BODY
obj1 = eq_obj1id[id]
obj2 = eq_obj2id[id]
@@ -1411,7 +1403,7 @@ def _tendon_dot(
# fixed tendon has zero Jdot
adr = tendon_adr[tenid]
if wrap_type[adr] == int(WrapType.JOINT.value):
if wrap_type[adr] == WrapType.JOINT:
return
# process spatial tendon
@@ -1426,7 +1418,7 @@ def _tendon_dot(
id1 = wrap_objid[adr + j + 1]
# pulley
pulley = int(WrapType.PULLEY.value)
pulley = WrapType.PULLEY
if (type0 == pulley) or (type1 == pulley):
# get divisor
if type0 == pulley:
@@ -1447,7 +1439,7 @@ def _tendon_dot(
wbody0 = site_bodyid[id0]
# second object is geom: process site-geom-site
if (type1 == int(WrapType.SPHERE.value)) or (type1 == int(WrapType.CYLINDER.value)):
if (type1 == WrapType.SPHERE) or (type1 == WrapType.CYLINDER):
# TODO(team): derivatives of util_misc.wrap
return
@@ -1699,7 +1691,7 @@ def _comvel_level(
for j in range(jntid, jntid + jntnum):
jnttype = jnt_type[j]
if jnttype == wp.static(JointType.FREE.value):
if jnttype == JointType.FREE:
cvel += cdof[dofid + 0] * qvel[dofid + 0]
cvel += cdof[dofid + 1] * qvel[dofid + 1]
cvel += cdof[dofid + 2] * qvel[dofid + 2]
@@ -1713,7 +1705,7 @@ def _comvel_level(
cvel += cdof[dofid + 5] * qvel[dofid + 5]
dofid += 6
elif jnttype == wp.static(JointType.BALL.value):
elif jnttype == JointType.BALL:
cdof_dot_out[worldid, dofid + 0] = math.motion_cross(cvel, cdof[dofid + 0])
cdof_dot_out[worldid, dofid + 1] = math.motion_cross(cvel, cdof[dofid + 1])
cdof_dot_out[worldid, dofid + 2] = math.motion_cross(cvel, cdof[dofid + 2])
@@ -1791,15 +1783,15 @@ def _transmission(
worldid, actid = wp.tid()
trntype = actuator_trntype[actid]
gear = actuator_gear[worldid, actid]
if trntype == wp.static(TrnType.JOINT.value) or trntype == wp.static(TrnType.JOINTINPARENT.value):
if trntype == TrnType.JOINT or trntype == TrnType.JOINTINPARENT:
qpos = qpos_in[worldid]
jntid = actuator_trnid[actid][0]
jnt_typ = jnt_type[jntid]
qadr = jnt_qposadr[jntid]
vadr = jnt_dofadr[jntid]
if jnt_typ == wp.static(JointType.FREE.value):
if jnt_typ == JointType.FREE:
actuator_length_out[worldid, actid] = 0.0
if trntype == wp.static(TrnType.JOINTINPARENT.value):
if trntype == TrnType.JOINTINPARENT:
quat = wp.normalize(
wp.quat(
qpos[qadr + 3],
@@ -1819,23 +1811,23 @@ def _transmission(
else:
for i in range(6):
actuator_moment_out[worldid, actid, vadr + i] = gear[i]
elif jnt_typ == wp.static(JointType.BALL.value):
elif jnt_typ == JointType.BALL:
q = wp.quat(qpos[qadr + 0], qpos[qadr + 1], qpos[qadr + 2], qpos[qadr + 3])
q = wp.normalize(q)
axis_angle = math.quat_to_vel(q)
gearaxis = wp.spatial_top(gear) # [:3]
if trntype == wp.static(TrnType.JOINTINPARENT.value):
if trntype == TrnType.JOINTINPARENT:
quat_neg = math.quat_inv(q)
gearaxis = math.rot_vec_quat(gearaxis, quat_neg)
actuator_length_out[worldid, actid] = wp.dot(axis_angle, gearaxis)
for i in range(3):
actuator_moment_out[worldid, actid, vadr + i] = gearaxis[i]
elif jnt_typ == wp.static(JointType.SLIDE.value) or jnt_typ == wp.static(JointType.HINGE.value):
elif jnt_typ == JointType.SLIDE or jnt_typ == JointType.HINGE:
actuator_length_out[worldid, actid] = qpos[qadr] * gear[0]
actuator_moment_out[worldid, actid, vadr] = gear[0]
else:
wp.printf("unrecognized joint type")
elif trntype == wp.static(TrnType.SLIDERCRANK.value):
elif trntype == TrnType.SLIDERCRANK:
# get data
trnid = actuator_trnid[actid]
id = trnid[0]
@@ -1908,7 +1900,7 @@ def _transmission(
# apply the chain rule
moment = wp.dot(dlda, jacA) + wp.dot(dldv, jac)
actuator_moment_out[worldid, actid, i] = moment * gear0
elif trntype == wp.static(TrnType.TENDON.value):
elif trntype == TrnType.TENDON:
tenid = actuator_trnid[actid][0]
gear0 = gear[0]
@@ -1916,7 +1908,7 @@ def _transmission(
# fixed
adr = tendon_adr[tenid]
if wrap_type[adr] == wp.static(WrapType.JOINT.value):
if wrap_type[adr] == WrapType.JOINT:
ten_num = tendon_num[tenid]
for i in range(ten_num):
dofadr = jnt_dofadr[wrap_objid[adr + i]]
@@ -1924,7 +1916,7 @@ def _transmission(
else: # spatial
for dofadr in range(nv):
actuator_moment_out[worldid, actid, dofadr] = ten_J_in[worldid, tenid, dofadr] * gear0
elif trntype == wp.static(TrnType.BODY.value):
elif trntype == TrnType.BODY:
# cannot compute meaningful length, set to zero
actuator_length_out[worldid, actid] = 0.0
@@ -1933,7 +1925,7 @@ def _transmission(
actuator_moment_out[worldid, actid, i] = 0.0
# moment computed by _transmission_body_moment and _transmission_body_moment_scale
elif trntype == int(TrnType.SITE.value):
elif trntype == TrnType.SITE:
trnid = actuator_trnid[actid]
siteid = trnid[0]
refid = trnid[1]
@@ -2137,7 +2129,7 @@ def _transmission_body_moment(
contact_dim = contact_dim_in[conid]
contact_efc_address = contact_efc_address_in[conid]
if contact_dim == 1 or opt_cone == int(ConeType.ELLIPTIC.value):
if contact_dim == 1 or opt_cone == ConeType.ELLIPTIC:
efc_force = 1.0
efcid0 = contact_efc_address[0]
wp.atomic_add(actuator_moment_out[worldid, actid], dofid, efc_J_in[worldid, efcid0, dofid] * efc_force)
@@ -2449,6 +2441,7 @@ def _tile_cholesky_factorize_solve(tile: TileSet):
adr: wp.array(dtype=int),
# Out:
x: wp.array2d(dtype=float),
L: wp.array3d(dtype=float),
):
worldid, nodeid = wp.tid()
TILE_SIZE = wp.static(tile.size)
@@ -2458,6 +2451,7 @@ def _tile_cholesky_factorize_solve(tile: TileSet):
y_slice = wp.tile_load(y[worldid], shape=(TILE_SIZE,), offset=(dofid,))
L_tile = wp.tile_cholesky(M_tile)
wp.tile_store(L[worldid], L_tile, offset=(dofid, dofid))
x_slice = wp.tile_cholesky_solve(L_tile, y_slice)
wp.tile_store(x[worldid], x_slice, offset=(dofid,))
@@ -2465,14 +2459,19 @@ def _tile_cholesky_factorize_solve(tile: TileSet):
def _factor_solve_i_dense(
m: Model, d: Data, M: wp.array3d(dtype=float), x: wp.array2d(dtype=float), y: wp.array2d(dtype=float)
m: Model,
d: Data,
M: wp.array3d(dtype=float),
x: wp.array2d(dtype=float),
y: wp.array2d(dtype=float),
L: wp.array3d(dtype=float),
):
for tile in m.qM_tiles:
wp.launch_tiled(
_tile_cholesky_factorize_solve(tile),
dim=(d.nworld, tile.adr.size),
inputs=[M, y, tile.adr],
outputs=[x],
outputs=[x, L],
block_dim=m.block_dim.cholesky_factorize_solve,
)
@@ -2498,7 +2497,7 @@ def factor_solve_i(m, d, M, L, D, x, y):
_factor_i_sparse(m, d, M, L, D)
_solve_LD_sparse(m, d, L, D, x, y)
else:
_factor_solve_i_dense(m, d, M, x, y)
_factor_solve_i_dense(m, d, M, x, y, L)
@wp.kernel
@@ -2914,7 +2913,7 @@ def _spatial_tendon_wrap(
tendonnum = tendon_num[i]
# process fixed tendon
if wrap_type[adr] == int(WrapType.JOINT.value):
if wrap_type[adr] == WrapType.JOINT:
continue
# process spatial tendon
@@ -2927,8 +2926,8 @@ def _spatial_tendon_wrap(
id1 = wrap_objid[adr + j + 1]
# pulley
pulley0 = type0 == int(WrapType.PULLEY.value)
if pulley0 or type1 == int(WrapType.PULLEY.value):
pulley0 = type0 == WrapType.PULLEY
if pulley0 or type1 == WrapType.PULLEY:
if pulley0:
row = wrapcount // 2
col = wrapcount % 2
@@ -2949,7 +2948,7 @@ def _spatial_tendon_wrap(
wpnt_site0 = site_xpos_in[worldid, id0]
# second object is geom: process site-geom-site
if type1 == int(WrapType.SPHERE.value) or type1 == int(WrapType.CYLINDER.value):
if type1 == WrapType.SPHERE or type1 == WrapType.CYLINDER:
wrap_geom_xpos = wrap_geom_xpos_in[worldid, wrapgeomid]
wpnt_geom0 = wp.spatial_top(wrap_geom_xpos)
wrapgeomid += 1
@@ -3024,7 +3023,7 @@ def _spatial_tendon_wrap(
# assign last site before pulley or tendon end
if adr + j + 1 < wrap_type.shape[0]:
last_before_pulley = wrap_type[adr + j + 1] == int(WrapType.PULLEY.value)
last_before_pulley = wrap_type[adr + j + 1] == WrapType.PULLEY
else:
last_before_pulley = False
+70 -67
View File
@@ -21,10 +21,10 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src import types
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import ConeType
from mujoco.mjx.third_party.mujoco_warp import DisableBit
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and MJWarp smooth calculations - mostly
# due to float precision
@@ -40,7 +40,7 @@ def _assert_eq(a, b, name):
class SmoothTest(parameterized.TestCase):
def test_kinematics(self):
"""Tests kinematics."""
_, mjd, m, d = test_util.fixture("pendula.xml")
_, mjd, m, d = test_data.fixture("pendula.xml")
for arr in (
d.xanchor,
@@ -57,7 +57,7 @@ class SmoothTest(parameterized.TestCase):
):
arr.zero_()
mjwarp.kinematics(m, d)
mjw.kinematics(m, d)
_assert_eq(d.xanchor.numpy()[0], mjd.xanchor, "xanchor")
_assert_eq(d.xaxis.numpy()[0], mjd.xaxis, "xaxis")
@@ -73,99 +73,93 @@ class SmoothTest(parameterized.TestCase):
def test_com_pos(self):
"""Tests com_pos."""
_, mjd, m, d = test_util.fixture("pendula.xml")
_, mjd, m, d = test_data.fixture("pendula.xml")
for arr in (d.subtree_com, d.cinert, d.cdof):
arr.zero_()
mjwarp.com_pos(m, d)
mjw.com_pos(m, d)
_assert_eq(d.subtree_com.numpy()[0], mjd.subtree_com, "subtree_com")
_assert_eq(d.cinert.numpy()[0], mjd.cinert, "cinert")
_assert_eq(d.cdof.numpy()[0], mjd.cdof, "cdof")
def test_camlight(self):
"""Tests camlight."""
_, mjd, m, d = test_util.fixture("pendula.xml")
_, mjd, m, d = test_data.fixture("pendula.xml")
d.cam_xpos.zero_()
d.cam_xmat.zero_()
d.light_xpos.zero_()
d.light_xdir.zero_()
mjwarp.camlight(m, d)
mjw.camlight(m, d)
_assert_eq(d.cam_xpos.numpy()[0], mjd.cam_xpos, "cam_xpos")
_assert_eq(d.cam_xmat.numpy()[0], mjd.cam_xmat.reshape((-1, 3, 3)), "cam_xmat")
_assert_eq(d.light_xpos.numpy()[0], mjd.light_xpos, "light_xpos")
_assert_eq(d.light_xdir.numpy()[0], mjd.light_xdir, "light_xdir")
@parameterized.parameters(True, False)
def test_crb(self, sparse: bool):
@parameterized.parameters(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
def test_crb(self, jacobian):
"""Tests crb."""
mjm, mjd, m, d = test_util.fixture("pendula.xml", sparse=sparse)
mjm, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.jacobian": jacobian})
d.crb.zero_()
mjwarp.crb(m, d)
mjw.crb(m, d)
_assert_eq(d.crb.numpy()[0], mjd.crb, "crb")
if sparse:
if jacobian == mujoco.mjtJacobian.mjJAC_SPARSE:
_assert_eq(d.qM.numpy()[0, 0], mjd.qM, "qM")
else:
qM = np.zeros((mjm.nv, mjm.nv))
mujoco.mj_fullM(mjm, qM, mjd.qM)
_assert_eq(d.qM.numpy()[0], qM, "qM")
@parameterized.parameters(True, False)
def test_factor_m(self, sparse: bool):
@parameterized.parameters(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
def test_factor_m(self, jacobian):
"""Tests factor_m."""
_, mjd, m, d = test_util.fixture("pendula.xml", sparse=sparse)
_, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.jacobian": jacobian})
qLD = d.qLD.numpy()[0].copy()
for arr in (d.qLD, d.qLDiagInv):
arr.zero_()
mjwarp.factor_m(m, d)
mjw.factor_m(m, d)
if sparse:
if jacobian == mujoco.mjtJacobian.mjJAC_SPARSE:
_assert_eq(d.qLD.numpy()[0, 0], mjd.qLD, "qLD (sparse)")
_assert_eq(d.qLDiagInv.numpy()[0], mjd.qLDiagInv, "qLDiagInv")
else:
_assert_eq(d.qLD.numpy()[0], qLD, "qLD (dense)")
@parameterized.parameters(True, False)
def test_solve_m(self, sparse: bool):
@parameterized.parameters(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
def test_solve_m(self, jacobian):
"""Tests solve_m."""
mjm, mjd, m, d = test_util.fixture("pendula.xml", sparse=sparse)
mjm, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.jacobian": jacobian})
qfrc_smooth = np.tile(mjd.qfrc_smooth, (1, 1))
qacc_smooth = np.zeros(
shape=(
1,
mjm.nv,
),
dtype=float,
)
qacc_smooth = np.zeros(shape=(1, mjm.nv), dtype=float)
mujoco.mj_solveM(mjm, mjd, qacc_smooth, qfrc_smooth)
d.qacc_smooth.zero_()
mjwarp.solve_m(m, d, d.qacc_smooth, d.qfrc_smooth)
mjw.solve_m(m, d, d.qacc_smooth, d.qfrc_smooth)
_assert_eq(d.qacc_smooth.numpy()[0], qacc_smooth[0], "qacc_smooth")
@parameterized.parameters(True, False)
@parameterized.parameters(0, DisableBit.GRAVITY)
def test_rne(self, gravity):
"""Tests rne."""
_, mjd, m, d = test_util.fixture("pendula.xml", gravity=gravity)
_, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.disableflags": DisableBit.CONTACT | gravity})
d.qfrc_bias.zero_()
mjwarp.rne(m, d)
mjw.rne(m, d)
_assert_eq(d.qfrc_bias.numpy()[0], mjd.qfrc_bias, "qfrc_bias")
@parameterized.parameters(True, False)
@parameterized.parameters(0, DisableBit.GRAVITY)
def test_rne_postconstraint(self, gravity):
"""Tests rne_postconstraint."""
mjm, mjd, m, d = test_util.fixture("pendula.xml", gravity=gravity)
mjm, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.disableflags": DisableBit.CONTACT | gravity})
mjd.xfrc_applied = np.random.uniform(low=-0.01, high=0.01, size=mjd.xfrc_applied.shape)
d.xfrc_applied = wp.array(np.expand_dims(mjd.xfrc_applied, axis=0), dtype=wp.spatial_vector)
@@ -175,7 +169,7 @@ class SmoothTest(parameterized.TestCase):
for arr in (d.cacc, d.cfrc_int, d.cfrc_ext):
arr.zero_()
mjwarp.rne_postconstraint(m, d)
mjw.rne_postconstraint(m, d)
_assert_eq(d.cacc.numpy()[0], mjd.cacc, "cacc")
_assert_eq(d.cfrc_int.numpy()[0], mjd.cfrc_int, "cfrc_int")
@@ -218,16 +212,16 @@ class SmoothTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
mjm, mjd, m, d = test_util.fixture(xml=_EQUALITY, kick=True, keyframe=0)
mjm, mjd, m, d = test_data.fixture(xml=_EQUALITY, qvel_noise=0.01, ctrl_noise=0.1, keyframe=0)
mujoco.mj_rnePostConstraint(mjm, mjd)
d.cfrc_ext.zero_()
mjwarp.rne_postconstraint(m, d)
mjw.rne_postconstraint(m, d)
_assert_eq(d.cfrc_ext.numpy()[0], mjd.cfrc_ext, "cfrc_ext (equality)")
mjm, mjd, m, d = test_util.fixture("constraints.xml", keyframe=1, equality=False)
mjm, mjd, m, d = test_data.fixture("constraints.xml", keyframe=1, overrides={"opt.disableflags": DisableBit.EQUALITY})
mujoco.mj_rnePostConstraint(mjm, mjd)
@@ -238,25 +232,25 @@ class SmoothTest(parameterized.TestCase):
d.ne_weld.zero_()
d.ne_jnt.zero_()
mjwarp.rne_postconstraint(m, d)
mjw.rne_postconstraint(m, d)
_assert_eq(d.cfrc_ext.numpy()[0], mjd.cfrc_ext, "cfrc_ext (contact)")
def test_com_vel(self):
"""Tests com_vel."""
_, mjd, m, d = test_util.fixture("pendula.xml")
_, mjd, m, d = test_data.fixture("pendula.xml")
for arr in (d.cvel, d.cdof_dot):
arr.zero_()
mjwarp.com_vel(m, d)
mjw.com_vel(m, d)
_assert_eq(d.cvel.numpy()[0], mjd.cvel, "cvel")
_assert_eq(d.cdof_dot.numpy()[0], mjd.cdof_dot, "cdof_dot")
@parameterized.parameters("pendula.xml", "actuation/site.xml", "actuation/slidercrank.xml")
def test_transmission(self, xml):
"""Tests transmission."""
mjm, mjd, m, d = test_util.fixture(xml)
mjm, mjd, m, d = test_data.fixture(xml)
for arr in (d.actuator_length, d.actuator_moment):
arr.zero_()
@@ -270,20 +264,20 @@ class SmoothTest(parameterized.TestCase):
mjd.moment_colind,
)
mjwarp._src.smooth.transmission(m, d)
mjw._src.smooth.transmission(m, d)
_assert_eq(d.actuator_length.numpy()[0], mjd.actuator_length, "actuator_length")
_assert_eq(d.actuator_moment.numpy()[0], actuator_moment, "actuator_moment")
@parameterized.product(keyframe=list(range(4)), cone=list(types.ConeType))
@parameterized.product(keyframe=list(range(4)), cone=list(ConeType))
def test_actuator_adhesion(self, keyframe, cone):
"""Tests adhesion actuator."""
mjm, mjd, m, d = test_util.fixture("actuation/adhesion.xml", keyframe=keyframe, cone=cone)
mjm, mjd, m, d = test_data.fixture("actuation/adhesion.xml", keyframe=keyframe, overrides={"opt.cone": cone})
d.actuator_length.zero_()
d.actuator_moment.zero_()
mjwarp._src.collision_driver.collision(m, d) # compute contact.includemargin
mjwarp._src.constraint.make_constraint(m, d) # compute contact.efc_address
mjwarp._src.smooth.transmission(m, d)
mjw._src.collision_driver.collision(m, d) # compute contact.includemargin
mjw._src.constraint.make_constraint(m, d) # compute contact.efc_address
mjw._src.smooth.transmission(m, d)
actuator_moment = np.zeros((mjm.nu, mjm.nv))
mujoco.mju_sparse2dense(actuator_moment, mjd.actuator_moment, mjd.moment_rownnz, mjd.moment_rowadr, mjd.moment_colind)
@@ -293,13 +287,13 @@ class SmoothTest(parameterized.TestCase):
def test_subtree_vel(self):
"""Tests subtree_vel."""
mjm, mjd, m, d = test_util.fixture("pendula.xml")
mjm, mjd, m, d = test_data.fixture("pendula.xml")
for arr in (d.subtree_linvel, d.subtree_angmom):
arr.zero_()
mujoco.mj_subtreeVel(mjm, mjd)
mjwarp.subtree_vel(m, d)
mjw.subtree_vel(m, d)
_assert_eq(d.subtree_linvel.numpy()[0], mjd.subtree_linvel, "subtree_linvel")
_assert_eq(d.subtree_angmom.numpy()[0], mjd.subtree_angmom, "subtree_angmom")
@@ -317,13 +311,13 @@ class SmoothTest(parameterized.TestCase):
)
def test_tendon(self, xml):
"""Tests tendon."""
mjm, mjd, m, d = test_util.fixture(xml, keyframe=0)
mjm, mjd, m, d = test_data.fixture(xml, keyframe=0)
for arr in (d.ten_length, d.ten_J, d.actuator_length, d.actuator_moment):
arr.zero_()
mjwarp.tendon(m, d)
mjwarp.transmission(m, d)
mjw.tendon(m, d)
mjw.transmission(m, d)
_assert_eq(d.ten_length.numpy()[0], mjd.ten_length, "ten_length")
_assert_eq(d.ten_J.numpy()[0], mjd.ten_J.reshape((mjm.ntendon, mjm.nv)), "ten_J")
@@ -342,9 +336,9 @@ class SmoothTest(parameterized.TestCase):
)
_assert_eq(d.actuator_moment.numpy()[0], actuator_moment, "actuator_moment")
@parameterized.parameters(True, False)
def test_factor_solve_i(self, sparse):
mjm, mjd, m, d = test_util.fixture(
@parameterized.parameters(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
def test_factor_solve_i(self, jacobian):
mjm, mjd, m, d = test_data.fixture(
xml="""
<mujoco>
<worldbody>
@@ -355,31 +349,40 @@ class SmoothTest(parameterized.TestCase):
</worldbody>
</mujoco>
""",
sparse=sparse,
overrides={"opt.jacobian": jacobian},
)
qM = np.zeros((mjm.nv, mjm.nv))
mujoco.mj_fullM(mjm, qM, mjd.qM)
d.qLD.zero_()
sparse = jacobian == mujoco.mjtJacobian.mjJAC_SPARSE
d.qLD.fill_(wp.inf)
if sparse:
d.qLDiagInv.zero_()
d.qLDiagInv.fill_(wp.inf)
res = wp.zeros((1, mjm.nv), dtype=float)
vec = wp.ones((1, mjm.nv), dtype=float)
mjwarp._src.smooth.factor_solve_i(m, d, d.qM, d.qLD, d.qLDiagInv, res, vec)
mjw._src.smooth.factor_solve_i(m, d, d.qM, d.qLD, d.qLDiagInv, res, vec)
_assert_eq(res.numpy()[0], np.linalg.solve(qM, vec.numpy()[0]), "qM \\ 1")
if sparse:
_assert_eq(d.qLD.numpy()[0].reshape(-1), mjd.qLD, "qLD")
_assert_eq(d.qLDiagInv.numpy()[0], mjd.qLDiagInv, "qLDiagInv")
else:
qLD = np.linalg.cholesky(qM)
_assert_eq(d.qLD.numpy()[0], qLD, "qLD")
def test_tendon_armature(self):
mjm, mjd, m, d = test_util.fixture("tendon/armature.xml", keyframe=0)
mjm, mjd, m, d = test_data.fixture("tendon/armature.xml", keyframe=0)
# qM
d.qM.zero_()
mjwarp._src.smooth.crb(m, d)
mjwarp._src.smooth.tendon_armature(m, d)
mjw._src.smooth.crb(m, d)
mjw._src.smooth.tendon_armature(m, d)
qM = np.zeros((mjm.nv, mjm.nv))
mujoco.mj_fullM(mjm, qM, mjd.qM)
@@ -388,8 +391,8 @@ class SmoothTest(parameterized.TestCase):
# qfrc_bias
d.qfrc_bias.zero_()
mjwarp._src.smooth.rne(m, d)
mjwarp._src.smooth.tendon_bias(m, d, d.qfrc_bias)
mjw._src.smooth.rne(m, d)
mjw._src.smooth.tendon_bias(m, d, d.qfrc_bias)
_assert_eq(d.qfrc_bias.numpy()[0], mjd.qfrc_bias, "qfrc_bias")
+20 -20
View File
@@ -177,7 +177,7 @@ def _eval_init(
lo += _eval_pt(quad_f, alpha)
for efcid in range(nef_clip, nefc_clip):
if type_in[efcid] == int(types.ConstraintType.CONTACT_ELLIPTIC.value):
if type_in[efcid] == types.ConstraintType.CONTACT_ELLIPTIC:
conid = id_in[efcid]
efcid0 = contact_efc_address_in[conid, 0]
@@ -255,7 +255,7 @@ def _eval(
mid += _eval_pt(quad_f, mid_alpha)
for efcid in range(nef_clip, nefc_clip):
if type_in[efcid] == int(types.ConstraintType.CONTACT_ELLIPTIC.value):
if type_in[efcid] == types.ConstraintType.CONTACT_ELLIPTIC:
conid = id_in[efcid]
efcid0 = contact_efc_address_in[conid, 0]
@@ -557,7 +557,7 @@ def linesearch_parallel_fused(
out += _eval_cost(quad, alpha)
# limit and contact
elif efc_type_in[worldid, efcid] == int(types.ConstraintType.CONTACT_ELLIPTIC.value):
elif efc_type_in[worldid, efcid] == types.ConstraintType.CONTACT_ELLIPTIC:
# extract contact info
conid = efc_id_in[worldid, efcid]
@@ -801,7 +801,7 @@ def linesearch_prepare_quad(
quad = wp.vec3(0.5 * Jaref * Jaref * efc_D, jv * Jaref * efc_D, 0.5 * jv * jv * efc_D)
# elliptic cone: extra processing
if efc_type_in[worldid, efcid] == int(types.ConstraintType.CONTACT_ELLIPTIC.value):
if efc_type_in[worldid, efcid] == types.ConstraintType.CONTACT_ELLIPTIC:
# extract contact info
conid = efc_id_in[worldid, efcid]
@@ -1099,7 +1099,7 @@ def update_constraint_efc(
if efcid < ne:
# equality
efc_force_out[worldid, efcid] = -efc_D * Jaref
efc_state_out[worldid, efcid] = int(types.ConstraintState.QUADRATIC.value)
efc_state_out[worldid, efcid] = types.ConstraintState.QUADRATIC
wp.atomic_add(efc_cost_out, worldid, 0.5 * efc_D * Jaref * Jaref)
elif efcid < ne + nf:
# friction
@@ -1107,24 +1107,24 @@ def update_constraint_efc(
rf = math.safe_div(f, efc_D)
if Jaref <= -rf:
efc_force_out[worldid, efcid] = f
efc_state_out[worldid, efcid] = int(types.ConstraintState.LINEARNEG.value)
efc_state_out[worldid, efcid] = types.ConstraintState.LINEARNEG
wp.atomic_add(efc_cost_out, worldid, -f * (0.5 * rf + Jaref))
elif Jaref >= rf:
efc_force_out[worldid, efcid] = -f
efc_state_out[worldid, efcid] = int(types.ConstraintState.LINEARPOS.value)
efc_state_out[worldid, efcid] = types.ConstraintState.LINEARPOS
wp.atomic_add(efc_cost_out, worldid, -f * (0.5 * rf - Jaref))
else:
efc_force_out[worldid, efcid] = -efc_D * Jaref
efc_state_out[worldid, efcid] = int(types.ConstraintState.QUADRATIC.value)
efc_state_out[worldid, efcid] = types.ConstraintState.QUADRATIC
wp.atomic_add(efc_cost_out, worldid, 0.5 * efc_D * Jaref * Jaref)
elif efc_type_in[worldid, efcid] != int(types.ConstraintType.CONTACT_ELLIPTIC.value):
elif efc_type_in[worldid, efcid] != types.ConstraintType.CONTACT_ELLIPTIC:
# limit, frictionless contact, pyramidal friction cone contact
if Jaref >= 0.0:
efc_force_out[worldid, efcid] = 0.0
efc_state_out[worldid, efcid] = int(types.ConstraintState.SATISFIED.value)
efc_state_out[worldid, efcid] = types.ConstraintState.SATISFIED
else:
efc_force_out[worldid, efcid] = -efc_D * Jaref
efc_state_out[worldid, efcid] = int(types.ConstraintState.QUADRATIC.value)
efc_state_out[worldid, efcid] = types.ConstraintState.QUADRATIC
wp.atomic_add(efc_cost_out, worldid, 0.5 * efc_D * Jaref * Jaref)
else: # elliptic friction cone contact
conid = efc_id_in[worldid, efcid]
@@ -1162,11 +1162,11 @@ def update_constraint_efc(
# top zone
if (N >= mu * T) or ((T <= 0.0) and (N >= 0.0)):
efc_force_out[worldid, efcid] = 0.0
efc_state_out[worldid, efcid] = int(types.ConstraintState.SATISFIED.value)
efc_state_out[worldid, efcid] = types.ConstraintState.SATISFIED
# bottom zone
elif (mu * N + T <= 0.0) or ((T <= 0.0) and (N < 0.0)):
efc_force_out[worldid, efcid] = -efc_D * Jaref
efc_state_out[worldid, efcid] = int(types.ConstraintState.QUADRATIC.value)
efc_state_out[worldid, efcid] = types.ConstraintState.QUADRATIC
wp.atomic_add(efc_cost_out, worldid, 0.5 * efc_D * Jaref * Jaref)
# middle zone
else:
@@ -1181,7 +1181,7 @@ def update_constraint_efc(
else:
efc_force_out[worldid, efcid] = -math.safe_div(force, T) * ufrictionj
efc_state_out[worldid, efcid] = int(types.ConstraintState.CONE.value)
efc_state_out[worldid, efcid] = types.ConstraintState.CONE
@wp.kernel
@@ -1395,7 +1395,7 @@ def update_gradient_JTDAJ_sparse(
efc_Jj = efc_J_in[worldid, 0, dofj]
sum_h = float(0.0)
for efcid in range(min(njmax_in, nefc) - 1):
if efc_state == int(types.ConstraintState.QUADRATIC.value) and efc_D != 0.0:
if efc_state == types.ConstraintState.QUADRATIC and efc_D != 0.0:
sum_h += efc_Ji * efc_Jj * efc_D
jj = efcid + 1
@@ -1405,7 +1405,7 @@ def update_gradient_JTDAJ_sparse(
efc_state = efc_state_in[worldid, jj]
# Adding the contribution from the last constraint row
if efc_state == int(types.ConstraintState.QUADRATIC.value) and efc_D != 0.0:
if efc_state == types.ConstraintState.QUADRATIC and efc_D != 0.0:
sum_h += efc_Ji * efc_Jj * efc_D
efc_h_out[worldid, dofi, dofj] = sum_h
@@ -1443,7 +1443,7 @@ def update_gradient_JTDAJ_dense(
efc_Jj = efc_J_in[worldid, 0, dofj]
sum_h = float(0.0)
for efcid in range(min(njmax_in, nefc) - 1):
if efc_state == int(types.ConstraintState.QUADRATIC.value) and efc_D != 0.0:
if efc_state == types.ConstraintState.QUADRATIC and efc_D != 0.0:
sum_h += efc_Ji * efc_Jj * efc_D
jj = efcid + 1
@@ -1453,7 +1453,7 @@ def update_gradient_JTDAJ_dense(
efc_state = efc_state_in[worldid, jj]
# Adding the contribution from the last constraint row
if efc_state == int(types.ConstraintState.QUADRATIC.value) and efc_D != 0.0:
if efc_state == types.ConstraintState.QUADRATIC and efc_D != 0.0:
sum_h += efc_Ji * efc_Jj * efc_D
qM = qM_in[worldid, dofi, dofj]
@@ -1512,7 +1512,7 @@ def update_gradient_JTCJ(
continue
efcid0 = contact_efc_address_in[conid, 0]
if efc_state_in[worldid, efcid0] != int(types.ConstraintState.CONE.value):
if efc_state_in[worldid, efcid0] != types.ConstraintState.CONE:
continue
fri = contact_friction_in[conid]
@@ -1867,7 +1867,7 @@ def solve_search_update(
search = -1.0 * efc_Mgrad_in[worldid, dofid]
if opt_solver == wp.static(types.SolverType.CG.value):
if opt_solver == types.SolverType.CG:
search += efc_beta_in[worldid] * efc_search_in[worldid, dofid]
efc_search_out[worldid, dofid] = search
+60 -87
View File
@@ -21,13 +21,13 @@ import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import ConeType
from mujoco.mjx.third_party.mujoco_warp import SolverType
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src import solver
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.math import safe_div
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType
from mujoco.mjx.third_party.mujoco_warp._src.types import SolverType
# tolerance for difference between MuJoCo and MJWarp solver calculations - mostly
# due to float precision
@@ -45,12 +45,10 @@ class SolverTest(parameterized.TestCase):
def test_constraint_update(self, cone, solver_):
"""Tests _update_constraint function is correct."""
for keyframe in range(3):
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
"constraints.xml",
keyframe=keyframe,
cone=cone,
solver=solver_,
iterations=0,
overrides={"opt.solver": solver_, "opt.cone": cone, "opt.iterations": 0},
)
def cost(qacc):
@@ -65,7 +63,7 @@ class SolverTest(parameterized.TestCase):
# solve with 0 iterations just initializes constraints and costs and then exits
d.efc.force.zero_()
d.qfrc_constraint.zero_()
mjwarp.solve(m, d)
mjw.solve(m, d)
# Get the ordering indices based on efc_force, efc_state for MJWarp
nefc = d.nefc.numpy()[0]
@@ -96,16 +94,14 @@ class SolverTest(parameterized.TestCase):
"""Test linesearch initialization."""
for keyframe in range(3):
# TODO(team): Add the case of elliptic cone friction
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
"constraints.xml",
keyframe=keyframe,
cone=ConeType.PYRAMIDAL,
iterations=0,
ls_iterations=0,
overrides={"opt.iterations": 0, "opt.ls_iterations": 0},
)
# One step to obtain more non-zeros results
mjwarp.step(m, d)
mjw.step(m, d)
# Calculate target values
efc_search_np = d.efc.search.numpy()[0]
@@ -151,25 +147,19 @@ class SolverTest(parameterized.TestCase):
_assert_eq(efc_quad_gauss, target_quad_gauss, "quad_gauss")
_assert_eq(efc_quad[:nefc], target_quad[:nefc], "quad")
@parameterized.parameters(
(ConeType.PYRAMIDAL, False),
(ConeType.ELLIPTIC, False),
(ConeType.PYRAMIDAL, True),
(ConeType.ELLIPTIC, True),
@parameterized.product(
cone=(ConeType.PYRAMIDAL, ConeType.ELLIPTIC), jacobian=(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
)
def test_update_gradient_CG(self, cone, sparse):
def test_update_gradient_CG(self, cone, jacobian):
"""Test _update_gradient function is correct for the CG solver."""
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
"humanoid/humanoid.xml",
cone=cone,
solver=SolverType.CG,
sparse=sparse,
iterations=0,
keyframe=0,
overrides={"opt.cone": cone, "opt.solver": SolverType.CG, "opt.jacobian": jacobian, "opt.iterations": 0},
)
# Solve with 0 iterations just initializes and exit
mjwarp.solve(m, d)
mjw.solve(m, d)
# Calculate Mgrad with Mujoco C
mj_Mgrad = np.zeros(shape=(1, mjm.nv), dtype=float)
@@ -182,22 +172,19 @@ class SolverTest(parameterized.TestCase):
@parameterized.parameters(ConeType.PYRAMIDAL, ConeType.ELLIPTIC)
def test_parallel_linesearch(self, cone):
"""Test that iterative and parallel linesearch leads to equivalent results."""
_, _, m, d = test_util.fixture(
_, _, m, d = test_data.fixture(
"humanoid/humanoid.xml",
cone=cone,
ls_parallel=False,
iterations=50,
ls_iterations=50,
qpos_noise=0.01,
overrides={"opt.cone": cone, "opt.iterations": 50, "opt.ls_iterations": 50},
)
# One step to obtain more non-zeros results
mjwarp.step(m, d)
mjw.step(m, d)
# Preparing for linesearch
m.opt.iterations = 0
mjwarp.fwd_velocity(m, d)
mjwarp.fwd_acceleration(m, d, factorize=True)
mjw.fwd_velocity(m, d)
mjw.fwd_acceleration(m, d, factorize=True)
solver.solve(m, d)
# Storing some initial values
@@ -233,25 +220,27 @@ class SolverTest(parameterized.TestCase):
self.assertLessEqual(abs(alpha_iterative - alpha_parallel_50), abs(alpha_iterative - alpha_parallel_10))
@parameterized.parameters(
(ConeType.PYRAMIDAL, SolverType.CG, 10, 5, False, False),
(ConeType.ELLIPTIC, SolverType.CG, 10, 5, False, False),
(ConeType.PYRAMIDAL, SolverType.NEWTON, 5, 10, False, False),
(ConeType.ELLIPTIC, SolverType.NEWTON, 5, 10, False, False),
(ConeType.PYRAMIDAL, SolverType.NEWTON, 5, 64, True, True),
(ConeType.ELLIPTIC, SolverType.NEWTON, 5, 64, True, True),
(ConeType.PYRAMIDAL, SolverType.CG, 10, 5, mujoco.mjtJacobian.mjJAC_DENSE, False),
(ConeType.ELLIPTIC, SolverType.CG, 10, 5, mujoco.mjtJacobian.mjJAC_DENSE, False),
(ConeType.PYRAMIDAL, SolverType.NEWTON, 5, 10, mujoco.mjtJacobian.mjJAC_DENSE, False),
(ConeType.ELLIPTIC, SolverType.NEWTON, 5, 10, mujoco.mjtJacobian.mjJAC_DENSE, False),
(ConeType.PYRAMIDAL, SolverType.NEWTON, 5, 64, mujoco.mjtJacobian.mjJAC_SPARSE, True),
(ConeType.ELLIPTIC, SolverType.NEWTON, 5, 64, mujoco.mjtJacobian.mjJAC_SPARSE, True),
)
def test_solve(self, cone, solver_, iterations, ls_iterations, sparse, ls_parallel):
def test_solve(self, cone, solver_, iterations, ls_iterations, jacobian, ls_parallel):
"""Tests solve."""
for keyframe in range(3):
mjm, mjd, m, d = test_util.fixture(
mjm, mjd, m, d = test_data.fixture(
"constraints.xml",
keyframe=keyframe,
sparse=sparse,
cone=cone,
solver=solver_,
iterations=iterations,
ls_iterations=ls_iterations,
ls_parallel=ls_parallel,
overrides={
"opt.jacobian": jacobian,
"opt.cone": cone,
"opt.solver": solver_,
"opt.iterations": iterations,
"opt.ls_iterations": ls_iterations,
"opt.ls_parallel": ls_parallel,
},
)
mujoco.mj_forward(mjm, mjd)
@@ -261,8 +250,8 @@ class SolverTest(parameterized.TestCase):
d.efc.force.zero_()
if solver_ == mujoco.mjtSolver.mjSOL_CG:
mjwarp.factor_m(m, d)
mjwarp.solve(m, d)
mjw.factor_m(m, d)
mjw.solve(m, d)
def cost(qacc):
jaref = np.zeros(mjd.nefc, dtype=float)
@@ -287,40 +276,28 @@ class SolverTest(parameterized.TestCase):
def test_solve_batch(self, cone, solver_, iterations, ls_iterations):
"""Tests solve (batch)."""
mjm0, mjd0, _, _ = test_util.fixture(
mjm0, mjd0, _, _ = test_data.fixture(
"humanoid/humanoid.xml",
keyframe=0,
sparse=False,
cone=cone,
solver=solver_,
iterations=iterations,
ls_iterations=ls_iterations,
overrides={"opt.cone": cone, "opt.solver": solver_, "opt.iterations": iterations, "opt.ls_iterations": ls_iterations},
)
qacc_warmstart0 = mjd0.qacc_warmstart.copy()
mujoco.mj_forward(mjm0, mjd0)
mjd0.qacc_warmstart = qacc_warmstart0
mjm1, mjd1, _, _ = test_util.fixture(
mjm1, mjd1, _, _ = test_data.fixture(
"humanoid/humanoid.xml",
keyframe=2,
sparse=False,
cone=cone,
solver=solver_,
iterations=iterations,
ls_iterations=ls_iterations,
overrides={"opt.cone": cone, "opt.solver": solver_, "opt.iterations": iterations, "opt.ls_iterations": ls_iterations},
)
qacc_warmstart1 = mjd1.qacc_warmstart.copy()
mujoco.mj_forward(mjm1, mjd1)
mjd1.qacc_warmstart = qacc_warmstart1
mjm2, mjd2, _, _ = test_util.fixture(
mjm2, mjd2, _, _ = test_data.fixture(
"humanoid/humanoid.xml",
keyframe=1,
sparse=False,
cone=cone,
solver=solver_,
iterations=iterations,
ls_iterations=ls_iterations,
overrides={"opt.cone": cone, "opt.solver": solver_, "opt.iterations": iterations, "opt.ls_iterations": ls_iterations},
)
qacc_warmstart2 = mjd2.qacc_warmstart.copy()
mujoco.mj_forward(mjm2, mjd2)
@@ -329,15 +306,11 @@ class SolverTest(parameterized.TestCase):
nefc_active = mjd0.nefc + mjd1.nefc + mjd2.nefc
ne_active = mjd0.ne + mjd1.ne + mjd2.ne
mjm, mjd, m, _ = test_util.fixture(
mjm, mjd, m, _ = test_data.fixture(
"humanoid/humanoid.xml",
sparse=False,
cone=cone,
solver=solver_,
iterations=iterations,
ls_iterations=ls_iterations,
overrides={"opt.cone": cone, "opt.solver": solver_, "opt.iterations": iterations, "opt.ls_iterations": ls_iterations},
)
d = mjwarp.put_data(mjm, mjd, nworld=3, njmax=2 * nefc_active)
d = mjw.put_data(mjm, mjd, nworld=3, njmax=2 * nefc_active)
d.nefc = wp.array([nefc_active, nefc_active, nefc_active], dtype=wp.int32, ndim=1)
d.ne = wp.array([ne_active, ne_active, ne_active], dtype=wp.int32, ndim=1)
@@ -417,19 +390,19 @@ class SolverTest(parameterized.TestCase):
d.efc.aref = wp.from_numpy(efc_aref_fill, dtype=wp.float32)
if solver_ == SolverType.CG:
m0 = mjwarp.put_model(mjm0)
d0 = mjwarp.put_data(mjm0, mjd0)
mjwarp.factor_m(m0, d0)
m0 = mjw.put_model(mjm0)
d0 = mjw.put_data(mjm0, mjd0)
mjw.factor_m(m0, d0)
qLD0 = d0.qLD.numpy()
m1 = mjwarp.put_model(mjm1)
d1 = mjwarp.put_data(mjm1, mjd1)
mjwarp.factor_m(m1, d1)
m1 = mjw.put_model(mjm1)
d1 = mjw.put_data(mjm1, mjd1)
mjw.factor_m(m1, d1)
qLD1 = d1.qLD.numpy()
m2 = mjwarp.put_model(mjm2)
d2 = mjwarp.put_data(mjm2, mjd2)
mjwarp.factor_m(m2, d2)
m2 = mjw.put_model(mjm2)
d2 = mjw.put_data(mjm2, mjd2)
mjw.factor_m(m2, d2)
qLD2 = d2.qLD.numpy()
qLD = np.vstack([qLD0, qLD1, qLD2])
@@ -492,8 +465,8 @@ class SolverTest(parameterized.TestCase):
def test_frictionloss(self):
"""Tests solver with frictionloss."""
for keyframe in range(3):
_, mjd, m, d = test_util.fixture("constraints.xml", keyframe=keyframe)
mjwarp.solve(m, d)
_, mjd, m, d = test_data.fixture("constraints.xml", keyframe=keyframe)
mjw.solve(m, d)
_assert_eq(d.nf.numpy()[0], mjd.nf, "nf")
_assert_eq(d.qacc.numpy()[0], mjd.qacc, "qacc")
+4 -2
View File
@@ -17,6 +17,7 @@ from typing import Tuple
import warp as wp
from mujoco.mjx.third_party.mujoco_warp._src.collision_primitive import Geom
from mujoco.mjx.third_party.mujoco_warp._src.math import motion_cross
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
@@ -24,6 +25,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import JointType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import TileSet
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.types import vec6
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
@@ -311,7 +313,7 @@ def contact_force_fn(
efc_address = contact_efc_address_in[contact_id, 0]
if contact_id >= 0 and contact_id <= ncon_in[0] and efc_address >= 0:
if opt_cone == int(ConeType.PYRAMIDAL.value):
if opt_cone == ConeType.PYRAMIDAL:
force = _decode_pyramid(
njmax_in,
efc_force_in[worldid],
@@ -511,7 +513,7 @@ def jac_dot(
jnttype = jnt_type[dofjntid]
jntdofadr = jnt_dofadr[dofjntid]
if (jnttype == int(JointType.BALL.value)) or ((jnttype == int(JointType.FREE.value)) and dofid >= jntdofadr + 3):
if (jnttype == JointType.BALL) or ((jnttype == JointType.FREE) and dofid >= jntdofadr + 3):
# compute cdof_dot for quaternion (use current body cvel)
cvel = cvel_in[worldid, dof_bodyid[dofid]]
cdof_dot = motion_cross(cvel, cdof)
@@ -22,9 +22,8 @@ from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjwarp
from mujoco.mjx.third_party.mujoco_warp._src import test_util
from mujoco.mjx.third_party.mujoco_warp._src.types import ConeType
from mujoco.mjx.third_party.mujoco_warp import ConeType
from mujoco.mjx.third_party.mujoco_warp import test_data
# tolerance for difference between MuJoCo and MJWarp support calculations - mostly
# due to float precision
@@ -38,10 +37,10 @@ def _assert_eq(a, b, name):
class SupportTest(parameterized.TestCase):
@parameterized.parameters(True, False)
def test_mul_m(self, sparse):
@parameterized.parameters(mujoco.mjtJacobian.mjJAC_SPARSE, mujoco.mjtJacobian.mjJAC_DENSE)
def test_mul_m(self, jacobian):
"""Tests mul_m."""
mjm, mjd, m, d = test_util.fixture("pendula.xml", sparse=sparse)
mjm, mjd, m, d = test_data.fixture("pendula.xml", overrides={"opt.jacobian": jacobian})
mj_res = np.zeros(mjm.nv)
mj_vec = np.random.uniform(low=-1.0, high=1.0, size=mjm.nv)
@@ -52,11 +51,11 @@ class SupportTest(parameterized.TestCase):
skip = wp.zeros((d.nworld), dtype=bool)
mjwarp.mul_m(m, d, res, vec, skip)
_assert_eq(res.numpy()[0], mj_res, f"mul_m ({'sparse' if sparse else 'dense'})")
_assert_eq(res.numpy()[0], mj_res, f"mul_m ({jacobian})")
def test_xfrc_accumulated(self):
"""Tests that xfrc_accumulate output matches mj_xfrcAccumulate."""
mjm, mjd, m, d = test_util.fixture("pendula.xml")
mjm, mjd, m, d = test_data.fixture("pendula.xml")
xfrc = np.random.randn(*d.xfrc_applied.numpy().shape)
d.xfrc_applied = wp.from_numpy(xfrc, dtype=wp.spatial_vector)
qfrc = wp.zeros((1, mjm.nv), dtype=wp.float32)
@@ -101,7 +100,7 @@ class SupportTest(parameterized.TestCase):
</keyframe>
</mujoco>
"""
mjm, mjd, m, d = test_util.fixture(xml=_CONTACT, cone=cone, keyframe=0)
mjm, mjd, m, d = test_data.fixture(xml=_CONTACT, keyframe=0, overrides={"opt.cone": cone})
mj_force = np.zeros(6, dtype=float)
mujoco.mj_contactForce(mjm, mjd, 0, mj_force)
+23 -13
View File
@@ -24,6 +24,10 @@ MJ_MINIMP = mujoco.mjMINIMP # minimum constraint impedance
MJ_MAXIMP = mujoco.mjMAXIMP # maximum constraint impedance
MJ_MAXCONPAIR = mujoco.mjMAXCONPAIR
MJ_MINMU = mujoco.mjMINMU # minimum friction
# maximum size (by number of edges) of an horizon in EPA algorithm
MJ_MAX_EPAHORIZON = 12
# maximum average number of trianglarfaces EPA can insert at each iteration
MJ_MAX_EPAFACES = 5
# TODO(team): add check that all wp.launch_tiled 'block_dim' settings are configurable
@@ -384,6 +388,10 @@ class SensorType(enum.IntEnum):
FRAMEZAXIS: frame z-axis
FRAMEQUAT: frame orientation, represented as quaternion
SUBTREECOM: subtree center of mass
GEOMDIST: signed distance between two geoms
GEOMNORMAL: normal direction between two geoms
GEOMFROMTO: segment between two geoms
INSIDESITE: 1 if object is inside site, 0 otherwise
E_POTENTIAL: potential energy
E_KINETIC: kinetic energy
CLOCK: simulation time
@@ -429,6 +437,10 @@ class SensorType(enum.IntEnum):
FRAMEZAXIS = mujoco.mjtSensor.mjSENS_FRAMEZAXIS
FRAMEQUAT = mujoco.mjtSensor.mjSENS_FRAMEQUAT
SUBTREECOM = mujoco.mjtSensor.mjSENS_SUBTREECOM
GEOMDIST = mujoco.mjtSensor.mjSENS_GEOMDIST
GEOMNORMAL = mujoco.mjtSensor.mjSENS_GEOMNORMAL
GEOMFROMTO = mujoco.mjtSensor.mjSENS_GEOMFROMTO
INSIDESITE = mujoco.mjtSensor.mjSENS_INSIDESITE
E_POTENTIAL = mujoco.mjtSensor.mjSENS_E_POTENTIAL
E_KINETIC = mujoco.mjtSensor.mjSENS_E_KINETIC
CLOCK = mujoco.mjtSensor.mjSENS_CLOCK
@@ -553,7 +565,7 @@ class Option:
impratio: ratio of friction-to-normal contact impedance
tolerance: main solver tolerance
ls_tolerance: CG/Newton linesearch tolerance
ccd_tolerance: convex collision solver tolerance
ccd_tolerance: convex collision detection tolerance
gravity: gravitational acceleration
magnetic: global magnetic flux
integrator: integration mode (IntegratorType)
@@ -564,8 +576,7 @@ class Option:
disableflags: bit flags for disabling standard features
enableflags: bit flags for enabling optional features
is_sparse: whether to use sparse representations
gjk_iterations: number of Gjk iterations in the convex narrowphase
epa_iterations: number of Epa iterations in the convex narrowphase
ccd_iterations: number of iterations in convex collision detection
ls_parallel: evaluate engine solver step sizes in parallel
ls_parallel_min_step: minimum step size for solver linesearch
wind: wind (for lift, drag, and viscosity)
@@ -600,8 +611,7 @@ class Option:
disableflags: int
enableflags: int
is_sparse: bool
gjk_iterations: int # warp only
epa_iterations: int # warp only
ccd_iterations: int
ls_parallel: bool # warp only
ls_parallel_min_step: float # warp only
wind: wp.array(dtype=wp.vec3)
@@ -915,7 +925,6 @@ class Model:
eq_ten_adr: eq_* addresses of type `TENDON` (<=neq,)
actuator_moment_tiles_nv: tiling configuration
actuator_moment_tiles_nu: tiling configuration
actuator_affine_bias_gain: affine bias/gain present
actuator_trntype: transmission type (TrnType) (nu,)
actuator_dyntype: dynamics type (DynType) (nu,)
actuator_gaintype: gain type (GainType) (nu,)
@@ -1007,6 +1016,7 @@ class Model:
rangefinder_sensor_adr: map sensor id to rangefinder id (<=nsensor,)
(excluding touch sensors)
(excluding limit force sensors)
collision_sensor_adr: map sensor id to collision id (nsensor,)
sensor_touch_adr: addresses for touch sensors (<=nsensor,)
sensor_limitfrc_adr: address for limit force sensors (<=nsensor,)
sensor_e_potential: evaluate energy_pos
@@ -1239,7 +1249,6 @@ class Model:
eq_ten_adr: wp.array(dtype=int)
actuator_moment_tiles_nv: tuple[TileSet, ...]
actuator_moment_tiles_nu: tuple[TileSet, ...]
actuator_affine_bias_gain: bool # warp only
actuator_trntype: wp.array(dtype=int)
actuator_dyntype: wp.array(dtype=int)
actuator_gaintype: wp.array(dtype=int)
@@ -1325,6 +1334,7 @@ class Model:
sensor_acc_adr: wp.array(dtype=int) # warp only
sensor_rangefinder_adr: wp.array(dtype=int) # warp only
rangefinder_sensor_adr: wp.array(dtype=int) # warp only
collision_sensor_adr: wp.array(dtype=int) # warp only
sensor_touch_adr: wp.array(dtype=int) # warp only
sensor_limitfrc_adr: wp.array(dtype=int) # warp only
sensor_e_potential: bool # warp only
@@ -1496,12 +1506,12 @@ class Data:
epa_vert2: vertices in EPA polytope in geom 2 space (nconmax, 5 + CCDiter)
epa_vert_index1: vertex indices in EPA polytope for geom 1 (nconmax, 5 + CCDiter)
epa_vert_index2: vertex indices in EPA polytope for geom 2 (nconmax, 5 + CCDiter)
epa_face: faces of polytope represented by three indices (nconmax, 6 + 6 * CCDiter)
epa_pr: projection of origin on polytope faces (nconmax, 6 + 6 * CCDiter)
epa_norm2: epa_pr * epa_pr (nconmax, 6 + 6 * CCDiter)
epa_index: index of face in polytope map (nconmax, 6 + 6 * CCDiter)
epa_map: status of faces in polytope (nconmax, 6 + 6 * CCDiter)
epa_horizon: index pair (i j) of edges on horizon (nconmax, 3 * 2 * CCDiter)
epa_face: faces of polytope represented by three indices (nconmax, 6 + 5 * CCDiter)
epa_pr: projection of origin on polytope faces (nconmax, 6 + 5 * CCDiter)
epa_norm2: epa_pr * epa_pr (nconmax, 6 + 5 * CCDiter)
epa_index: index of face in polytope map (nconmax, 6 + 5 * CCDiter)
epa_map: status of faces in polytope (nconmax, 6 + 5 * CCDiter)
epa_horizon: index pair (i j) of edges on horizon (nconmax, 2 * 12)
multiccd_polygon: clipped contact surface (nconmax, 2 * max_npolygon)
multiccd_clipped: clipped contact surface (intermediate) (nconmax, 2 * max_npolygon)
multiccd_pnormal: plane normal of clipping polygon (nconmax, max_npolygon)
@@ -0,0 +1,62 @@
# Copyright 2025 The Newton Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Unrolls trajectories within a scene and check for some coarse expected final state.
These tests are meant to catch subtle numerical / physics stability regressions. MuJoCo has many
complex algorithms that interact in surprising ways. Some physics bugs only arise over long
horizons of hundreds or thousands of physics steps. These tests ought to catch some of those
regressions.
"""
import mujoco
import numpy as np
import warp as wp
from absl.testing import absltest
from absl.testing import parameterized
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp import ConeType
from mujoco.mjx.third_party.mujoco_warp import test_data
from mujoco.mjx.third_party.mujoco_warp._src.io import find_keys
from mujoco.mjx.third_party.mujoco_warp._src.io import make_trajectory
class UnrollTest(parameterized.TestCase):
@absltest.skipIf(not wp.get_device().is_cuda, "Skipping test that requires GPU.")
@parameterized.parameters(ConeType.PYRAMIDAL, ConeType.ELLIPTIC)
def test_aloha_lifts_pot(self, cone):
"""Aloha lifts a pot into the air."""
mjm, _, m, d = test_data.fixture("aloha_pot/scene.xml", keyframe="lift_pot0", overrides={"opt.cone": cone})
with wp.ScopedCapture() as capture:
mjw.step(m, d)
for ctrl in make_trajectory(mjm, find_keys(mjm, "lift_pot")):
wp.copy(d.ctrl, wp.array([ctrl.astype(np.float32)]))
wp.capture_launch(capture.graph)
# pot should be up in the air, lid should be open above it
pot = mujoco.mj_name2id(mjm, mujoco.mjtObj.mjOBJ_BODY, "partnet_100015")
lid = mujoco.mj_name2id(mjm, mujoco.mjtObj.mjOBJ_BODY, "partnet_100015/link_0")
self.assertGreater(d.xpos.numpy()[0, pot, 2], 0.069)
self.assertGreater(d.xpos.numpy()[0, lid, 2], 0.16)
if __name__ == "__main__":
wp.init()
absltest.main()
+9 -9
View File
@@ -342,7 +342,7 @@ def wrap(
length of circular wrap else -1.0 if no wrap, pair of 3D wrap points
"""
# check object type
if geomtype != int(WrapType.SPHERE.value) and geomtype != int(WrapType.CYLINDER.value):
if geomtype != WrapType.SPHERE and geomtype != WrapType.CYLINDER:
return wp.inf, wp.vec3(wp.inf), wp.vec3(wp.inf)
# map sites to wrap object's local frame
@@ -355,7 +355,7 @@ def wrap(
return -1.0, wp.vec3(wp.inf), wp.vec3(wp.inf)
# construct 2D frame for circle wrap
if geomtype == int(WrapType.SPHERE.value):
if geomtype == WrapType.SPHERE:
# 1st axis = p0
axis0, _ = math.normalize_with_norm(p0)
@@ -432,7 +432,7 @@ def wrap(
res1 = axis0 * pnt1[0] + axis1 * pnt1[1]
# cylinder: correct along z
if geomtype == int(WrapType.CYLINDER.value):
if geomtype == WrapType.CYLINDER:
# set vertical coordinates
L0 = wp.sqrt((p0[0] - res0[0]) * (p0[0] - res0[0]) + (p0[1] - res0[1]) * (p0[1] - res0[1]))
L1 = wp.sqrt((p1[0] - res1[0]) * (p1[0] - res1[0]) + (p1[1] - res1[1]) * (p1[1] - res1[1]))
@@ -611,27 +611,27 @@ def inside_geom(pos: wp.vec3, mat: wp.mat33, size: wp.vec3, geomtype: int, point
vec = point - pos
# quick return for spheres, frame rotation not required
if geomtype == int(GeomType.SPHERE.value):
if geomtype == GeomType.SPHERE:
return wp.dot(vec, vec) < size[0] * size[0]
# rotate into local frame
plocal = wp.transpose(mat) @ vec
# handle other geom types
if geomtype == int(GeomType.CAPSULE.value):
if geomtype == GeomType.CAPSULE:
z = plocal[2]
z_clamped = wp.clamp(z, -size[1], size[1])
z_dif = z - z_clamped
z_dist_sq = z_dif * z_dif
return plocal[0] * plocal[0] + plocal[1] * plocal[1] + z_dist_sq < size[0] * size[0]
elif geomtype == int(GeomType.ELLIPSOID.value):
elif geomtype == GeomType.ELLIPSOID:
plocalsize = wp.cw_div(plocal, size)
return wp.dot(plocalsize, plocalsize) < 1.0
elif geomtype == int(GeomType.CYLINDER.value):
elif geomtype == GeomType.CYLINDER:
return (wp.abs(plocal[2]) < size[1]) and (plocal[0] * plocal[0] + plocal[1] * plocal[1] < size[0] * size[0])
elif geomtype == int(GeomType.BOX.value):
elif geomtype == GeomType.BOX:
return wp.abs(plocal[0]) < size[0] and wp.abs(plocal[1]) < size[1] and wp.abs(plocal[2]) < size[2]
elif geomtype == int(GeomType.PLANE.value):
elif geomtype == GeomType.PLANE:
return plocal[2] < 0.0
return False
@@ -0,0 +1,104 @@
# Copyright 2025 The Newton Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Test fixtures for MJWarp."""
from typing import Any, Optional, Sequence, Tuple, Union
import mujoco
import numpy as np
from etils import epath
import mujoco_warp as mjw
from mujoco.mjx.third_party.mujoco_warp._src.io import override_model
def fixture(
path: Optional[str] = None,
xml: Optional[str] = None,
keyframe: Optional[Union[int, str]] = None,
qpos_noise: Optional[float] = None,
qvel_noise: Optional[float] = None,
ctrl_noise: Optional[float] = None,
qfrc_noise: Optional[float] = None,
xfrc_noise: Optional[float] = None,
mocap_noise: Optional[float] = None,
overrides: Union[dict[str, Any], Sequence[str]] = tuple(),
) -> Tuple[mujoco.MjModel, mujoco.MjData, mjw.Model, mjw.Data]:
"""Loads MuJoCo MjModel / MjData and corresponding mjw.Model / mjw.Data.
Args:
path: path to the XML file to load, relative to the `test_data` root.
xml: XML string to load (instead of fname).
keyframe: if provided, the data will be reset to the specified keyframe.
qpos_noise: initialize `qpos` with uniform noise with this magnitude.
qvel_noise: initialize `qvel` with uniform noise with this magnitude.
ctrl_noise: initialize `ctrl` with uniform noise with this magnitude.
qfrc_noise: initialize `qfrc_applied` with uniform noise with this magnitude.
xfrc_noise: initialize `xfrc_applied` with uniform noise with this magnitude.
mocap_noise: initialize `mocap_pos` and `mocap_quat` will be initialized with uniform noise.
overrides: a dict (or sequence of "foo=bar" strings) of model fields to override.
Returns:
Tuple containing:
mujoco.MjModel
mujoco.MjData
mjw.Model
mjw.Data
"""
np.random.seed(42) # reduce test flakiness
if path is not None:
path = epath.resource_path("mjx") / "third_party/mujoco_warp" / "test_data" / path
mjm = mujoco.MjModel.from_xml_path(path.as_posix())
elif xml is not None:
mjm = mujoco.MjModel.from_xml_string(xml)
else:
raise ValueError("either fname or xml must be provided")
override_model(mjm, overrides)
mjd = mujoco.MjData(mjm)
if keyframe is not None:
if isinstance(keyframe, str):
keyframe = mujoco.mj_name2id(mjm, mujoco.mjtObj.mjOBJ_KEY, keyframe)
mujoco.mj_resetDataKeyframe(mjm, mjd, keyframe)
else:
mujoco.mj_resetData(mjm, mjd)
if qpos_noise:
mjd.qpos[:] = np.random.uniform(-qpos_noise, qpos_noise, mjm.nq)
if qvel_noise:
mjd.qvel[:] = np.random.uniform(-qvel_noise, qvel_noise, mjm.nv)
if ctrl_noise:
mjd.ctrl[:] = np.random.uniform(-ctrl_noise, ctrl_noise, size=mjm.nu)
if qfrc_noise:
mjd.qfrc_applied[:] = np.random.uniform(-qfrc_noise, qfrc_noise, size=mjm.nv)
if xfrc_noise:
mjd.xfrc_applied[:] = np.random.uniform(-xfrc_noise, xfrc_noise, size=(mjm.nbody, 6))
if mocap_noise:
mjd.mocap_pos[:] = np.random.uniform(-mocap_noise, mocap_noise, size=(mjm.nmocap, 3))
mjd.mocap_quat[:] = np.random.uniform(-mocap_noise, mocap_noise, size=(mjm.nmocap, 4))
if qpos_noise or qvel_noise or ctrl_noise or qfrc_noise or xfrc_noise:
mujoco.mj_step(mjm, mjd, 10) # let dynamics get state significantly non-zero, non-identity rotations etc
mujoco.mj_forward(mjm, mjd)
mjd.qacc_warmstart = mjd.qacc
m = mjw.put_model(mjm)
override_model(m, overrides)
d = mjw.put_data(mjm, mjd)
return mjm, mjd, m, d
@@ -0,0 +1,570 @@
# https://github.com/mikedh/trimesh
v -0.17668093 0.47517862 0.02428440
v -0.17668093 0.47517862 0.02771160
v -0.17241338 0.47517862 0.03709971
v -0.17241338 0.47517862 0.01489629
v -0.16860400 0.47716362 0.01202752
v -0.16860400 0.47716362 0.03996848
v -0.17548268 0.47730441 0.03114519
v -0.17548268 0.47730441 0.02085081
v -0.14408171 0.47174359 0.02503430
v -0.14408171 0.47174359 0.02696170
v -0.14939369 0.47174359 0.01413362
v -0.14939369 0.47174359 0.03786238
v -0.14939369 0.33458170 0.01413362
v -0.14939369 0.33458170 0.03786238
v -0.14403045 0.33458170 0.02709254
v -0.14403045 0.33458170 0.02490666
v -0.14934243 0.33458170 0.03781451
v -0.15304929 0.47517862 0.04046629
v -0.15304929 0.47517862 0.01152971
v -0.14771167 0.47517862 0.03620941
v -0.14771167 0.47517862 0.01578659
v -0.17055195 0.47174359 0.03883884
v -0.17055195 0.47174359 0.01315716
v -0.17055195 0.33458170 0.03883884
v -0.17055195 0.33458170 0.01315716
v -0.14764760 0.33458170 0.03618388
v -0.16307415 0.47764228 0.04076306
v -0.16307415 0.47764228 0.01123294
v -0.16307415 0.47517862 0.01002034
v -0.16307415 0.47517862 0.04197566
v -0.16307415 0.47174359 0.04214798
v -0.16307415 0.47174359 0.00984802
v -0.16307415 0.47840249 0.03800917
v -0.16307415 0.47840249 0.01398683
v -0.16307415 0.33458170 0.04214798
v -0.16307415 0.33458170 0.00984802
v -0.14498519 0.47174359 0.03114519
v -0.14498519 0.47174359 0.02085081
v -0.16994001 0.47833210 0.03457558
v -0.16994001 0.47833210 0.01742042
v -0.16994001 0.47840249 0.03114519
v -0.16994001 0.47840249 0.02085081
v -0.17413066 0.47517862 0.01719385
v -0.17413066 0.47517862 0.03480215
v -0.17516229 0.47698061 0.03299600
v -0.17516229 0.47698061 0.01900000
v -0.16876740 0.33458170 0.04015356
v -0.16982468 0.47761412 0.03798045
v -0.16982468 0.47761412 0.01401555
v -0.17248707 0.33458170 0.01494096
v -0.17243581 0.47174359 0.01487395
v -0.17243581 0.47174359 0.03712205
v -0.17243581 0.33458170 0.01487395
v -0.17243581 0.33458170 0.03712205
v -0.16657596 0.33458170 0.01082449
v -0.15964603 0.47764228 0.01118827
v -0.15964603 0.47764228 0.04080773
v -0.15964603 0.47517862 0.00990227
v -0.15964603 0.47517862 0.04209373
v -0.15964603 0.47174359 0.00969804
v -0.15964603 0.47174359 0.04229796
v -0.15964603 0.47840249 0.03800917
v -0.15964603 0.47840249 0.01398683
v -0.15964603 0.33458170 0.00969804
v -0.15964603 0.33458170 0.04229796
v -0.14409132 0.47517862 0.02511408
v -0.14409132 0.47517862 0.02688192
v -0.14935205 0.47840249 0.03114519
v -0.14935205 0.47840249 0.02085081
v -0.17591200 0.47517862 0.03114519
v -0.17591200 0.47517862 0.02085081
v -0.15302046 0.47174359 0.04049182
v -0.15302046 0.47174359 0.01150418
v -0.15302046 0.33458170 0.04049182
v -0.15302046 0.33458170 0.01150418
v -0.14656149 0.33458170 0.03441922
v -0.14495636 0.33458170 0.03107179
v -0.14701965 0.47738888 0.03393099
v -0.14701965 0.47738888 0.01806501
v -0.17415308 0.47174359 0.03482129
v -0.17415308 0.47174359 0.01717471
v -0.17415308 0.33458170 0.03482129
v -0.17415308 0.33458170 0.01717471
v -0.16881546 0.47517862 0.04010570
v -0.16881546 0.47517862 0.01189030
v -0.17521034 0.47517862 0.03308535
v -0.17521034 0.47517862 0.01891065
v -0.15124872 0.33458170 0.03952811
v -0.14942574 0.47517862 0.01418787
v -0.14942574 0.47517862 0.03780813
v -0.17332328 0.47750149 0.01768209
v -0.17332328 0.47750149 0.03431391
v -0.17597287 0.33458170 0.02095612
v -0.14403685 0.33458170 0.02485560
v -0.17594724 0.47174359 0.03114519
v -0.17594724 0.47174359 0.02085081
v -0.17594724 0.33458170 0.03114519
v -0.17594724 0.33458170 0.02085081
v -0.14666081 0.47517862 0.01750339
v -0.14666081 0.47517862 0.03449261
v -0.17060961 0.33458170 0.01320821
v -0.15621470 0.47761412 0.01139569
v -0.15621470 0.47761412 0.04060031
v -0.15621470 0.47836025 0.03800917
v -0.15621470 0.47836025 0.01398683
v -0.15621470 0.47517862 0.01039369
v -0.15621470 0.47517862 0.04160231
v -0.15621470 0.47174359 0.04172357
v -0.15621470 0.47174359 0.01027243
v -0.15621470 0.33458170 0.04172357
v -0.15621470 0.33458170 0.01027243
v -0.14660955 0.33458170 0.01747786
v -0.14660955 0.33458170 0.03451814
v -0.14767963 0.47174359 0.03623493
v -0.14767963 0.47174359 0.01576107
v -0.14767963 0.33458170 0.03623493
v -0.14767963 0.33458170 0.01576107
v -0.17584472 0.47761412 0.02428440
v -0.17584472 0.47761412 0.02771160
v -0.17053272 0.47517862 0.01317949
v -0.17053272 0.47517862 0.03881651
v -0.14497879 0.33458170 0.03114519
v -0.14497879 0.33458170 0.02085081
v -0.17521996 0.47174359 0.01888831
v -0.17521996 0.47174359 0.03310769
v -0.17521996 0.33458170 0.01888831
v -0.17521996 0.33458170 0.03310769
v -0.17237815 0.33458170 0.03717630
v -0.16650548 0.47747334 0.01161587
v -0.16650548 0.47747334 0.04038013
v -0.16650548 0.47517862 0.01087555
v -0.16650548 0.47517862 0.04112045
v -0.16650548 0.47174359 0.04120342
v -0.16650548 0.47174359 0.01079258
v -0.16650548 0.33458170 0.04120342
v -0.16650548 0.33458170 0.01079258
v -0.16650548 0.47823355 0.03800917
v -0.16650548 0.47823355 0.01398683
v -0.14999602 0.47738888 0.01473035
v -0.14999602 0.47738888 0.03726565
v -0.14413617 0.47698061 0.02546190
v -0.14413617 0.47698061 0.02653410
v -0.17337134 0.47836025 0.02428440
v -0.17337134 0.47836025 0.02771160
v -0.17337134 0.47805054 0.03114519
v -0.17337134 0.47805054 0.02085081
v -0.14566441 0.47754373 0.02769246
v -0.14566441 0.47754373 0.02430354
v -0.16640295 0.33458170 0.04123214
v -0.15255590 0.47776897 0.01374750
v -0.15255590 0.47776897 0.03824850
v -0.14510373 0.47517862 0.03114519
v -0.14510373 0.47517862 0.02085081
v -0.15354909 0.47734664 0.01179138
v -0.15354909 0.47734664 0.04020462
v -0.14660635 0.40996936 0.01747467
v -0.14660635 0.33791819 0.01747786
v -0.14660635 0.33791819 0.03451814
v -0.14660635 0.40653433 0.03452133
v -0.14660635 0.47174359 0.01747467
v -0.14660635 0.47174359 0.03452133
v -0.17214747 0.47730441 0.03681571
v -0.17214747 0.47730441 0.01518029
v -0.15135766 0.33458170 0.01238811
v -0.15133203 0.47517862 0.03952173
v -0.15133203 0.47517862 0.01247427
v -0.15130640 0.47174359 0.01241683
v -0.15130640 0.47174359 0.03957917
v -0.15130640 0.33458170 0.01241683
v -0.15130640 0.33458170 0.03957917
v -0.17418512 0.33458170 0.01722576
v -0.16883469 0.47174359 0.01187435
v -0.16883469 0.47174359 0.04012165
v -0.16883469 0.33458170 0.01187435
v -0.16883469 0.33458170 0.04012165
v -0.14436364 0.47517862 0.02859872
v -0.14436364 0.47517862 0.02339728
v -0.17675782 0.47174359 0.02428440
v -0.17675782 0.47174359 0.02771160
v -0.17675782 0.33458170 0.02428440
v -0.17675782 0.33458170 0.02771160
v -0.14642693 0.47764228 0.03114519
v -0.14642693 0.47764228 0.02085081
v -0.14429957 0.47174359 0.02331751
v -0.14429957 0.47174359 0.02867849
v -0.14428675 0.33458170 0.02880614
v -0.14428675 0.33458170 0.02318986
v -0.14905089 0.47779713 0.03487554
v -0.14905089 0.47779713 0.01712046
v -0.15278337 0.47840249 0.03457558
v -0.15278337 0.47840249 0.01742042
f 180 93 98
f 180 98 126
f 180 126 171
f 180 171 83
f 180 83 50
f 180 50 53
f 180 53 101
f 180 101 25
f 180 25 174
f 180 174 55
f 180 55 136
f 180 136 36
f 180 36 64
f 180 64 111
f 180 111 75
f 180 75 164
f 180 164 169
f 180 169 13
f 180 13 117
f 180 117 112
f 180 112 123
f 180 123 187
f 180 187 94
f 180 94 16
f 180 16 15
f 180 15 186
f 180 186 77
f 180 77 122
f 180 122 76
f 180 76 113
f 180 113 26
f 180 26 116
f 180 116 17
f 180 17 14
f 180 14 88
f 180 88 170
f 180 170 74
f 180 74 110
f 180 110 65
f 180 65 35
f 180 35 149
f 180 149 135
f 180 135 47
f 180 47 175
f 180 175 24
f 180 24 128
f 180 128 54
f 180 54 82
f 180 82 127
f 180 127 97
f 180 97 181
f 180 181 179
f 180 179 178
f 180 178 93
f 93 178 96
f 93 96 98
f 181 97 95
f 181 95 179
f 178 179 2
f 178 2 1
f 178 1 71
f 178 71 96
f 98 96 124
f 98 124 126
f 96 71 87
f 96 87 124
f 97 127 125
f 97 125 95
f 179 95 70
f 179 70 2
f 1 2 119
f 1 119 118
f 1 118 8
f 1 8 46
f 1 46 71
f 71 46 87
f 126 124 171
f 87 46 43
f 87 43 81
f 87 81 124
f 124 81 171
f 127 82 80
f 127 80 125
f 95 125 86
f 95 86 70
f 70 86 45
f 70 45 2
f 2 45 7
f 2 7 119
f 118 119 144
f 118 144 143
f 118 143 146
f 118 146 8
f 8 146 91
f 8 91 46
f 46 91 163
f 46 163 4
f 46 4 43
f 171 81 83
f 43 4 51
f 43 51 81
f 81 51 50
f 81 50 83
f 82 54 52
f 82 52 80
f 125 80 86
f 86 44 45
f 86 80 44
f 45 162 92
f 45 92 7
f 45 44 3
f 45 3 162
f 7 92 145
f 7 145 119
f 119 145 144
f 143 40 146
f 143 144 41
f 143 41 42
f 143 42 40
f 146 40 91
f 91 40 163
f 163 5 120
f 163 120 4
f 163 40 49
f 163 49 5
f 4 120 51
f 51 120 23
f 51 23 101
f 51 101 53
f 51 53 50
f 54 128 52
f 80 52 44
f 44 52 3
f 162 48 39
f 162 39 92
f 162 3 121
f 162 121 6
f 162 6 48
f 92 39 145
f 3 52 121
f 145 39 144
f 144 39 41
f 40 138 49
f 40 42 34
f 40 34 138
f 42 41 33
f 42 33 62
f 42 62 190
f 42 190 68
f 42 68 69
f 42 69 191
f 42 191 63
f 42 63 34
f 5 49 129
f 5 129 29
f 5 29 131
f 5 131 85
f 5 85 120
f 120 85 23
f 49 138 129
f 23 85 172
f 23 172 174
f 23 174 25
f 23 25 101
f 128 24 22
f 128 22 52
f 52 22 121
f 48 6 130
f 48 130 137
f 48 137 39
f 39 137 33
f 39 33 41
f 121 84 6
f 121 22 84
f 6 84 132
f 6 132 30
f 6 30 130
f 138 34 28
f 138 28 129
f 34 63 56
f 34 56 28
f 129 28 29
f 29 28 58
f 29 58 60
f 29 60 32
f 29 32 131
f 131 32 134
f 131 134 85
f 85 134 172
f 172 134 55
f 172 55 174
f 24 175 173
f 24 173 22
f 22 173 84
f 130 27 137
f 130 30 27
f 137 27 33
f 33 27 57
f 33 57 62
f 84 173 133
f 84 133 132
f 132 133 31
f 132 31 30
f 30 59 27
f 30 31 61
f 30 61 59
f 28 56 58
f 63 191 105
f 63 105 56
f 56 105 102
f 56 102 58
f 58 102 106
f 58 106 60
f 60 106 109
f 60 109 111
f 60 111 64
f 60 64 36
f 60 36 32
f 32 36 136
f 32 136 134
f 134 136 55
f 175 47 173
f 173 47 133
f 27 59 57
f 62 57 104
f 62 104 190
f 57 103 104
f 57 59 103
f 133 47 135
f 133 135 149
f 133 149 31
f 31 149 35
f 31 35 65
f 31 65 61
f 59 61 107
f 59 107 103
f 61 108 107
f 61 65 110
f 61 110 108
f 191 69 189
f 191 189 105
f 105 189 150
f 105 150 102
f 102 150 154
f 102 154 106
f 106 154 19
f 106 19 109
f 109 19 73
f 109 73 75
f 109 75 111
f 104 188 190
f 104 103 151
f 104 151 188
f 190 188 68
f 103 107 155
f 103 155 151
f 107 18 155
f 107 108 18
f 108 72 18
f 108 110 74
f 108 74 72
f 69 68 147
f 69 147 148
f 69 148 183
f 69 183 189
f 189 183 79
f 189 79 139
f 189 139 150
f 150 139 154
f 154 139 166
f 154 166 19
f 19 166 167
f 19 167 73
f 73 167 164
f 73 164 75
f 188 151 140
f 188 140 78
f 188 78 182
f 188 182 68
f 151 155 140
f 68 182 147
f 155 18 165
f 155 165 140
f 18 72 168
f 18 168 165
f 72 74 170
f 72 170 168
f 148 141 183
f 148 147 142
f 148 142 141
f 183 141 79
f 79 141 153
f 79 153 99
f 79 99 21
f 79 21 139
f 139 21 89
f 139 89 166
f 166 89 11
f 166 11 167
f 167 11 13
f 167 13 169
f 167 169 164
f 140 165 90
f 140 90 20
f 140 20 78
f 78 20 100
f 78 100 152
f 78 152 142
f 78 142 182
f 182 142 147
f 165 168 12
f 165 12 90
f 168 170 88
f 168 88 12
f 141 142 67
f 141 67 66
f 141 66 177
f 141 177 153
f 153 177 38
f 153 38 99
f 99 38 160
f 99 160 21
f 21 160 115
f 21 115 11
f 21 11 89
f 11 115 117
f 11 117 13
f 90 12 20
f 20 12 114
f 20 114 161
f 20 161 100
f 100 161 37
f 100 37 152
f 152 176 142
f 152 37 176
f 142 176 67
f 12 88 14
f 12 14 17
f 12 17 114
f 66 67 10
f 66 10 9
f 66 9 184
f 66 184 177
f 177 184 38
f 38 184 187
f 38 187 123
f 38 123 160
f 160 123 156
f 160 156 117
f 160 117 115
f 114 17 116
f 114 116 26
f 114 26 161
f 161 26 159
f 161 159 122
f 161 122 37
f 37 185 176
f 37 122 77
f 37 77 186
f 37 186 185
f 176 185 67
f 67 185 10
f 9 16 94
f 9 94 184
f 9 10 15
f 9 15 16
f 184 94 187
f 123 112 157
f 123 157 156
f 156 157 117
f 117 157 112
f 26 113 158
f 26 158 159
f 159 158 122
f 122 158 76
f 185 186 15
f 185 15 10
f 113 76 158
@@ -0,0 +1,141 @@
# https://github.com/mikedh/trimesh
v 0.25176700 0.46026000 0.00637500
v 0.25176700 0.46026000 0.04562100
v 0.25176700 0.45213200 0.02599800
v 0.25176700 0.48706600 -0.00080800
v 0.25176700 0.48706600 0.05280400
v 0.25176700 0.50391600 0.01212200
v 0.25176700 0.50391600 0.03987400
v 0.25176700 0.45307700 0.03318100
v 0.25176700 0.45307700 0.01881500
v 0.25176700 0.47988300 -0.00175300
v 0.25176700 0.47988300 0.05374900
v 0.25176700 0.50668900 0.03318100
v 0.25176700 0.50668900 0.01881500
v 0.25176700 0.45585000 0.01212200
v 0.25176700 0.45585000 0.03987400
v 0.25176700 0.47270000 -0.00080800
v 0.25176700 0.47270000 0.05280400
v 0.25176700 0.49950600 0.00637500
v 0.25176700 0.49950600 0.04562100
v 0.25176700 0.50763400 0.02599800
v 0.25176700 0.49375900 0.05003100
v 0.25176700 0.49375900 0.00196500
v 0.25176700 0.46600700 0.05003100
v 0.25176700 0.46600700 0.00196500
v -0.25876300 0.46026000 0.00637500
v -0.25876300 0.46026000 0.04562100
v -0.25876300 0.45213200 0.02599800
v -0.25876300 0.48706600 -0.00080800
v -0.25876300 0.48706600 0.05280400
v -0.25876300 0.50391600 0.01212200
v -0.25876300 0.50391600 0.03987400
v -0.25876300 0.45307700 0.03318100
v -0.25876300 0.45307700 0.01881500
v -0.25876300 0.47988300 -0.00175300
v -0.25876300 0.47988300 0.05374900
v -0.25876300 0.50668900 0.03318100
v -0.25876300 0.50668900 0.01881500
v -0.25876300 0.45585000 0.01212200
v -0.25876300 0.45585000 0.03987400
v -0.25876300 0.47270000 -0.00080800
v -0.25876300 0.47270000 0.05280400
v -0.25876300 0.49950600 0.00637500
v -0.25876300 0.49950600 0.04562100
v -0.25876300 0.50763400 0.02599800
v -0.25876300 0.49375900 0.05003100
v -0.25876300 0.49375900 0.00196500
v -0.25876300 0.46600700 0.05003100
v -0.25876300 0.46600700 0.00196500
f 5 35 11
f 35 5 29
f 4 16 10
f 16 4 22
f 16 22 24
f 24 22 18
f 24 18 1
f 1 18 6
f 1 6 14
f 14 6 13
f 14 13 9
f 9 13 20
f 9 20 3
f 3 20 12
f 3 12 8
f 8 12 7
f 8 7 15
f 15 7 19
f 15 19 2
f 2 19 21
f 2 21 23
f 23 21 5
f 23 5 17
f 17 5 11
f 21 29 5
f 29 21 45
f 40 28 34
f 28 40 48
f 28 48 46
f 46 48 25
f 46 25 42
f 42 25 38
f 42 38 30
f 30 38 33
f 30 33 37
f 37 33 27
f 37 27 44
f 44 27 32
f 44 32 36
f 36 32 39
f 36 39 31
f 31 39 26
f 31 26 43
f 43 26 47
f 43 47 45
f 45 47 41
f 45 41 29
f 29 41 35
f 11 41 17
f 41 11 35
f 40 24 48
f 24 40 16
f 34 16 40
f 16 34 10
f 28 10 34
f 10 28 4
f 46 4 28
f 4 46 22
f 42 22 46
f 22 42 18
f 42 6 18
f 6 42 30
f 30 13 6
f 13 30 37
f 37 20 13
f 20 37 44
f 44 12 20
f 12 44 36
f 36 7 12
f 7 36 31
f 31 19 7
f 19 31 43
f 19 45 21
f 45 19 43
f 17 47 23
f 47 17 41
f 23 26 2
f 26 23 47
f 26 15 2
f 15 26 39
f 39 8 15
f 8 39 32
f 32 3 8
f 3 32 27
f 27 9 3
f 9 27 33
f 33 14 9
f 14 33 38
f 38 1 14
f 1 38 25
f 48 1 25
f 1 48 24
@@ -0,0 +1,411 @@
# https://github.com/mikedh/trimesh
v -0.24864252 0.28096184 -0.18777662
v -0.24864252 0.29315016 -0.18777662
v -0.24754169 0.29301255 -0.19186647
v -0.24754169 0.28109945 -0.19186647
v -0.24778744 0.29310230 -0.18999657
v -0.24778744 0.28100970 -0.18999657
v -0.24902389 0.29301255 -0.18696642
v -0.24902389 0.28109945 -0.18696642
v -0.24866279 0.29301255 -0.18765760
v -0.24866279 0.28109945 -0.18765760
v -0.24792032 0.28094628 -0.18955423
v -0.24792032 0.29316572 -0.18955423
v -0.24883676 0.29301255 -0.18729419
v -0.24883676 0.28109945 -0.18729419
v -0.24766169 0.28095107 -0.19186647
v -0.24766169 0.29316093 -0.19186647
v -0.24831704 0.28100013 -0.18839016
v -0.24831704 0.29311187 -0.18839016
v -0.24896471 0.28127654 -0.18706570
v -0.24896471 0.29283546 -0.18706570
v -0.24760279 0.29311905 -0.19102635
v -0.24760279 0.28099295 -0.19102635
v -0.24790224 0.29301255 -0.18937666
v -0.24790224 0.28109945 -0.18937666
v -0.24774607 0.28094748 -0.19044336
v -0.24774607 0.29316452 -0.19044336
v -0.24811977 0.29313700 -0.18884332
v -0.24811977 0.28097500 -0.18884332
v -0.24797128 0.29301255 -0.18911444
v -0.24797128 0.28109945 -0.18911444
v -0.24866745 0.29312264 -0.18766779
v -0.24866745 0.28098936 -0.18766779
v -0.24771512 0.29301255 -0.19195175
v -0.24771512 0.28109945 -0.19195175
v -0.24757429 0.28095107 -0.19133248
v -0.24757429 0.29316093 -0.19133248
v -0.24846772 0.28096543 -0.18813240
v -0.24846772 0.29314657 -0.18813240
v -0.24888498 0.28127654 -0.18720509
v -0.24888498 0.29283546 -0.18720509
v -0.24753840 0.29301255 -0.19133248
v -0.24753840 0.28109945 -0.19133248
v -0.24756142 0.29308076 -0.19195175
v -0.24756909 0.28094628 -0.19168826
v -0.24756909 0.29316572 -0.19168826
v -0.24777895 0.29312144 -0.19008822
v -0.24777895 0.28099056 -0.19008822
v -0.24754854 0.29301255 -0.19195175
v -0.24754854 0.28109945 -0.19195175
v -0.24757922 0.29315734 -0.19195175
v -0.24757922 0.28095466 -0.19195175
v -0.24752799 0.29301255 -0.19168826
v -0.24752799 0.28109945 -0.19168826
v -0.24909978 0.29301255 -0.18687731
v -0.24909978 0.28109945 -0.18687731
v -0.24912279 0.29315375 -0.18706252
v -0.24912279 0.28095825 -0.18706252
v -0.24913046 0.28096902 -0.18690150
v -0.24913046 0.29314298 -0.18690150
v -0.25026197 0.28098457 -0.18553631
v -0.25026197 0.29312743 -0.18553631
v -0.25018773 0.29315136 -0.18581698
v -0.25018773 0.28096064 -0.18581698
v -0.24809621 0.29301255 -0.18884332
v -0.24809621 0.28109945 -0.18884332
v -0.24968334 0.29301255 -0.18619440
v -0.24968334 0.28109945 -0.18619440
v -0.24947594 0.29315136 -0.18653363
v -0.24947594 0.28096064 -0.18653363
v -0.24795018 0.29313341 -0.18923155
v -0.24795018 0.28097859 -0.18923155
v -0.24881786 0.29315255 -0.18742084
v -0.24881786 0.28095945 -0.18742084
v -0.24970362 0.28096543 -0.18621795
v -0.24970362 0.29314657 -0.18621795
v -0.24814197 0.28100611 -0.18875103
v -0.24814197 0.29310589 -0.18875103
v -0.25009266 0.28099774 -0.18572406
v -0.25009266 0.29311426 -0.18572406
v -0.24794224 0.29301255 -0.18920355
v -0.24794224 0.28109945 -0.18920355
v -0.24899950 0.29314178 -0.18706570
v -0.24899950 0.28097022 -0.18706570
v -0.24756580 0.28094389 -0.19151069
v -0.24756580 0.29316811 -0.19151069
v -0.24757594 0.28095107 -0.19186647
v -0.24757594 0.29316093 -0.19186647
v -0.24953430 0.29314178 -0.18640634
v -0.24953430 0.28097022 -0.18640634
v -0.24766032 0.28094628 -0.19168826
v -0.24766032 0.29316572 -0.19168826
v -0.24766279 0.29315734 -0.19195175
v -0.24766279 0.28095466 -0.19195175
v -0.25032006 0.29301255 -0.18575079
v -0.25032006 0.29301255 -0.18544975
v -0.25032006 0.29313820 -0.18571006
v -0.25032006 0.28096543 -0.18563877
v -0.25032006 0.29314896 -0.18552485
v -0.25032006 0.29314896 -0.18567569
v -0.25032006 0.28097380 -0.18571006
v -0.25032006 0.28109945 -0.18575079
v -0.25032006 0.28109945 -0.18544975
v -0.25032006 0.28100731 -0.18573361
v -0.25032006 0.29302931 -0.18545293
v -0.25032006 0.29313939 -0.18550130
v -0.25032006 0.28097261 -0.18550130
v -0.24896581 0.29301255 -0.18706570
v -0.24896581 0.28109945 -0.18706570
v -0.24759100 0.29314059 -0.19115491
v -0.24759100 0.28097141 -0.19115491
v -0.24768827 0.29309033 -0.19195175
v -0.24776251 0.28096184 -0.19026579
v -0.24776251 0.29315016 -0.19026579
v -0.24793402 0.29315734 -0.18937666
v -0.24793402 0.28095466 -0.18937666
v -0.25019704 0.28096782 -0.18565596
v -0.24884279 0.28098577 -0.18730692
v -0.24884279 0.29312623 -0.18730692
v -0.24766005 0.28094389 -0.19151069
v -0.24766005 0.29316811 -0.19151069
v -0.24936498 0.29313580 -0.18659409
v -0.24936498 0.28097620 -0.18659409
v -0.24919594 0.28098577 -0.18678184
v -0.24919594 0.29312623 -0.18678184
v -0.24752169 0.29301255 -0.19151069
v -0.24752169 0.28109945 -0.19151069
v -0.24814114 0.29301255 -0.18874912
v -0.24814114 0.28109945 -0.18874912
v -0.24807950 0.29315375 -0.18902089
v -0.24807950 0.28095825 -0.18902089
v -0.24801292 0.28094628 -0.18955423
v -0.24801292 0.29316572 -0.18955423
v -0.24902663 0.28099893 -0.18696960
v -0.24902663 0.29311307 -0.18696960
v -0.24888580 0.29301255 -0.18720509
v -0.24888580 0.28109945 -0.18720509
v -0.24930307 0.28096184 -0.18671756
v -0.24930307 0.29315016 -0.18671756
f 95 66 134
f 95 134 79
f 95 79 61
f 95 61 104
f 95 104 105
f 95 105 98
f 95 98 99
f 95 99 96
f 95 96 94
f 95 94 101
f 95 101 103
f 95 103 100
f 95 100 97
f 95 97 106
f 95 106 102
f 95 102 67
f 95 67 66
f 66 54 134
f 66 67 55
f 66 55 54
f 134 118 82
f 134 82 124
f 134 124 61
f 134 61 79
f 134 54 7
f 134 7 107
f 134 107 135
f 134 135 13
f 134 13 118
f 61 124 121
f 61 121 88
f 61 88 75
f 61 75 98
f 61 98 105
f 61 105 104
f 102 106 60
f 102 60 78
f 102 78 133
f 102 133 67
f 54 55 8
f 54 8 7
f 67 133 55
f 118 31 27
f 118 27 38
f 118 38 2
f 118 2 72
f 118 72 82
f 118 13 31
f 82 72 138
f 82 138 59
f 82 59 124
f 124 59 121
f 7 20 107
f 7 8 19
f 7 19 20
f 107 20 135
f 135 20 40
f 135 40 13
f 13 9 77
f 13 77 18
f 13 18 31
f 13 40 39
f 13 39 14
f 13 14 10
f 13 10 9
f 121 59 88
f 88 59 138
f 88 138 75
f 75 138 98
f 98 138 68
f 98 68 62
f 98 62 99
f 106 97 116
f 106 116 74
f 106 74 60
f 60 74 89
f 60 89 122
f 60 122 123
f 60 123 133
f 60 133 78
f 133 123 83
f 133 83 117
f 133 117 14
f 133 14 136
f 133 136 108
f 133 108 8
f 133 8 55
f 31 18 27
f 27 18 77
f 27 77 70
f 27 70 114
f 27 114 129
f 27 129 38
f 38 129 2
f 2 129 72
f 72 129 114
f 72 114 12
f 72 12 56
f 72 56 138
f 138 56 68
f 20 19 39
f 20 39 40
f 8 108 19
f 9 127 77
f 9 10 128
f 9 128 127
f 77 127 64
f 77 64 29
f 77 29 70
f 14 39 136
f 14 117 32
f 14 32 17
f 14 17 76
f 14 76 10
f 68 56 62
f 62 56 12
f 62 12 132
f 62 132 120
f 62 120 99
f 99 120 91
f 99 91 16
f 99 16 92
f 99 92 96
f 97 93 15
f 97 15 63
f 97 63 116
f 97 100 93
f 116 63 69
f 116 69 74
f 74 137 89
f 74 69 137
f 89 137 58
f 89 58 122
f 122 58 123
f 123 58 83
f 83 58 137
f 83 137 73
f 83 73 117
f 117 73 1
f 117 1 37
f 117 37 28
f 117 28 32
f 136 39 19
f 136 19 108
f 70 29 80
f 70 80 23
f 70 23 5
f 70 5 46
f 70 46 114
f 114 113 36
f 114 36 26
f 114 26 12
f 114 46 113
f 12 26 85
f 12 85 120
f 12 120 132
f 127 128 65
f 127 65 64
f 10 76 128
f 64 65 30
f 64 30 29
f 29 30 81
f 29 81 80
f 32 28 17
f 17 28 76
f 76 28 71
f 76 71 30
f 76 30 65
f 76 65 128
f 120 85 45
f 120 45 91
f 91 45 87
f 91 87 16
f 16 87 50
f 16 50 92
f 92 50 43
f 92 43 48
f 92 48 49
f 92 49 51
f 92 51 93
f 92 93 34
f 92 34 33
f 92 33 111
f 92 111 96
f 96 111 33
f 96 33 94
f 93 51 86
f 93 86 15
f 93 100 34
f 15 86 44
f 15 44 90
f 15 90 63
f 63 90 119
f 63 119 131
f 63 131 11
f 63 11 57
f 63 57 69
f 100 103 34
f 69 57 137
f 137 57 73
f 73 57 11
f 73 11 115
f 73 115 130
f 73 130 1
f 1 130 37
f 37 130 28
f 28 130 115
f 28 115 71
f 80 81 24
f 80 24 23
f 23 41 5
f 23 24 42
f 23 42 41
f 5 21 46
f 5 41 21
f 46 21 109
f 46 109 113
f 113 109 36
f 36 85 26
f 36 109 41
f 36 41 125
f 36 125 85
f 85 125 45
f 30 71 81
f 71 115 47
f 71 47 6
f 71 6 24
f 71 24 81
f 45 125 52
f 45 52 87
f 87 52 50
f 50 52 43
f 33 34 101
f 33 101 94
f 51 49 4
f 51 4 53
f 51 53 86
f 34 103 101
f 86 53 44
f 90 44 84
f 90 84 119
f 119 84 11
f 119 11 131
f 11 84 25
f 11 25 115
f 115 25 35
f 115 35 112
f 115 112 47
f 41 109 21
f 41 42 126
f 41 126 125
f 24 6 42
f 125 126 53
f 125 53 52
f 47 112 110
f 47 110 22
f 47 22 6
f 6 22 42
f 52 3 43
f 52 53 4
f 52 4 3
f 43 3 48
f 49 48 3
f 49 3 4
f 53 126 44
f 44 126 84
f 84 35 25
f 84 126 35
f 35 126 42
f 35 42 110
f 35 110 112
f 42 22 110
@@ -0,0 +1,375 @@
# https://github.com/mikedh/trimesh
v -0.25091072 0.28109959 -0.18496633
v -0.25091072 0.29301241 -0.18496633
v -0.25061371 0.28098472 -0.18518422
v -0.25061371 0.29312728 -0.18518422
v -0.25250042 0.28097036 -0.18392907
v -0.25250042 0.29314164 -0.18392907
v -0.25250042 0.28109959 -0.18390459
v -0.25250042 0.29301241 -0.18390459
v -0.25410040 0.28095241 -0.18338031
v -0.25410040 0.29315959 -0.18338031
v -0.25060343 0.28109959 -0.18517723
v -0.25060343 0.29301241 -0.18517723
v -0.25343984 0.28098232 -0.18358395
v -0.25343984 0.29312968 -0.18358395
v -0.25043163 0.29313685 -0.18534912
v -0.25043163 0.28097515 -0.18534912
v -0.25481177 0.28109959 -0.18314252
v -0.25481177 0.29316797 -0.18319228
v -0.25481177 0.29316797 -0.18328616
v -0.25481177 0.28094403 -0.18319228
v -0.25481177 0.28094403 -0.18328616
v -0.25481177 0.29301241 -0.18314252
v -0.25167049 0.29313566 -0.18446573
v -0.25167049 0.28097634 -0.18446573
v -0.25231048 0.28109959 -0.18400601
v -0.25231048 0.29301241 -0.18400601
v -0.25036993 0.29315002 -0.18547151
v -0.25036993 0.28096198 -0.18547151
v -0.25448633 0.29313805 -0.18322107
v -0.25448633 0.28097395 -0.18322107
v -0.25233589 0.28096557 -0.18404555
v -0.25233589 0.29314643 -0.18404555
v -0.25125552 0.29315002 -0.18478772
v -0.25125552 0.28096198 -0.18478772
v -0.25146542 0.28096557 -0.18462497
v -0.25146542 0.29314643 -0.18462497
v -0.25587883 0.29311771 -0.18305751
v -0.25587883 0.28099429 -0.18305751
v -0.25187494 0.28100626 -0.18430675
v -0.25187494 0.29310574 -0.18430675
v -0.25393829 0.28109959 -0.18339403
v -0.25393829 0.29301241 -0.18339403
v -0.25623452 0.28096677 -0.18304380
v -0.25623452 0.29314523 -0.18304380
v -0.25356687 0.29315600 -0.18356135
v -0.25356687 0.28095600 -0.18356135
v -0.25356687 0.28109959 -0.18352530
v -0.25356687 0.29301241 -0.18352530
v -0.25291660 0.28098831 -0.18376552
v -0.25291660 0.29312369 -0.18376552
v -0.25576330 0.28100506 -0.18306209
v -0.25576330 0.29310694 -0.18306209
v -0.25239940 0.28109959 -0.18394575
v -0.25239940 0.29301241 -0.18394575
v -0.25072259 0.28096318 -0.18515060
v -0.25072259 0.29314882 -0.18515060
v -0.25267826 0.28095121 -0.18399605
v -0.25267826 0.28095121 -0.18390352
v -0.25267826 0.29316079 -0.18399605
v -0.25267826 0.29316079 -0.18390352
v -0.25033061 0.28109959 -0.18543762
v -0.25033061 0.29301241 -0.18543762
v -0.25303395 0.29315121 -0.18374481
v -0.25303395 0.28096079 -0.18374481
v -0.25303395 0.28109959 -0.18371387
v -0.25303395 0.29301241 -0.18371387
v -0.25032033 0.29313805 -0.18570985
v -0.25032033 0.28096557 -0.18563802
v -0.25032033 0.29314882 -0.18552424
v -0.25032033 0.29314882 -0.18567515
v -0.25032033 0.28097395 -0.18570985
v -0.25032033 0.28097155 -0.18550110
v -0.25032033 0.28109959 -0.18575047
v -0.25032033 0.28109959 -0.18544973
v -0.25032033 0.28100745 -0.18573298
v -0.25032033 0.29301241 -0.18575047
v -0.25032033 0.29301241 -0.18544973
v -0.25032033 0.29303036 -0.18545215
v -0.25032033 0.29314045 -0.18550110
v -0.25463393 0.28109959 -0.18316162
v -0.25463393 0.28094882 -0.18320170
v -0.25463393 0.29316318 -0.18320170
v -0.25463393 0.29301241 -0.18316162
v -0.25574999 0.28109959 -0.18306101
v -0.25574999 0.29301241 -0.18306101
v -0.25396309 0.29313446 -0.18340264
v -0.25396309 0.28097754 -0.18340264
v -0.25112909 0.28109959 -0.18481650
v -0.25112909 0.29301241 -0.18481650
v -0.25114180 0.29313207 -0.18482511
v -0.25114180 0.28097993 -0.18482511
v -0.25051451 0.28109959 -0.18524690
v -0.25051451 0.29301241 -0.18524690
v -0.25218103 0.28109959 -0.18409478
v -0.25218103 0.29301241 -0.18409478
v -0.25036086 0.28096438 -0.18563238
v -0.25055020 0.28096557 -0.18528859
v -0.25055020 0.29314643 -0.18528859
v -0.25240363 0.29311292 -0.18394817
v -0.25240363 0.28099908 -0.18394817
v -0.25093673 0.28096677 -0.18498436
v -0.25093673 0.29314523 -0.18498436
v -0.25445669 0.28109959 -0.18321084
v -0.25445669 0.29301241 -0.18321084
v -0.25605668 0.29313327 -0.18305079
v -0.25605668 0.28097873 -0.18305079
v -0.25605668 0.28109959 -0.18303707
v -0.25605668 0.29301241 -0.18303707
v -0.25041954 0.28109959 -0.18533567
v -0.25041954 0.29301241 -0.18533567
v -0.25290268 0.28109959 -0.18376041
v -0.25290268 0.29301241 -0.18376041
v -0.25649947 0.29308421 -0.18301663
v -0.25649947 0.29308540 -0.18314386
v -0.25649947 0.28109959 -0.18316942
v -0.25649947 0.28109959 -0.18300264
v -0.25649947 0.29315720 -0.18311669
v -0.25649947 0.29315720 -0.18303357
v -0.25649947 0.28095480 -0.18311669
v -0.25649947 0.28095480 -0.18303357
v -0.25649947 0.29301241 -0.18316942
v -0.25649947 0.29301241 -0.18300264
v -0.25641236 0.29315361 -0.18303680
v -0.25641236 0.28095839 -0.18303680
v -0.25219857 0.29313925 -0.18410688
v -0.25219857 0.28097275 -0.18410688
f 119 96 21
f 119 21 20
f 119 20 120
f 119 120 116
f 119 116 122
f 119 122 113
f 119 113 118
f 119 118 117
f 119 117 114
f 119 114 121
f 119 121 115
f 119 115 75
f 119 75 71
f 119 71 96
f 96 68 28
f 96 28 21
f 96 71 68
f 21 57 58
f 21 58 20
f 21 28 57
f 120 20 81
f 120 81 124
f 120 124 116
f 115 73 75
f 115 121 76
f 115 76 73
f 75 73 76
f 75 76 67
f 75 67 70
f 75 70 69
f 75 69 79
f 75 79 78
f 75 78 77
f 75 77 74
f 75 74 72
f 75 72 68
f 75 68 71
f 68 72 28
f 28 72 16
f 28 16 97
f 28 97 55
f 28 55 58
f 28 58 57
f 20 58 81
f 81 51 38
f 81 38 106
f 81 106 43
f 81 43 124
f 81 58 9
f 81 9 30
f 81 30 80
f 81 80 51
f 124 43 116
f 116 43 106
f 116 106 38
f 116 38 51
f 116 51 107
f 116 107 108
f 116 108 122
f 121 114 67
f 121 67 76
f 72 74 16
f 16 3 55
f 16 55 97
f 16 74 61
f 16 61 109
f 16 109 92
f 16 92 3
f 55 34 58
f 55 3 101
f 55 101 34
f 58 64 46
f 58 46 9
f 58 34 35
f 58 35 31
f 58 31 5
f 58 5 64
f 51 84 107
f 51 80 17
f 51 17 84
f 9 46 30
f 30 46 64
f 30 64 87
f 30 87 13
f 30 13 103
f 30 103 80
f 80 103 104
f 80 104 83
f 80 83 22
f 80 22 17
f 107 84 85
f 107 85 108
f 122 108 52
f 122 52 37
f 122 37 113
f 114 117 67
f 67 117 70
f 74 77 62
f 74 62 61
f 3 39 100
f 3 100 91
f 3 91 101
f 3 92 11
f 3 11 39
f 61 62 110
f 61 110 109
f 109 110 93
f 109 93 92
f 92 93 12
f 92 12 11
f 34 101 35
f 101 91 24
f 101 24 126
f 101 126 35
f 64 5 49
f 64 49 13
f 64 13 87
f 35 126 31
f 31 126 5
f 5 126 100
f 5 100 49
f 84 17 22
f 84 22 85
f 13 49 103
f 103 49 41
f 103 41 42
f 103 42 104
f 83 104 29
f 83 29 82
f 83 82 52
f 83 52 22
f 108 85 52
f 52 82 37
f 52 85 22
f 37 105 113
f 37 82 105
f 113 105 44
f 113 44 123
f 113 123 118
f 117 118 18
f 117 18 19
f 117 19 70
f 70 19 27
f 70 27 69
f 77 78 62
f 39 11 1
f 39 1 88
f 39 88 94
f 39 94 25
f 39 25 100
f 100 126 24
f 100 24 91
f 100 25 53
f 100 53 7
f 100 7 111
f 100 111 49
f 11 12 2
f 11 2 1
f 62 78 110
f 110 78 15
f 110 15 93
f 93 15 4
f 93 4 12
f 49 111 65
f 49 65 47
f 49 47 41
f 41 47 48
f 41 48 42
f 104 42 50
f 104 50 14
f 104 14 29
f 29 14 86
f 29 86 63
f 29 63 45
f 29 45 10
f 29 10 82
f 82 10 60
f 82 60 18
f 82 18 118
f 82 118 123
f 82 123 44
f 82 44 105
f 19 18 60
f 19 60 59
f 19 59 27
f 27 59 60
f 27 60 56
f 27 56 98
f 27 98 15
f 27 15 69
f 69 15 79
f 78 79 15
f 1 2 89
f 1 89 88
f 88 89 95
f 88 95 94
f 94 95 26
f 94 26 25
f 25 26 54
f 25 54 53
f 53 54 8
f 53 8 7
f 7 8 112
f 7 112 111
f 111 112 66
f 111 66 65
f 12 4 40
f 12 40 2
f 15 98 56
f 15 56 4
f 4 56 102
f 4 102 90
f 4 90 99
f 4 99 40
f 65 66 48
f 65 48 47
f 42 48 50
f 50 99 6
f 50 6 63
f 50 63 14
f 50 48 66
f 50 66 112
f 50 112 99
f 14 63 86
f 63 60 45
f 63 6 60
f 45 60 10
f 60 6 32
f 60 32 36
f 60 36 33
f 60 33 56
f 56 33 102
f 2 40 89
f 89 40 95
f 95 40 26
f 26 40 99
f 26 99 54
f 54 99 8
f 8 99 112
f 102 33 36
f 102 36 125
f 102 125 23
f 102 23 90
f 90 23 99
f 99 23 125
f 99 125 6
f 6 125 32
f 32 125 36
@@ -0,0 +1,345 @@
# https://github.com/mikedh/trimesh
v -0.25017853 0.29314763 -0.19809636
v -0.24775671 0.28109958 -0.19399995
v -0.24775671 0.29301242 -0.19399995
v -0.25028086 0.28100506 -0.19813875
v -0.24794870 0.29313446 -0.19449414
v -0.24794870 0.28097754 -0.19449414
v -0.24807149 0.28109958 -0.19489021
v -0.24807149 0.29301242 -0.19489021
v -0.24760808 0.28100506 -0.19269363
v -0.24760808 0.29310694 -0.19269363
v -0.24973020 0.28098472 -0.19784321
v -0.24973020 0.29312728 -0.19784321
v -0.24813019 0.28098232 -0.19501739
v -0.24813019 0.29312968 -0.19501739
v -0.24915154 0.28109958 -0.19702017
v -0.24915154 0.29301242 -0.19702017
v -0.24953040 0.28096677 -0.19751981
v -0.24953040 0.29314523 -0.19751981
v -0.24773840 0.29316797 -0.19364506
v -0.24773840 0.28094403 -0.19364506
v -0.24854218 0.28095121 -0.19577865
v -0.24854218 0.29316079 -0.19577865
v -0.24855241 0.28109958 -0.19614566
v -0.24855241 0.29301242 -0.19614566
v -0.25000135 0.29303276 -0.19813875
v -0.24771525 0.28109958 -0.19195236
v -0.24771525 0.29301242 -0.19195236
v -0.25025985 0.29313805 -0.19813875
v -0.25025985 0.28097395 -0.19813875
v -0.24758977 0.28096677 -0.19222246
v -0.24758977 0.29314523 -0.19222246
v -0.24830656 0.28109958 -0.19555397
v -0.24830656 0.29301242 -0.19555397
v -0.24770744 0.28109958 -0.19382311
v -0.24770744 0.29301242 -0.19382311
v -0.24844982 0.28095121 -0.19577865
v -0.24844982 0.29316079 -0.19577865
v -0.24969654 0.28096318 -0.19773480
v -0.24969654 0.29314882 -0.19773480
v -0.24756149 0.29308062 -0.19195236
v -0.24983468 0.28096557 -0.19790680
v -0.24983468 0.29314643 -0.19790680
v -0.24754857 0.28109958 -0.19195236
v -0.24754857 0.29301242 -0.19195236
v -0.24829095 0.29315122 -0.19542316
v -0.24829095 0.28096078 -0.19542316
v -0.24757927 0.29315720 -0.19195236
v -0.24757927 0.28095480 -0.19195236
v -0.24831141 0.28098831 -0.19554004
v -0.24831141 0.29312369 -0.19554004
v -0.24847513 0.28097036 -0.19595610
v -0.24847513 0.29314164 -0.19595610
v -0.25022350 0.28096318 -0.19813875
v -0.25007244 0.28096318 -0.19813875
v -0.24999812 0.28109958 -0.19813875
v -0.24999812 0.29301242 -0.19813875
v -0.24917119 0.28096557 -0.19699171
v -0.24917119 0.29314643 -0.19699171
v -0.24774783 0.28094882 -0.19382311
v -0.24774783 0.29316318 -0.19382311
v -0.24759677 0.29313327 -0.19240052
v -0.24759677 0.28097873 -0.19240052
v -0.24760700 0.28109958 -0.19270696
v -0.24760700 0.29301242 -0.19270696
v -0.24783211 0.29316797 -0.19364506
v -0.24783211 0.28094403 -0.19364506
v -0.24755557 0.28109958 -0.19204502
v -0.24755557 0.29301242 -0.19204502
v -0.24768859 0.28109958 -0.19364506
v -0.24768859 0.29301242 -0.19364506
v -0.24901205 0.29313566 -0.19678640
v -0.24901205 0.28097634 -0.19678640
v -0.25018446 0.29314643 -0.19813875
v -0.24979267 0.28109958 -0.19794253
v -0.24979267 0.29301242 -0.19794253
v -0.24766274 0.29315720 -0.19195236
v -0.24766274 0.28095480 -0.19195236
v -0.24768832 0.29309019 -0.19195236
v -0.24845116 0.28109958 -0.19595610
v -0.24845116 0.29301242 -0.19595610
v -0.24989499 0.29313686 -0.19802550
v -0.24989499 0.28097514 -0.19802550
v -0.24792635 0.28095241 -0.19435666
v -0.24792635 0.29315959 -0.19435666
v -0.24972347 0.28109958 -0.19785350
v -0.24972347 0.29301242 -0.19785350
v -0.24849209 0.28109958 -0.19605724
v -0.24849209 0.29301242 -0.19605724
v -0.24849452 0.29311293 -0.19605300
v -0.24849452 0.28099907 -0.19605300
v -0.24885291 0.28100625 -0.19658170
v -0.24885291 0.29310575 -0.19658170
v -0.24859172 0.28096557 -0.19612083
v -0.24859172 0.29314643 -0.19612083
v -0.24865312 0.29313805 -0.19625830
v -0.24865312 0.28097395 -0.19625830
v -0.24760350 0.29311771 -0.19257796
v -0.24760350 0.28099429 -0.19257796
v -0.25029917 0.28109958 -0.19813875
v -0.25029917 0.29301242 -0.19813875
v -0.24906268 0.28109958 -0.19689057
v -0.24906268 0.29301242 -0.19689057
v -0.25001751 0.29315002 -0.19808667
v -0.25001751 0.28096198 -0.19808667
v -0.25004821 0.29313925 -0.19813875
v -0.25004821 0.28097275 -0.19813875
v -0.24988180 0.28109958 -0.19803701
v -0.24988180 0.29301242 -0.19803701
v -0.24776722 0.29313805 -0.19397088
v -0.24776722 0.28097395 -0.19397088
v -0.24933383 0.29315002 -0.19720125
v -0.24933383 0.28096198 -0.19720125
v -0.24758277 0.29315361 -0.19204502
v -0.24758277 0.28095839 -0.19204502
v -0.24810757 0.29315600 -0.19489021
v -0.24810757 0.28095600 -0.19489021
f 47 113 19
f 47 19 65
f 47 65 76
f 47 76 78
f 47 78 27
f 47 27 26
f 47 26 77
f 47 77 48
f 47 48 43
f 47 43 44
f 47 44 40
f 47 40 113
f 113 60 19
f 113 40 31
f 113 31 60
f 19 60 37
f 19 37 22
f 19 22 65
f 76 65 1
f 76 1 28
f 76 28 78
f 40 44 97
f 40 97 61
f 40 61 31
f 60 109 84
f 60 84 37
f 60 31 61
f 60 61 97
f 60 97 10
f 60 10 35
f 60 35 109
f 37 84 115
f 37 115 45
f 37 45 52
f 37 52 94
f 37 94 58
f 37 58 111
f 37 111 39
f 37 39 103
f 37 103 22
f 65 22 103
f 65 103 1
f 1 103 73
f 1 73 28
f 28 27 78
f 28 73 105
f 28 105 25
f 28 25 56
f 28 56 55
f 28 55 106
f 28 106 54
f 28 54 53
f 28 53 29
f 28 29 4
f 28 4 99
f 28 99 100
f 28 100 27
f 44 68 10
f 44 10 97
f 44 43 67
f 44 67 68
f 109 5 45
f 109 45 115
f 109 115 84
f 109 35 3
f 109 3 5
f 10 68 64
f 10 64 70
f 10 70 35
f 35 70 69
f 35 69 34
f 35 34 2
f 35 2 3
f 45 5 14
f 45 14 50
f 45 50 52
f 52 50 89
f 52 89 95
f 52 95 94
f 94 95 58
f 58 18 39
f 58 39 111
f 58 95 18
f 39 18 12
f 39 12 81
f 39 81 42
f 39 42 103
f 103 42 81
f 103 81 105
f 103 105 73
f 27 100 99
f 27 99 26
f 68 67 63
f 68 63 64
f 43 48 114
f 43 114 30
f 43 30 62
f 43 62 98
f 43 98 9
f 43 9 67
f 5 3 14
f 3 8 50
f 3 50 14
f 3 2 7
f 3 7 8
f 64 63 69
f 64 69 70
f 34 69 9
f 34 9 59
f 34 59 110
f 34 110 2
f 50 8 33
f 50 33 89
f 89 92 12
f 89 12 71
f 89 71 95
f 89 33 80
f 89 80 88
f 89 88 92
f 95 71 18
f 18 71 12
f 12 92 86
f 12 86 75
f 12 75 81
f 81 75 108
f 81 108 25
f 81 25 105
f 26 99 4
f 26 4 77
f 67 9 63
f 48 77 66
f 48 66 20
f 48 20 114
f 114 20 59
f 114 59 30
f 30 59 62
f 62 59 98
f 98 59 9
f 9 69 63
f 8 7 32
f 8 32 33
f 2 110 6
f 2 6 13
f 2 13 49
f 2 49 7
f 59 20 36
f 59 36 83
f 59 83 110
f 110 83 116
f 110 116 46
f 110 46 6
f 33 32 79
f 33 79 80
f 92 88 24
f 92 24 102
f 92 102 16
f 92 16 86
f 80 79 87
f 80 87 88
f 88 87 23
f 88 23 24
f 86 16 15
f 86 15 85
f 86 85 74
f 86 74 75
f 75 74 107
f 75 107 108
f 108 56 25
f 108 107 55
f 108 55 56
f 4 29 77
f 77 29 53
f 77 53 66
f 20 66 21
f 20 21 36
f 7 49 32
f 6 46 13
f 13 46 49
f 49 46 51
f 49 51 90
f 49 90 32
f 36 46 116
f 36 116 83
f 36 21 104
f 36 104 38
f 36 38 112
f 36 112 57
f 36 57 93
f 36 93 51
f 36 51 46
f 32 90 79
f 24 23 101
f 24 101 102
f 102 101 15
f 102 15 16
f 79 90 87
f 87 90 91
f 87 91 23
f 85 15 91
f 85 91 11
f 85 11 74
f 74 11 82
f 74 82 107
f 107 82 55
f 53 54 104
f 53 104 66
f 66 104 21
f 51 93 96
f 51 96 90
f 90 96 72
f 90 72 11
f 90 11 91
f 104 54 82
f 104 82 41
f 104 41 38
f 38 41 82
f 38 82 11
f 38 11 17
f 38 17 57
f 38 57 112
f 57 17 96
f 57 96 93
f 23 91 101
f 101 91 15
f 11 72 17
f 82 106 55
f 82 54 106
f 96 17 72
@@ -0,0 +1,405 @@
# https://github.com/mikedh/trimesh
v -0.25036286 0.29315135 -0.19826934
v -0.25036286 0.28096065 -0.19826934
v -0.25185277 0.28098578 -0.19961436
v -0.25185277 0.29312622 -0.19961436
v -0.25151228 0.29301255 -0.19943312
v -0.25151228 0.28109945 -0.19943312
v -0.25026039 0.29313819 -0.19813875
v -0.25026039 0.28097381 -0.19813875
v -0.25221364 0.29312263 -0.19978957
v -0.25221364 0.28098937 -0.19978957
v -0.25107950 0.29315135 -0.19898113
v -0.25107950 0.28096065 -0.19898113
v -0.25132771 0.28098578 -0.19926120
v -0.25132771 0.29312622 -0.19926120
v -0.25076446 0.28096543 -0.19875336
v -0.25076446 0.29314657 -0.19875336
v -0.25123033 0.29301255 -0.19919248
v -0.25123033 0.28109945 -0.19919248
v -0.25374937 0.29301255 -0.20051478
v -0.25374937 0.28109945 -0.20051478
v -0.25022412 0.28096304 -0.19813875
v -0.24999882 0.29301255 -0.19813875
v -0.24999882 0.28109945 -0.19813875
v -0.25377737 0.29313340 -0.20050684
v -0.25377737 0.28097860 -0.20050684
v -0.25481159 0.28096184 -0.20069464
v -0.25481159 0.29315016 -0.20069464
v -0.25126343 0.28096184 -0.19915388
v -0.25126343 0.29315016 -0.19915388
v -0.25161156 0.29301255 -0.19949144
v -0.25161156 0.28109945 -0.19949144
v -0.25161156 0.29314178 -0.19945749
v -0.25161156 0.28127654 -0.19949226
v -0.25161156 0.29283546 -0.19949226
v -0.25161156 0.28097022 -0.19945749
v -0.25196733 0.29315255 -0.19963900
v -0.25196733 0.28095945 -0.19963900
v -0.25232310 0.28096184 -0.19981448
v -0.25232310 0.29315016 -0.19981448
v -0.25587891 0.29301255 -0.20091859
v -0.25587891 0.28109945 -0.20091859
v -0.25587891 0.28095108 -0.20088272
v -0.25587891 0.29316092 -0.20088272
v -0.25026994 0.28099774 -0.19836433
v -0.25026994 0.29311426 -0.19836433
v -0.25623468 0.29301255 -0.20092899
v -0.25623468 0.28109945 -0.20092899
v -0.25623468 0.28094629 -0.20088792
v -0.25623468 0.28094629 -0.20079676
v -0.25623468 0.29316571 -0.20088792
v -0.25623468 0.29316571 -0.20079676
v -0.25144736 0.28096902 -0.19932635
v -0.25144736 0.29314298 -0.19932635
v -0.25007264 0.28096304 -0.19813875
v -0.25454238 0.29310229 -0.20066946
v -0.25454238 0.28100971 -0.20066946
v -0.25113996 0.29313580 -0.19909201
v -0.25113996 0.28097620 -0.19909201
v -0.25160838 0.29315375 -0.19933429
v -0.25160838 0.28095825 -0.19933429
v -0.25356671 0.29315375 -0.20037735
v -0.25356671 0.28095825 -0.20037735
v -0.25392248 0.29301255 -0.20055475
v -0.25392248 0.28109945 -0.20055475
v -0.25392248 0.29315734 -0.20052299
v -0.25392248 0.28095466 -0.20052299
v -0.25267824 0.28096543 -0.19998942
v -0.25267824 0.29314657 -0.19998942
v -0.25463402 0.29312144 -0.20067794
v -0.25463402 0.28099056 -0.20067794
v -0.25017702 0.29301255 -0.19829151
v -0.25017702 0.28109945 -0.19829151
v -0.25498980 0.28094749 -0.20071080
v -0.25498980 0.29316451 -0.20071080
v -0.25018466 0.29314657 -0.19813875
v -0.25008219 0.28098458 -0.19819487
v -0.25008219 0.29312742 -0.19819487
v -0.25366091 0.29301255 -0.20048576
v -0.25366091 0.28109945 -0.20048576
v -0.25151546 0.28099894 -0.19943039
v -0.25151546 0.29311306 -0.19943039
v -0.25175094 0.29301255 -0.19957110
v -0.25175094 0.28109945 -0.19957110
v -0.25175094 0.28127654 -0.19957192
v -0.25175094 0.29283546 -0.19957192
v -0.25095221 0.28096902 -0.19892255
v -0.25095221 0.29314298 -0.19892255
v -0.25004846 0.29313939 -0.19813875
v -0.25004846 0.28097261 -0.19813875
v -0.25142317 0.29301255 -0.19935729
v -0.25142317 0.28109945 -0.19935729
v -0.25028140 0.28100492 -0.19813875
v -0.25029922 0.29301255 -0.19813875
v -0.25029922 0.28109945 -0.19813875
v -0.25338914 0.29301255 -0.20036092
v -0.25338914 0.28109945 -0.20036092
v -0.25338914 0.29313699 -0.20033710
v -0.25338914 0.28097501 -0.20033710
v -0.25293600 0.28100013 -0.20013972
v -0.25293600 0.29311187 -0.20013972
v -0.25557278 0.29311904 -0.20085425
v -0.25557278 0.28099296 -0.20085425
v -0.25020184 0.29314417 -0.19826003
v -0.25649944 0.29301255 -0.20090818
v -0.25649944 0.29301255 -0.20074173
v -0.25649944 0.29308195 -0.20089477
v -0.25649944 0.29308793 -0.20076774
v -0.25649944 0.28109945 -0.20090818
v -0.25649944 0.28109945 -0.20074173
v -0.25649944 0.29315734 -0.20087752
v -0.25649944 0.29315734 -0.20079430
v -0.25649944 0.28095466 -0.20087752
v -0.25649944 0.28095466 -0.20079430
v -0.25329686 0.28100612 -0.20031493
v -0.25329686 0.29310588 -0.20031493
v -0.25570070 0.29301255 -0.20088546
v -0.25570070 0.29314058 -0.20086602
v -0.25570070 0.28097142 -0.20086602
v -0.25570070 0.28109945 -0.20088546
v -0.25410069 0.28094629 -0.20053641
v -0.25410069 0.28094629 -0.20044415
v -0.25410069 0.29316571 -0.20053641
v -0.25410069 0.29316571 -0.20044415
v -0.25605647 0.29301255 -0.20093529
v -0.25605647 0.28109945 -0.20093529
v -0.25605647 0.28094390 -0.20079676
v -0.25605647 0.28094390 -0.20089121
v -0.25605647 0.29316810 -0.20079676
v -0.25605647 0.29316810 -0.20089121
v -0.25000200 0.29303289 -0.19813875
v -0.25641224 0.28095108 -0.20079539
v -0.25641224 0.28095108 -0.20088081
v -0.25641224 0.29316092 -0.20079539
v -0.25641224 0.29316092 -0.20088081
v -0.25184004 0.29301255 -0.19962038
v -0.25184004 0.28109945 -0.19962038
f 112 132 131
f 112 131 113
f 112 113 109
f 112 109 105
f 112 105 107
f 112 107 111
f 112 111 110
f 112 110 106
f 112 106 104
f 112 104 108
f 112 108 47
f 112 47 132
f 132 48 49
f 132 49 131
f 132 47 48
f 113 131 21
f 113 21 8
f 113 8 109
f 108 104 46
f 108 46 47
f 47 125 48
f 47 46 124
f 47 124 125
f 48 127 126
f 48 126 49
f 48 125 127
f 131 49 21
f 21 49 126
f 21 126 2
f 21 2 54
f 21 54 89
f 21 89 23
f 21 23 22
f 21 22 130
f 21 130 88
f 21 88 75
f 21 75 7
f 21 7 93
f 21 93 94
f 21 94 92
f 21 92 8
f 8 92 109
f 109 92 94
f 109 94 93
f 109 93 105
f 104 106 46
f 125 41 42
f 125 42 127
f 125 124 40
f 125 40 41
f 46 106 110
f 46 110 134
f 46 134 50
f 46 50 124
f 127 42 73
f 127 73 120
f 127 120 121
f 127 121 126
f 126 121 2
f 2 121 120
f 2 120 60
f 2 60 12
f 2 12 54
f 54 12 28
f 54 28 15
f 54 15 89
f 105 93 7
f 105 7 107
f 41 119 56
f 41 56 102
f 41 102 118
f 41 118 42
f 41 40 116
f 41 116 119
f 42 26 66
f 42 66 73
f 42 118 26
f 124 50 129
f 124 129 43
f 124 43 40
f 110 111 133
f 110 133 134
f 134 133 51
f 134 51 50
f 50 51 128
f 50 128 129
f 73 66 120
f 120 66 37
f 120 37 60
f 60 37 28
f 60 28 12
f 28 52 86
f 28 86 15
f 28 37 35
f 28 35 52
f 15 86 76
f 15 76 89
f 89 76 23
f 7 75 111
f 7 111 107
f 119 64 56
f 119 116 63
f 119 63 64
f 56 70 102
f 56 64 25
f 56 25 70
f 102 70 118
f 118 70 26
f 40 43 117
f 40 117 101
f 40 101 55
f 40 55 116
f 26 70 66
f 66 62 37
f 66 70 25
f 66 25 98
f 66 98 62
f 129 128 123
f 129 123 122
f 129 122 74
f 129 74 43
f 43 74 65
f 43 65 27
f 43 27 117
f 111 75 133
f 133 75 1
f 133 1 51
f 51 1 128
f 37 62 38
f 37 38 3
f 37 3 35
f 52 35 13
f 52 13 58
f 52 58 86
f 86 58 76
f 35 3 80
f 35 80 13
f 76 58 13
f 76 13 44
f 76 44 23
f 23 44 72
f 23 72 71
f 23 71 22
f 75 88 103
f 75 103 1
f 64 20 25
f 64 63 19
f 64 19 20
f 116 55 63
f 25 114 98
f 25 20 79
f 25 79 114
f 117 69 101
f 117 27 69
f 101 69 55
f 55 69 24
f 55 24 63
f 62 67 38
f 62 98 67
f 98 114 99
f 98 99 10
f 98 10 3
f 98 3 67
f 128 1 123
f 122 1 59
f 122 59 36
f 122 36 65
f 122 65 74
f 122 123 1
f 65 36 61
f 65 61 97
f 65 97 24
f 65 24 69
f 65 69 27
f 1 103 11
f 1 11 59
f 38 67 3
f 3 10 136
f 3 136 80
f 13 80 44
f 80 136 83
f 80 83 31
f 80 31 6
f 80 6 91
f 80 91 18
f 80 18 72
f 80 72 44
f 72 18 17
f 72 17 71
f 22 71 45
f 22 45 130
f 88 130 77
f 88 77 16
f 88 16 103
f 103 16 11
f 20 19 78
f 20 78 79
f 63 24 19
f 114 10 99
f 114 79 96
f 114 96 136
f 114 136 10
f 79 78 95
f 79 95 96
f 24 97 115
f 24 115 78
f 24 78 19
f 59 11 29
f 59 29 36
f 36 39 61
f 36 29 32
f 36 32 4
f 36 4 39
f 61 39 68
f 61 68 97
f 97 4 9
f 97 9 100
f 97 100 115
f 97 68 4
f 11 16 29
f 136 84 83
f 136 96 95
f 136 95 135
f 136 135 85
f 136 85 84
f 83 84 33
f 83 33 31
f 31 33 6
f 6 33 34
f 6 34 5
f 6 5 90
f 6 90 91
f 91 90 17
f 91 17 18
f 71 17 81
f 71 81 45
f 45 81 14
f 45 14 77
f 45 77 130
f 77 14 57
f 77 57 87
f 77 87 16
f 16 87 29
f 78 115 95
f 115 100 9
f 115 9 135
f 115 135 95
f 29 87 53
f 29 53 32
f 39 4 68
f 32 53 14
f 32 14 81
f 32 81 4
f 4 81 135
f 4 135 9
f 84 85 34
f 84 34 33
f 135 81 82
f 135 82 85
f 5 34 30
f 5 30 81
f 5 81 90
f 90 81 17
f 81 30 82
f 14 53 57
f 57 53 87
f 85 82 30
f 85 30 34
@@ -0,0 +1,420 @@
# https://github.com/mikedh/trimesh
v -0.26173950 0.28096185 -0.18475724
v -0.26173950 0.29315015 -0.18475724
v -0.26177277 0.29301254 -0.18471875
v -0.26177277 0.28109946 -0.18471875
v -0.25922556 0.29313340 -0.18340414
v -0.25922556 0.28097860 -0.18340414
v -0.26223853 0.28096544 -0.18515763
v -0.26223853 0.29314656 -0.18515763
v -0.26116327 0.29301254 -0.18429066
v -0.26116327 0.28109946 -0.18429066
v -0.25819110 0.29301254 -0.18319097
v -0.25819110 0.28109946 -0.18319097
v -0.25819110 0.28096185 -0.18321664
v -0.25819110 0.29315015 -0.18321664
v -0.26149093 0.29301254 -0.18447787
v -0.26149093 0.28109946 -0.18447787
v -0.26264026 0.29315134 -0.18564171
v -0.26264026 0.28096066 -0.18564171
v -0.26192342 0.29315134 -0.18492988
v -0.26192342 0.28096066 -0.18492988
v -0.25970638 0.28100613 -0.18359603
v -0.25970638 0.29310587 -0.18359603
v -0.26042823 0.29311664 -0.18394626
v -0.26042823 0.28099536 -0.18394626
v -0.25925318 0.29301254 -0.18339627
v -0.25925318 0.28109946 -0.18339627
v -0.26078916 0.29312263 -0.18412152
v -0.26078916 0.28098937 -0.18412152
v -0.25961410 0.29301254 -0.18355024
v -0.25961410 0.28109946 -0.18355024
v -0.25961410 0.29313699 -0.18357386
v -0.25961410 0.28097501 -0.18357386
v -0.26115009 0.28098578 -0.18429678
v -0.26115009 0.29312622 -0.18429678
v -0.26167485 0.28098578 -0.18464993
v -0.26167485 0.29312622 -0.18464993
v -0.25743033 0.29311904 -0.18305683
v -0.25743033 0.28099296 -0.18305683
v -0.25890229 0.28094630 -0.18346684
v -0.25890229 0.28094630 -0.18337440
v -0.25890229 0.29316570 -0.18346684
v -0.25890229 0.29316570 -0.18337440
v -0.25730228 0.29314057 -0.18304487
v -0.25730228 0.28097143 -0.18304487
v -0.26282417 0.28096425 -0.18581435
v -0.26282417 0.29314775 -0.18581435
v -0.25694637 0.29301254 -0.18297547
v -0.25694637 0.28109946 -0.18297547
v -0.25694637 0.28094390 -0.18301980
v -0.25694637 0.28094390 -0.18311428
v -0.25694637 0.29316810 -0.18301980
v -0.25694637 0.29316810 -0.18311428
v -0.25659046 0.28095108 -0.18311574
v -0.25659046 0.28095108 -0.18303000
v -0.25659046 0.29316092 -0.18311574
v -0.25659046 0.29316092 -0.18303000
v -0.26280095 0.29314297 -0.18565104
v -0.26273692 0.29301254 -0.18554373
v -0.26273692 0.28109946 -0.18554373
v -0.26205084 0.29314177 -0.18498849
v -0.26205084 0.28097023 -0.18498849
v -0.25934231 0.29301254 -0.18342543
v -0.25934231 0.28109946 -0.18342543
v -0.25934231 0.28127655 -0.18342514
v -0.25934231 0.29283545 -0.18342514
v -0.25801346 0.28094749 -0.18320031
v -0.25801346 0.29316451 -0.18320031
v -0.26125178 0.29301254 -0.18433994
v -0.26125178 0.28109946 -0.18433994
v -0.26125178 0.28127655 -0.18433906
v -0.26125178 0.29283545 -0.18433906
v -0.26148717 0.28099895 -0.18448079
v -0.26148717 0.29311305 -0.18448079
v -0.26139490 0.29315374 -0.18457673
v -0.26139490 0.28095826 -0.18457673
v -0.25908056 0.29301254 -0.18335632
v -0.25908056 0.28109946 -0.18335632
v -0.25908056 0.29315733 -0.18338811
v -0.25908056 0.28095467 -0.18338811
v -0.25650007 0.29301254 -0.18316939
v -0.25650007 0.29301254 -0.18300288
v -0.25650007 0.29308434 -0.18301659
v -0.25650007 0.28109946 -0.18316939
v -0.25650007 0.28109946 -0.18300288
v -0.25650007 0.29308553 -0.18314402
v -0.25650007 0.29315733 -0.18311661
v -0.25650007 0.29315733 -0.18303350
v -0.25650007 0.28095467 -0.18311661
v -0.25650007 0.28095467 -0.18303350
v -0.26032466 0.28096544 -0.18392176
v -0.26032466 0.29314656 -0.18392176
v -0.26186316 0.29313579 -0.18481906
v -0.26186316 0.28097621 -0.18481906
v -0.25836874 0.29312143 -0.18323297
v -0.25836874 0.28099057 -0.18323297
v -0.25676873 0.29301254 -0.18298189
v -0.25676873 0.28109946 -0.18298189
v -0.25676873 0.28094630 -0.18302300
v -0.25676873 0.28094630 -0.18311428
v -0.25676873 0.29316570 -0.18302300
v -0.25676873 0.29316570 -0.18311428
v -0.26226238 0.29301254 -0.18513751
v -0.26226238 0.28109946 -0.18513751
v -0.26139176 0.29301254 -0.18441984
v -0.26139176 0.28109946 -0.18441984
v -0.26139176 0.29314177 -0.18445367
v -0.26139176 0.28127655 -0.18441926
v -0.26139176 0.29283545 -0.18441926
v -0.26139176 0.28097023 -0.18445367
v -0.26155559 0.28096903 -0.18458460
v -0.26155559 0.29314297 -0.18458460
v -0.26273316 0.28099775 -0.18554693
v -0.26273316 0.29311425 -0.18554693
v -0.26103585 0.29315254 -0.18427199
v -0.26103585 0.28095946 -0.18427199
v -0.25943584 0.29315374 -0.18353362
v -0.25943584 0.28095826 -0.18353362
v -0.26067994 0.28096185 -0.18409644
v -0.26067994 0.29315015 -0.18409644
v -0.25846039 0.29310228 -0.18324142
v -0.25846039 0.28100972 -0.18324142
v -0.25712401 0.29301254 -0.18299267
v -0.25712401 0.28109946 -0.18299267
v -0.25712401 0.28095108 -0.18302854
v -0.25712401 0.29316092 -0.18302854
v -0.26291205 0.29301254 -0.18569391
v -0.26291205 0.29301254 -0.18595403
v -0.26291205 0.28098578 -0.18593391
v -0.26291205 0.28098339 -0.18571170
v -0.26291205 0.28096305 -0.18581959
v -0.26291205 0.29314895 -0.18581959
v -0.26291205 0.29312861 -0.18571170
v -0.26291205 0.29312622 -0.18593391
v -0.26291205 0.28109946 -0.18569391
v -0.26291205 0.28109946 -0.18595403
v -0.26291205 0.28096664 -0.18589891
v -0.26291205 0.28096425 -0.18575573
v -0.26291205 0.28101809 -0.18594499
v -0.26291205 0.28099536 -0.18570791
v -0.26291205 0.29283545 -0.18595432
v -0.26291205 0.28115450 -0.18595432
f 130 137 129
f 130 129 139
f 130 139 134
f 130 134 126
f 130 126 132
f 130 132 131
f 130 131 133
f 130 133 127
f 130 127 140
f 130 140 141
f 130 141 135
f 130 135 138
f 130 138 128
f 130 128 136
f 130 136 45
f 130 45 99
f 130 99 50
f 130 50 18
f 130 18 137
f 137 18 20
f 137 20 1
f 137 1 7
f 137 7 129
f 136 88 53
f 136 53 99
f 136 99 45
f 136 128 88
f 99 53 54
f 99 54 98
f 99 98 49
f 99 49 50
f 50 49 40
f 50 40 39
f 50 39 18
f 18 39 40
f 18 40 75
f 18 75 20
f 20 75 1
f 1 75 115
f 1 115 109
f 1 109 110
f 1 110 61
f 1 61 7
f 7 61 129
f 129 61 93
f 129 93 35
f 129 35 112
f 129 112 139
f 88 89 54
f 88 54 53
f 88 128 83
f 88 83 80
f 88 80 85
f 88 85 86
f 88 86 87
f 88 87 82
f 88 82 81
f 88 81 84
f 88 84 89
f 128 138 83
f 98 54 97
f 98 97 48
f 98 48 49
f 49 124 66
f 49 66 40
f 49 48 124
f 40 66 79
f 40 79 115
f 40 115 75
f 115 79 117
f 115 117 118
f 115 118 33
f 115 33 109
f 109 33 72
f 109 72 35
f 109 35 110
f 110 35 93
f 110 93 61
f 35 72 112
f 112 72 103
f 112 103 59
f 112 59 134
f 112 134 139
f 89 84 97
f 89 97 54
f 83 138 135
f 83 135 141
f 83 141 140
f 83 140 80
f 97 84 81
f 97 81 96
f 97 96 47
f 97 47 48
f 48 123 124
f 48 47 122
f 48 122 123
f 124 44 13
f 124 13 79
f 124 79 66
f 124 123 44
f 79 13 95
f 79 95 6
f 79 6 32
f 79 32 117
f 117 90 118
f 117 32 90
f 118 90 33
f 33 90 32
f 33 32 28
f 33 28 10
f 33 10 72
f 72 10 69
f 72 69 105
f 72 105 16
f 72 16 4
f 72 4 103
f 103 4 3
f 103 3 102
f 103 102 58
f 103 58 59
f 59 58 126
f 59 126 134
f 80 140 127
f 80 127 133
f 80 133 85
f 96 81 82
f 96 82 87
f 96 87 56
f 96 56 100
f 96 100 47
f 123 12 121
f 123 121 38
f 123 38 44
f 123 122 11
f 123 11 12
f 47 100 51
f 47 51 125
f 47 125 122
f 44 38 95
f 44 95 13
f 95 38 121
f 95 121 6
f 6 121 77
f 6 77 26
f 6 26 63
f 6 63 21
f 6 21 32
f 32 21 28
f 28 21 24
f 28 24 10
f 10 70 69
f 10 24 21
f 10 21 30
f 10 30 29
f 10 29 9
f 10 9 71
f 10 71 70
f 69 70 105
f 105 70 107
f 105 107 16
f 16 107 108
f 16 108 15
f 16 15 3
f 16 3 4
f 102 3 73
f 102 73 113
f 102 113 58
f 58 113 126
f 126 113 132
f 133 131 46
f 133 46 86
f 133 86 85
f 87 86 55
f 87 55 56
f 56 55 101
f 56 101 100
f 100 101 52
f 100 52 51
f 12 77 121
f 12 11 76
f 12 76 77
f 122 125 43
f 122 43 37
f 122 37 120
f 122 120 11
f 51 52 41
f 51 41 42
f 51 42 67
f 51 67 125
f 125 67 78
f 125 78 14
f 125 14 43
f 77 76 25
f 77 25 26
f 26 64 63
f 26 25 65
f 26 65 64
f 63 30 21
f 63 64 30
f 70 71 108
f 70 108 107
f 30 64 65
f 30 65 29
f 9 29 22
f 9 22 23
f 9 23 27
f 9 27 34
f 9 34 73
f 9 73 68
f 9 68 71
f 15 108 104
f 15 104 73
f 15 73 3
f 73 34 106
f 73 106 36
f 73 36 113
f 73 104 68
f 113 36 132
f 132 36 92
f 132 92 60
f 132 60 8
f 132 8 57
f 132 57 131
f 131 57 8
f 131 8 19
f 131 19 17
f 131 17 52
f 131 52 101
f 131 101 46
f 46 101 55
f 46 55 86
f 11 120 76
f 43 94 37
f 43 14 94
f 37 94 120
f 120 94 5
f 120 5 76
f 52 17 41
f 42 41 17
f 42 17 74
f 42 74 114
f 42 114 78
f 42 78 67
f 78 114 116
f 78 116 31
f 78 31 5
f 78 5 94
f 78 94 14
f 76 5 25
f 25 5 62
f 25 62 65
f 71 68 104
f 71 104 108
f 29 65 62
f 29 62 22
f 22 5 31
f 22 31 27
f 22 27 23
f 22 62 5
f 27 31 34
f 34 31 91
f 34 91 119
f 34 119 114
f 34 114 106
f 106 114 2
f 106 2 111
f 106 111 36
f 36 111 92
f 92 111 60
f 60 111 2
f 60 2 8
f 8 2 19
f 19 74 17
f 19 2 74
f 74 2 114
f 114 119 116
f 116 119 91
f 116 91 31
@@ -0,0 +1,402 @@
# https://github.com/mikedh/trimesh
v -0.26541311 0.28096775 -0.19168858
v -0.26541311 0.29314425 -0.19168858
v -0.26528764 0.28109818 -0.19257582
v -0.26546415 0.29301382 -0.19257582
v -0.26487274 0.28098211 -0.18889483
v -0.26487274 0.29312989 -0.18889483
v -0.26347241 0.28096655 -0.18639144
v -0.26347241 0.29314545 -0.18639144
v -0.26330595 0.28096296 -0.18617654
v -0.26330595 0.29314904 -0.18617654
v -0.26528738 0.29301263 -0.19257582
v -0.26528738 0.28109937 -0.19257582
v -0.26529493 0.29301263 -0.19008792
v -0.26529493 0.28109937 -0.19008792
v -0.26505429 0.29313468 -0.18941761
v -0.26505429 0.28097732 -0.18941761
v -0.26539475 0.28100484 -0.19121970
v -0.26539475 0.29310716 -0.19121970
v -0.26327251 0.28098570 -0.18606807
v -0.26327251 0.29312630 -0.18606807
v -0.26441158 0.28096536 -0.18779000
v -0.26441158 0.29314664 -0.18779000
v -0.26489537 0.29315622 -0.18902149
v -0.26489537 0.28095578 -0.18902149
v -0.26542015 0.29315382 -0.19186644
v -0.26542015 0.28095818 -0.19186644
v -0.26415032 0.29310596 -0.18732920
v -0.26415032 0.28100604 -0.18732920
v -0.26301879 0.29301263 -0.18578513
v -0.26301879 0.28109937 -0.18578513
v -0.26548150 0.29301263 -0.19239999
v -0.26548150 0.28109937 -0.19239999
v -0.26434997 0.29313827 -0.18765257
v -0.26434997 0.28097373 -0.18765257
v -0.26450864 0.28099886 -0.18785737
v -0.26450864 0.29311314 -0.18785737
v -0.26455214 0.29301263 -0.18795438
v -0.26455214 0.28109937 -0.18795438
v -0.26524589 0.29301263 -0.18991209
v -0.26524589 0.28109937 -0.18991209
v -0.26451115 0.29301263 -0.18785333
v -0.26451115 0.28109937 -0.18785333
v -0.26523559 0.29313827 -0.18994106
v -0.26523559 0.28097373 -0.18994106
v -0.26366879 0.28096177 -0.18671009
v -0.26366879 0.29315023 -0.18671009
v -0.26292123 0.28098450 -0.18571641
v -0.26292123 0.29312750 -0.18571641
v -0.26539928 0.29311793 -0.19133288
v -0.26539928 0.28099407 -0.19133288
v -0.26298510 0.28096177 -0.18582420
v -0.26298510 0.29315023 -0.18582420
v -0.26534019 0.29316100 -0.19257582
v -0.26534019 0.28095100 -0.19257582
v -0.26312063 0.29301263 -0.18587406
v -0.26312063 0.28109937 -0.18587406
v -0.26534270 0.28094501 -0.19239999
v -0.26534270 0.29316699 -0.19239999
v -0.26327930 0.29301263 -0.18605797
v -0.26327930 0.28109937 -0.18605797
v -0.26507642 0.29315861 -0.18955437
v -0.26507642 0.28095339 -0.18955437
v -0.26399090 0.29313588 -0.18712440
v -0.26399090 0.28097612 -0.18712440
v -0.26543725 0.28094501 -0.19239999
v -0.26543725 0.29316699 -0.19239999
v -0.26542694 0.29316100 -0.19204429
v -0.26542694 0.28095100 -0.19204429
v -0.26531429 0.29301263 -0.19026577
v -0.26531429 0.28109937 -0.19026577
v -0.26310755 0.29313707 -0.18588618
v -0.26310755 0.28097493 -0.18588618
v -0.26291293 0.28098570 -0.18593401
v -0.26291293 0.29301263 -0.18569418
v -0.26291293 0.29301263 -0.18595422
v -0.26291293 0.28098330 -0.18571237
v -0.26291293 0.28096296 -0.18582016
v -0.26291293 0.29314904 -0.18582016
v -0.26291293 0.29312870 -0.18571237
v -0.26291293 0.28115561 -0.18595490
v -0.26291293 0.29283433 -0.18595490
v -0.26291293 0.28109937 -0.18569418
v -0.26291293 0.28109937 -0.18595422
v -0.26291293 0.29312630 -0.18593401
v -0.26291293 0.28096655 -0.18589966
v -0.26291293 0.28096416 -0.18575616
v -0.26291293 0.28101801 -0.18594547
v -0.26291293 0.28099527 -0.18570833
v -0.26544731 0.29301263 -0.19186644
v -0.26544731 0.28109937 -0.19186644
v -0.26533969 0.29315981 -0.19257582
v -0.26383173 0.28096536 -0.18691961
v -0.26383173 0.29314664 -0.18691961
v -0.26320964 0.29301263 -0.18596904
v -0.26320964 0.28109937 -0.18596904
v -0.26452800 0.29314186 -0.18795438
v -0.26452800 0.28097014 -0.18795438
v -0.26540607 0.28097971 -0.19151073
v -0.26540607 0.29313229 -0.19151073
v -0.26539576 0.29301263 -0.19120758
v -0.26539576 0.28109937 -0.19120758
v -0.26525495 0.28094980 -0.19008792
v -0.26525495 0.29316220 -0.19008792
v -0.26445106 0.29301263 -0.18776440
v -0.26445106 0.28109937 -0.18776440
v -0.26363183 0.28098091 -0.18659624
v -0.26363183 0.29313109 -0.18659624
v -0.26455340 0.29316100 -0.18813223
v -0.26455340 0.28095100 -0.18813223
v -0.26547497 0.29301263 -0.19222214
v -0.26547497 0.28109937 -0.19222214
v -0.26471206 0.28096057 -0.18848793
v -0.26471206 0.29315143 -0.18848793
v -0.26543398 0.28094621 -0.19222214
v -0.26543398 0.29316579 -0.19222214
v -0.26474274 0.29301263 -0.18848793
v -0.26474274 0.28109937 -0.18848793
v -0.26517021 0.28094382 -0.19026577
v -0.26517021 0.29316818 -0.19026577
v -0.26415133 0.29301263 -0.18732786
v -0.26415133 0.28109937 -0.18732786
v -0.26469144 0.29312391 -0.18837139
v -0.26469144 0.28098809 -0.18837139
v -0.26542870 0.29316100 -0.19257582
v -0.26542870 0.28095100 -0.19257582
v -0.26469647 0.29301263 -0.18835724
v -0.26469647 0.28109937 -0.18835724
v -0.26540557 0.29301263 -0.19133288
v -0.26540557 0.28109937 -0.19133288
v -0.26526475 0.28094382 -0.19026577
v -0.26526475 0.29316818 -0.19026577
v -0.26546441 0.29301263 -0.19257582
v -0.26546441 0.28109937 -0.19257582
v -0.26446086 0.29316100 -0.18813223
v -0.26446086 0.28095100 -0.18813223
f 74 79 48
f 74 48 29
f 74 29 30
f 74 30 82
f 74 82 88
f 74 88 76
f 74 76 86
f 74 86 77
f 74 77 85
f 74 85 73
f 74 73 87
f 74 87 83
f 74 83 80
f 74 80 81
f 74 81 75
f 74 75 84
f 74 84 78
f 74 78 79
f 79 71 48
f 79 78 52
f 79 52 71
f 48 71 55
f 48 55 29
f 29 55 56
f 29 56 30
f 82 30 47
f 82 47 88
f 71 20 94
f 71 94 55
f 71 52 10
f 71 10 20
f 78 53 58
f 78 58 52
f 78 84 53
f 52 58 119
f 52 119 134
f 52 134 108
f 52 108 10
f 55 94 95
f 55 95 56
f 30 56 47
f 47 72 76
f 47 76 88
f 47 56 72
f 20 36 27
f 20 27 59
f 20 59 94
f 20 10 8
f 20 8 107
f 20 107 36
f 94 59 60
f 94 60 95
f 10 108 46
f 10 46 93
f 10 93 8
f 53 91 11
f 53 11 12
f 53 12 3
f 53 3 54
f 53 54 125
f 53 125 133
f 53 133 132
f 53 132 4
f 53 4 124
f 53 124 66
f 53 66 58
f 53 84 91
f 58 66 131
f 58 131 119
f 84 75 11
f 84 11 91
f 119 131 108
f 119 108 134
f 108 131 103
f 108 103 23
f 108 23 113
f 108 113 96
f 108 96 22
f 108 22 93
f 108 93 46
f 56 95 72
f 72 19 9
f 72 9 51
f 72 51 86
f 72 86 76
f 72 95 19
f 36 107 63
f 36 63 33
f 36 33 96
f 36 96 122
f 36 122 126
f 36 126 37
f 36 37 41
f 36 41 104
f 36 104 27
f 27 104 120
f 27 120 59
f 59 120 121
f 59 121 60
f 8 93 33
f 8 33 63
f 8 63 107
f 95 60 19
f 93 22 33
f 124 4 31
f 124 31 66
f 66 115 131
f 66 31 115
f 75 81 11
f 11 81 80
f 11 80 12
f 131 115 67
f 131 67 25
f 131 25 103
f 103 61 23
f 103 25 2
f 103 2 99
f 103 99 49
f 103 49 18
f 103 18 13
f 103 13 43
f 103 43 61
f 23 61 43
f 23 43 113
f 113 43 15
f 113 15 6
f 113 6 122
f 113 122 96
f 96 33 22
f 19 28 35
f 19 35 106
f 19 106 7
f 19 7 9
f 19 60 28
f 9 7 92
f 9 92 45
f 9 45 109
f 9 109 51
f 51 109 135
f 51 135 118
f 51 118 57
f 51 57 77
f 51 77 86
f 122 6 15
f 122 15 39
f 122 39 116
f 122 116 126
f 126 116 117
f 126 117 127
f 126 127 38
f 126 38 37
f 37 38 42
f 37 42 41
f 41 42 105
f 41 105 104
f 104 105 121
f 104 121 120
f 60 121 28
f 4 132 31
f 31 110 115
f 31 132 133
f 31 133 32
f 31 32 111
f 31 111 110
f 115 110 67
f 12 80 83
f 12 83 87
f 12 87 73
f 12 73 3
f 67 110 25
f 25 110 2
f 2 110 99
f 99 110 49
f 49 110 18
f 18 110 89
f 18 89 128
f 18 128 100
f 18 100 69
f 18 69 13
f 13 39 43
f 13 69 70
f 13 70 14
f 13 14 40
f 13 40 39
f 43 39 15
f 28 121 105
f 28 105 35
f 35 123 97
f 35 97 34
f 35 34 64
f 35 64 106
f 35 105 42
f 35 42 38
f 35 38 127
f 35 127 123
f 106 64 7
f 7 64 34
f 7 34 92
f 92 21 109
f 92 109 45
f 92 34 21
f 109 24 102
f 109 102 130
f 109 130 118
f 109 118 135
f 109 21 97
f 109 97 112
f 109 112 24
f 118 130 65
f 118 65 57
f 57 65 125
f 57 125 54
f 57 54 77
f 77 54 85
f 39 40 117
f 39 117 116
f 127 117 123
f 110 111 90
f 110 90 89
f 32 133 125
f 32 125 65
f 32 65 114
f 32 114 111
f 73 85 54
f 73 54 3
f 89 90 129
f 89 129 128
f 128 129 101
f 128 101 100
f 100 101 70
f 100 70 69
f 14 70 17
f 14 17 102
f 14 102 44
f 14 44 40
f 123 16 5
f 123 5 112
f 123 112 97
f 123 117 40
f 123 40 16
f 97 21 34
f 24 62 102
f 24 112 44
f 24 44 62
f 102 17 50
f 102 50 98
f 102 98 1
f 102 1 26
f 102 26 130
f 102 62 44
f 130 114 65
f 130 26 68
f 130 68 114
f 112 5 16
f 112 16 44
f 40 44 16
f 111 114 68
f 111 68 26
f 111 26 1
f 111 1 98
f 111 98 50
f 111 50 17
f 111 17 90
f 90 17 129
f 129 17 101
f 101 17 70
@@ -0,0 +1,327 @@
# https://github.com/mikedh/trimesh
v -0.26008573 0.29312391 -0.20014538
v -0.26008573 0.28098809 -0.20014538
v -0.26174712 0.28096176 -0.19912273
v -0.26174712 0.29315024 -0.19912273
v -0.25819125 0.29301263 -0.20076829
v -0.25819125 0.28109937 -0.20076829
v -0.25819125 0.28094382 -0.20062433
v -0.25819125 0.28094382 -0.20071875
v -0.25819125 0.29316818 -0.20062433
v -0.25819125 0.29316818 -0.20071875
v -0.26133235 0.29313468 -0.19944498
v -0.26133235 0.28097732 -0.19944498
v -0.26196209 0.29301263 -0.19903298
v -0.26196209 0.28109937 -0.19903298
v -0.26060272 0.29301263 -0.19996489
v -0.26060272 0.28109937 -0.19996489
v -0.25890278 0.29315861 -0.20053041
v -0.25890278 0.28095339 -0.20053041
v -0.26112731 0.29310596 -0.19960414
v -0.26112731 0.28100604 -0.19960414
v -0.26069210 0.29301263 -0.19990480
v -0.26069210 0.28109937 -0.19990480
v -0.25851605 0.29313827 -0.20068957
v -0.25851605 0.28097373 -0.20068957
v -0.26238912 0.28098570 -0.19872643
v -0.26238912 0.29312630 -0.19872643
v -0.25659062 0.29315383 -0.20087399
v -0.25659062 0.28095817 -0.20087399
v -0.26050224 0.29301263 -0.20000584
v -0.26050224 0.28109937 -0.20000584
v -0.26050224 0.29314186 -0.19998181
v -0.26050224 0.28097014 -0.19998181
v -0.25694638 0.28097971 -0.20086001
v -0.25694638 0.29313229 -0.20086001
v -0.25906342 0.29301263 -0.20051667
v -0.25906342 0.28109937 -0.20051667
v -0.26059922 0.28099886 -0.19996243
v -0.26059922 0.29311314 -0.19996243
v -0.26246798 0.29314306 -0.19846083
v -0.26246798 0.28096775 -0.19861435
v -0.26246798 0.28122382 -0.19840296
v -0.26246798 0.29301263 -0.19840418
v -0.26246798 0.29301263 -0.19867934
v -0.26246798 0.28106826 -0.19840786
v -0.26246798 0.29314665 -0.19860675
v -0.26246798 0.29283434 -0.19840296
v -0.26246798 0.28109937 -0.19840418
v -0.26246798 0.28109937 -0.19867934
v -0.26246798 0.29314425 -0.19861435
v -0.26246798 0.28096894 -0.19846034
v -0.26246798 0.28107664 -0.19867640
v -0.25956231 0.28098330 -0.20032686
v -0.25956231 0.29312870 -0.20032686
v -0.26009975 0.29301263 -0.20015029
v -0.26009975 0.28109937 -0.20015029
v -0.26080368 0.29313827 -0.19980376
v -0.26080368 0.28097373 -0.19980376
v -0.26239847 0.29301263 -0.19873329
v -0.26239847 0.28109937 -0.19873329
v -0.26245221 0.28096655 -0.19862220
v -0.25996889 0.29301263 -0.20019664
v -0.25996889 0.28109937 -0.20019664
v -0.25996889 0.28096176 -0.20016598
v -0.25996889 0.29315024 -0.20016598
v -0.25650007 0.29301263 -0.20090832
v -0.25650007 0.29301263 -0.20074180
v -0.25650007 0.29308203 -0.20089483
v -0.25650007 0.28109937 -0.20090832
v -0.25650007 0.28109937 -0.20074180
v -0.25650007 0.29308801 -0.20076780
v -0.25650007 0.29315741 -0.20087742
v -0.25650007 0.29315741 -0.20079429
v -0.25650007 0.28095459 -0.20087742
v -0.25650007 0.28095459 -0.20079429
v -0.26206549 0.28096655 -0.19892654
v -0.26206549 0.29314545 -0.19892654
v -0.25836884 0.28094980 -0.20070894
v -0.25836884 0.29301263 -0.20074892
v -0.25836884 0.28109937 -0.20074892
v -0.25836884 0.29316220 -0.20070894
v -0.25723730 0.28100484 -0.20084873
v -0.25723730 0.29310716 -0.20084873
v -0.26032465 0.29316100 -0.20000731
v -0.26032465 0.29316100 -0.19991486
v -0.26032465 0.28095100 -0.20000731
v -0.26032465 0.28095100 -0.19991486
v -0.25676879 0.28096775 -0.20086712
v -0.25676879 0.29314425 -0.20086712
v -0.26228046 0.28096296 -0.19876002
v -0.26228046 0.29314904 -0.19876002
v -0.25943613 0.29301263 -0.20038498
v -0.25943613 0.29315622 -0.20034918
v -0.25943613 0.28095578 -0.20034918
v -0.25943613 0.28109937 -0.20038498
v -0.26186045 0.28098091 -0.19908570
v -0.26186045 0.29313109 -0.19908570
v -0.26121785 0.29301263 -0.19954405
v -0.26121785 0.28109937 -0.19954405
v -0.25724957 0.29301263 -0.20084971
v -0.25724957 0.28109937 -0.20084971
v -0.26229273 0.28096416 -0.19862710
v -0.26229273 0.29314784 -0.19862710
v -0.25712397 0.29311793 -0.20085314
v -0.25712397 0.28099407 -0.20085314
v -0.26153740 0.28096535 -0.19928557
v -0.26153740 0.29314665 -0.19928557
v -0.26066698 0.28096535 -0.19986532
v -0.26066698 0.29314665 -0.19986532
v -0.25854468 0.29301263 -0.20069987
v -0.25854468 0.28109937 -0.20069987
f 40 89 60
f 40 60 50
f 40 50 44
f 40 44 47
f 40 47 41
f 40 41 46
f 40 46 42
f 40 42 39
f 40 39 45
f 40 45 49
f 40 49 43
f 40 43 48
f 40 48 51
f 40 51 25
f 40 25 89
f 89 101 60
f 89 25 75
f 89 75 3
f 89 3 85
f 89 85 86
f 89 86 101
f 60 101 50
f 50 101 74
f 50 74 44
f 51 48 25
f 25 48 59
f 25 59 20
f 25 20 37
f 25 37 95
f 25 95 75
f 101 86 7
f 101 7 74
f 75 105 3
f 75 95 12
f 75 12 57
f 75 57 105
f 3 105 85
f 85 77 8
f 85 8 7
f 85 7 86
f 85 105 107
f 85 107 32
f 85 32 63
f 85 63 93
f 85 93 77
f 74 7 8
f 74 8 73
f 74 73 68
f 74 68 65
f 74 65 67
f 74 67 71
f 74 71 72
f 74 72 70
f 74 70 66
f 74 66 69
f 74 69 44
f 44 69 47
f 48 43 58
f 48 58 59
f 59 14 20
f 59 58 13
f 59 13 14
f 20 14 98
f 20 98 22
f 20 22 37
f 37 2 32
f 37 32 57
f 37 57 12
f 37 12 95
f 37 22 16
f 37 16 30
f 37 30 55
f 37 55 2
f 105 57 107
f 57 32 107
f 77 87 28
f 77 28 8
f 77 93 18
f 77 18 24
f 77 24 79
f 77 79 81
f 77 81 104
f 77 104 33
f 77 33 87
f 8 28 73
f 32 2 63
f 63 2 52
f 63 52 24
f 63 24 93
f 93 24 18
f 73 28 68
f 69 41 47
f 69 66 46
f 69 46 41
f 43 49 26
f 43 26 58
f 14 13 97
f 14 97 98
f 58 26 19
f 58 19 13
f 98 97 21
f 98 21 22
f 22 21 15
f 22 15 16
f 2 55 62
f 2 62 94
f 2 94 36
f 2 36 110
f 2 110 52
f 16 15 29
f 16 29 30
f 30 29 54
f 30 54 55
f 55 54 61
f 55 61 62
f 87 33 68
f 87 68 28
f 24 52 110
f 24 110 79
f 79 6 81
f 79 110 109
f 79 109 78
f 79 78 5
f 79 5 6
f 81 6 100
f 81 100 68
f 81 68 104
f 104 68 33
f 68 100 99
f 68 99 65
f 66 70 42
f 66 42 46
f 49 45 90
f 49 90 26
f 26 90 76
f 26 76 96
f 26 96 38
f 26 38 19
f 13 19 97
f 19 38 21
f 19 21 97
f 21 38 15
f 62 61 91
f 62 91 94
f 94 91 35
f 94 35 36
f 36 35 109
f 36 109 110
f 15 38 29
f 29 38 54
f 54 38 1
f 54 1 61
f 6 5 99
f 6 99 100
f 78 109 23
f 78 23 80
f 78 80 82
f 78 82 5
f 65 99 82
f 65 82 103
f 65 103 67
f 70 72 42
f 42 72 39
f 45 102 90
f 45 39 102
f 90 102 84
f 90 84 83
f 90 83 4
f 90 4 76
f 76 4 106
f 76 106 56
f 76 56 11
f 76 11 96
f 96 11 38
f 38 11 56
f 38 56 31
f 38 31 1
f 61 1 91
f 91 1 35
f 35 1 109
f 109 1 53
f 109 53 23
f 1 31 64
f 1 64 53
f 5 82 99
f 23 53 64
f 23 64 92
f 23 92 17
f 23 17 80
f 80 17 92
f 80 92 83
f 80 83 10
f 80 10 27
f 80 27 88
f 80 88 34
f 80 34 103
f 80 103 82
f 103 34 67
f 67 34 88
f 67 88 27
f 67 27 71
f 72 71 10
f 72 10 9
f 72 9 102
f 72 102 39
f 102 9 84
f 84 9 10
f 84 10 83
f 83 92 64
f 83 64 31
f 83 31 108
f 83 108 106
f 83 106 4
f 106 108 56
f 56 108 31
f 10 71 27
@@ -0,0 +1,435 @@
# https://github.com/mikedh/trimesh
v -0.26528768 0.28109748 -0.19257649
v -0.26542847 0.28095153 -0.19257829
v -0.26542847 0.29316047 -0.19257829
v -0.26546426 0.28109987 -0.19257829
v -0.26546426 0.29301213 -0.19257829
v -0.26525688 0.29316525 -0.19346716
v -0.26525688 0.28094675 -0.19346716
v -0.26416631 0.28109987 -0.19661706
v -0.26416631 0.29301213 -0.19661706
v -0.26470896 0.28096948 -0.19542353
v -0.26470896 0.29314252 -0.19542353
v -0.26434025 0.28109987 -0.19625326
v -0.26434025 0.29301213 -0.19625326
v -0.26510054 0.28109987 -0.19453405
v -0.26510054 0.29301213 -0.19453405
v -0.26528739 0.28109987 -0.19257649
v -0.26528739 0.29301213 -0.19257649
v -0.26540002 0.28099340 -0.19288414
v -0.26540002 0.29311860 -0.19288414
v -0.26488290 0.28097546 -0.19506810
v -0.26488290 0.29313654 -0.19506810
v -0.26411733 0.28109987 -0.19670606
v -0.26411733 0.29301213 -0.19670606
v -0.26436049 0.29315090 -0.19613439
v -0.26436049 0.28096110 -0.19613439
v -0.26521552 0.28100895 -0.19391399
v -0.26521552 0.29310305 -0.19391399
v -0.26373836 0.28109987 -0.19722637
v -0.26373836 0.29301213 -0.19722637
v -0.26508235 0.29316645 -0.19435664
v -0.26508235 0.28094555 -0.19435664
v -0.26403784 0.29283509 -0.19684525
v -0.26403784 0.28127691 -0.19684525
v -0.26397888 0.28109987 -0.19694501
v -0.26397888 0.29301213 -0.19694501
v -0.26503102 0.29283509 -0.19479570
v -0.26503102 0.28127691 -0.19479570
v -0.26264251 0.29314850 -0.19827773
v -0.26264251 0.28096350 -0.19827773
v -0.26498996 0.29316645 -0.19435664
v -0.26498996 0.28094555 -0.19435664
v -0.26468784 0.28109987 -0.19552568
v -0.26468784 0.29301213 -0.19552568
v -0.26369964 0.29314970 -0.19719351
v -0.26369964 0.28096230 -0.19719351
v -0.26516390 0.29316525 -0.19346716
v -0.26516390 0.28094675 -0.19346716
v -0.26503073 0.28109987 -0.19479570
v -0.26503073 0.29301213 -0.19479570
v -0.26380700 0.29312697 -0.19712900
v -0.26380700 0.28098503 -0.19712900
v -0.26397595 0.29311262 -0.19694143
v -0.26397595 0.28099938 -0.19694143
v -0.26258326 0.28109987 -0.19857462
v -0.26258326 0.29301213 -0.19857462
v -0.26541205 0.28097067 -0.19275630
v -0.26541205 0.29314133 -0.19275630
v -0.26492308 0.28095752 -0.19489008
v -0.26492308 0.29315448 -0.19489008
v -0.26523283 0.28109987 -0.19382319
v -0.26523283 0.29301213 -0.19382319
v -0.26416015 0.29312697 -0.19660451
v -0.26416015 0.28098503 -0.19660451
v -0.26246798 0.29314611 -0.19860628
v -0.26246798 0.28122428 -0.19840258
v -0.26246798 0.28096828 -0.19847426
v -0.26246798 0.29314372 -0.19846052
v -0.26246798 0.28107594 -0.19867617
v -0.26246798 0.28106877 -0.19840735
v -0.26246798 0.28109987 -0.19867856
v -0.26246798 0.28109987 -0.19840377
v -0.26246798 0.28096948 -0.19845992
v -0.26246798 0.29283509 -0.19840258
v -0.26246798 0.29314491 -0.19861404
v -0.26246798 0.28096709 -0.19861404
v -0.26246798 0.29301213 -0.19867856
v -0.26246798 0.29301213 -0.19840377
v -0.26524045 0.29314970 -0.19364518
v -0.26524045 0.28096230 -0.19364518
v -0.26517387 0.29316405 -0.19328975
v -0.26517387 0.28094795 -0.19328975
v -0.26506886 0.28095512 -0.19453405
v -0.26506886 0.29315688 -0.19453405
v -0.26534018 0.28095153 -0.19257649
v -0.26534018 0.29316047 -0.19257649
v -0.26363775 0.28097546 -0.19731717
v -0.26363775 0.29313654 -0.19731717
v -0.26451067 0.28099460 -0.19588170
v -0.26451067 0.29311740 -0.19588170
v -0.26248822 0.28109987 -0.19866303
v -0.26248822 0.29301213 -0.19866303
v -0.26403696 0.28109987 -0.19684525
v -0.26403696 0.29301213 -0.19684525
v -0.26346850 0.28096948 -0.19750474
v -0.26346850 0.29314252 -0.19750474
v -0.26540383 0.28109987 -0.19290385
v -0.26540383 0.29301213 -0.19290385
v -0.26506065 0.28109987 -0.19470669
v -0.26506065 0.29301213 -0.19470669
v -0.26267214 0.28109987 -0.19847247
v -0.26267214 0.29301213 -0.19847247
v -0.26418509 0.29315329 -0.19648982
v -0.26418509 0.28095871 -0.19648982
v -0.26352717 0.29315090 -0.19737750
v -0.26352717 0.28096110 -0.19737750
v -0.26486090 0.28100656 -0.19516009
v -0.26486090 0.29310544 -0.19516009
v -0.26533960 0.29315927 -0.19257649
v -0.26329926 0.29314611 -0.19769291
v -0.26329926 0.28096589 -0.19769291
v -0.26400323 0.28096948 -0.19684525
v -0.26400323 0.29314252 -0.19684525
v -0.26388033 0.29315329 -0.19684883
v -0.26388033 0.28095871 -0.19684883
v -0.26246974 0.28096828 -0.19845873
v -0.26291002 0.29311381 -0.19818693
v -0.26291002 0.28099819 -0.19818693
v -0.26542906 0.28095273 -0.19257649
v -0.26505273 0.29313295 -0.19467861
v -0.26505273 0.28097905 -0.19467861
v -0.26331950 0.28109987 -0.19771621
v -0.26331950 0.29301213 -0.19771621
v -0.26387241 0.28096948 -0.19700952
v -0.26387241 0.29314252 -0.19700952
v -0.26522403 0.28099101 -0.19382319
v -0.26522403 0.29312099 -0.19382319
v -0.26274077 0.29312697 -0.19837450
v -0.26274077 0.28098503 -0.19837450
v -0.26542877 0.28095153 -0.19257649
v -0.26542877 0.29316047 -0.19257649
v -0.26453531 0.29314731 -0.19577836
v -0.26453531 0.28096469 -0.19577836
v -0.26274840 0.28109987 -0.19838346
v -0.26274840 0.29301213 -0.19838346
v -0.26546455 0.28109987 -0.19257649
v -0.26546455 0.29301213 -0.19257649
v -0.26364948 0.28109987 -0.19733031
v -0.26364948 0.29301213 -0.19733031
v -0.26263312 0.29315090 -0.19843901
v -0.26263312 0.28096110 -0.19843901
v -0.26411792 0.29283509 -0.19670606
v -0.26411792 0.28127691 -0.19670606
v -0.26490636 0.28109987 -0.19506810
v -0.26490636 0.29301213 -0.19506810
v -0.26257153 0.28097546 -0.19856147
v -0.26257153 0.29313654 -0.19856147
f 85 80 46
f 85 46 6
f 85 6 130
f 85 130 136
f 85 136 135
f 85 135 118
f 85 118 129
f 85 129 84
f 85 84 1
f 85 1 16
f 85 16 17
f 85 17 108
f 85 108 67
f 85 67 38
f 85 38 139
f 85 139 80
f 80 139 46
f 46 40 30
f 46 30 6
f 46 139 40
f 130 6 3
f 130 3 57
f 130 57 136
f 108 17 67
f 67 64 139
f 67 139 38
f 67 17 77
f 67 77 73
f 67 73 65
f 67 65 71
f 67 71 69
f 67 69 72
f 67 72 66
f 67 66 75
f 67 75 68
f 67 68 70
f 67 70 76
f 67 76 74
f 67 74 64
f 139 109 44
f 139 44 104
f 139 104 102
f 139 102 113
f 139 113 30
f 139 30 40
f 139 64 74
f 139 74 146
f 139 146 109
f 6 30 83
f 6 83 3
f 3 83 78
f 3 78 57
f 57 126 19
f 57 19 136
f 57 78 126
f 136 19 5
f 136 5 4
f 136 4 135
f 17 73 77
f 17 16 65
f 17 65 73
f 109 146 95
f 109 95 44
f 44 102 104
f 44 95 124
f 44 124 112
f 44 112 102
f 102 112 62
f 102 62 24
f 102 24 59
f 102 59 30
f 102 30 113
f 30 59 83
f 74 76 146
f 146 127 87
f 146 87 95
f 146 76 91
f 146 91 55
f 146 55 127
f 83 59 21
f 83 21 119
f 83 119 27
f 83 27 126
f 83 126 78
f 126 27 19
f 19 27 5
f 5 27 97
f 5 97 96
f 5 96 4
f 135 4 18
f 135 18 56
f 135 56 118
f 16 1 69
f 16 69 71
f 16 71 65
f 95 87 124
f 124 87 50
f 124 50 112
f 112 50 52
f 112 52 62
f 62 52 23
f 62 23 9
f 62 9 107
f 62 107 89
f 62 89 21
f 62 21 11
f 62 11 131
f 62 131 24
f 24 131 59
f 59 131 11
f 59 11 21
f 76 70 90
f 76 90 91
f 127 50 87
f 127 55 116
f 127 116 50
f 91 90 54
f 91 54 55
f 55 101 116
f 55 54 100
f 55 100 101
f 21 89 107
f 21 107 119
f 119 107 49
f 119 49 99
f 119 99 15
f 119 15 27
f 27 15 61
f 27 61 97
f 97 61 60
f 97 60 96
f 4 96 26
f 4 26 18
f 18 26 125
f 18 125 56
f 56 125 79
f 56 79 2
f 56 2 129
f 56 129 118
f 1 84 72
f 1 72 69
f 50 116 52
f 52 116 122
f 52 122 138
f 52 138 29
f 52 29 35
f 52 35 93
f 52 93 23
f 23 93 32
f 23 32 141
f 23 141 9
f 9 13 107
f 9 141 142
f 9 142 8
f 9 8 12
f 9 12 13
f 107 13 43
f 107 43 144
f 107 144 49
f 70 68 90
f 116 101 134
f 116 134 122
f 90 68 145
f 90 145 54
f 101 100 133
f 101 133 134
f 54 145 128
f 54 128 117
f 54 117 100
f 49 144 36
f 49 36 99
f 99 36 37
f 99 37 98
f 99 98 14
f 99 14 15
f 15 14 60
f 15 60 61
f 96 60 26
f 26 120 82
f 26 82 125
f 26 60 14
f 26 14 120
f 125 82 79
f 79 82 2
f 2 82 7
f 2 7 129
f 129 7 47
f 129 47 84
f 84 47 81
f 84 81 140
f 84 140 39
f 84 39 115
f 84 115 72
f 72 115 66
f 122 134 133
f 122 133 121
f 122 121 137
f 122 137 138
f 138 137 28
f 138 28 29
f 29 28 34
f 29 34 35
f 35 32 93
f 35 34 33
f 35 33 32
f 32 33 142
f 32 142 141
f 13 12 42
f 13 42 43
f 8 142 22
f 8 22 63
f 8 63 106
f 8 106 12
f 43 42 143
f 43 143 144
f 144 143 37
f 144 37 36
f 68 75 145
f 145 86 128
f 145 75 140
f 145 140 110
f 145 110 94
f 145 94 86
f 100 117 133
f 128 86 51
f 128 51 117
f 117 53 121
f 117 121 133
f 117 51 53
f 98 37 48
f 98 48 120
f 98 120 14
f 120 48 106
f 120 106 20
f 120 20 82
f 82 58 31
f 82 31 7
f 82 20 58
f 7 31 41
f 7 41 47
f 47 41 140
f 47 140 81
f 140 75 115
f 140 115 39
f 140 41 31
f 140 31 114
f 140 114 103
f 140 103 105
f 140 105 45
f 140 45 110
f 115 75 66
f 121 53 137
f 137 53 28
f 28 53 34
f 34 53 92
f 34 92 33
f 33 92 22
f 33 22 142
f 12 106 42
f 22 92 53
f 22 53 63
f 63 20 88
f 63 88 106
f 63 53 111
f 63 111 103
f 63 103 25
f 63 25 132
f 63 132 10
f 63 10 20
f 106 88 20
f 106 48 143
f 106 143 42
f 143 48 37
f 86 94 123
f 86 123 51
f 110 45 94
f 94 45 123
f 51 123 111
f 51 111 53
f 20 10 58
f 58 25 103
f 58 103 31
f 58 10 132
f 58 132 25
f 31 103 114
f 103 111 45
f 103 45 105
f 45 111 123
@@ -0,0 +1,882 @@
# https://github.com/mikedh/trimesh
v -0.24041728 0.28170523 -0.16315417
v -0.24080128 0.28615125 -0.17024032
v -0.22553343 0.28180928 -0.18090464
v -0.22335741 0.28080672 -0.18961136
v -0.22335741 0.28081040 -0.19031913
v -0.23555325 0.28090588 -0.16571563
v -0.23164923 0.28443013 -0.17639119
v -0.23062522 0.28691266 -0.19031913
v -0.24109305 0.29241632 -0.18190170
v -0.24147705 0.29250568 -0.18163488
v -0.24070905 0.29325607 -0.18554729
v -0.22883321 0.28251193 -0.17621706
v -0.23814903 0.28382052 -0.16820688
v -0.22480119 0.28253519 -0.18894010
v -0.23123699 0.28159996 -0.17074025
v -0.23104499 0.28170645 -0.17118401
v -0.22899698 0.28096586 -0.17247879
v -0.22899698 0.28108215 -0.17247879
v -0.24100081 0.29314712 -0.18438171
v -0.23965681 0.29253261 -0.19031913
v -0.23959281 0.29320098 -0.18894010
v -0.24087281 0.29322547 -0.18492377
v -0.23824880 0.29186424 -0.18626068
v -0.22560496 0.28092057 -0.17889648
v -0.23927280 0.28698121 -0.17269224
v -0.22323694 0.28154365 -0.19031913
v -0.23370477 0.28573382 -0.17651758
v -0.23300077 0.28575953 -0.17776180
v -0.22871274 0.28079938 -0.17354325
v -0.24209635 0.28122905 -0.16162909
v -0.24209635 0.28156446 -0.16201387
v -0.24209635 0.29188383 -0.17961268
v -0.24209635 0.28986402 -0.17552052
v -0.24209635 0.29283620 -0.18160680
v -0.24209635 0.29325607 -0.18375539
v -0.24209635 0.28088384 -0.16228350
v -0.24209635 0.29313611 -0.18227244
v -0.24209635 0.28716115 -0.17102392
v -0.24209635 0.28180316 -0.16235091
v -0.24209635 0.29329769 -0.18292404
v -0.24209635 0.28101482 -0.16252504
v -0.24209635 0.29057646 -0.17688270
v -0.24209635 0.28084590 -0.16162909
v -0.24209635 0.29329524 -0.18291280
v -0.24209635 0.28953718 -0.17496160
v -0.24209635 0.29023371 -0.17620863
v -0.24209635 0.29253016 -0.18096362
v -0.24209635 0.29317283 -0.18236793
v -0.24209635 0.29317283 -0.18375539
v -0.24209635 0.28214959 -0.16287050
v -0.24209635 0.28313011 -0.16437030
v -0.24209635 0.29274806 -0.18355317
v -0.24209635 0.28514747 -0.16769290
v -0.24209635 0.29288639 -0.18171633
v -0.24209635 0.29316549 -0.18233984
v -0.24209635 0.28085446 -0.16221048
v -0.24209635 0.28917974 -0.17436337
v -0.24209635 0.28253151 -0.16344627
v -0.24209635 0.28350959 -0.16498539
v -0.22958051 0.28177623 -0.17304613
v -0.24030434 0.28111887 -0.16240708
v -0.24030434 0.28092914 -0.16240708
v -0.24081634 0.28249357 -0.16418213
v -0.24081634 0.28119844 -0.16217396
v -0.24081634 0.28088507 -0.16217396
v -0.23953633 0.29255954 -0.18559222
v -0.23364830 0.28093526 -0.16708624
v -0.23364830 0.28111275 -0.16708624
v -0.23403230 0.28156813 -0.16747102
v -0.23089628 0.28178969 -0.17153228
v -0.23070428 0.28084222 -0.17085259
v -0.22948827 0.28252172 -0.17488296
v -0.23906010 0.28639975 -0.17184685
v -0.22750426 0.28385602 -0.18425251
v -0.22520025 0.28157670 -0.18090464
v -0.22468824 0.28137349 -0.18154782
v -0.23522007 0.28163301 -0.16661158
v -0.22289623 0.28118131 -0.18961136
v -0.22289623 0.28086670 -0.18961136
v -0.22289623 0.28084222 -0.19031913
v -0.22805203 0.28153875 -0.17482679
v -0.24043987 0.29306633 -0.18933050
v -0.24043987 0.29310183 -0.18933050
v -0.23999187 0.29327198 -0.19031913
v -0.23999187 0.29284721 -0.19031913
v -0.22626002 0.28114703 -0.17755677
v -0.22626002 0.28090710 -0.17755677
v -0.22286800 0.28120946 -0.19031913
v -0.22286800 0.28120946 -0.19027981
v -0.22286800 0.28084467 -0.19031913
v -0.22286800 0.28084467 -0.19027981
v -0.23378383 0.28165382 -0.16790916
v -0.23160782 0.28646585 -0.18291280
v -0.22469577 0.28080672 -0.18224435
v -0.23708361 0.28437627 -0.16986115
v -0.22354377 0.28085202 -0.18626068
v -0.23093958 0.28714034 -0.19031913
v -0.23023557 0.28245439 -0.17370053
v -0.22825156 0.28090955 -0.17354325
v -0.22825156 0.28115560 -0.17354325
v -0.23833539 0.29247508 -0.19027981
v -0.22498754 0.28240053 -0.18693194
v -0.24029116 0.28443625 -0.16775469
v -0.23997116 0.28161220 -0.16330865
v -0.22412730 0.28186926 -0.18760039
v -0.23632314 0.28095117 -0.16511178
v -0.23632314 0.28109562 -0.16511178
v -0.22495930 0.28175052 -0.18224435
v -0.23005110 0.28085079 -0.17154351
v -0.24135093 0.29291454 -0.18291280
v -0.22365106 0.28108338 -0.18503893
v -0.22365106 0.28096464 -0.18503893
v -0.23373489 0.28839262 -0.18459236
v -0.23341488 0.28086793 -0.16754404
v -0.23341488 0.28121925 -0.16754404
v -0.23953069 0.29324138 -0.18961136
v -0.23946669 0.28681473 -0.17225409
v -0.23357865 0.28850647 -0.18626068
v -0.22634661 0.28106012 -0.17717480
v -0.22634661 0.28099279 -0.17717480
v -0.22749861 0.28183988 -0.17688832
v -0.22564260 0.28173828 -0.18044964
v -0.22295459 0.28092546 -0.18894010
v -0.22295459 0.28111765 -0.18894010
v -0.23367842 0.28642423 -0.17844429
v -0.23489442 0.28177378 -0.16705815
v -0.23297441 0.28242012 -0.17042288
v -0.23060640 0.28689797 -0.19027981
v -0.24107423 0.28100381 -0.16180884
v -0.24107423 0.28105032 -0.16180884
v -0.22913439 0.28163913 -0.17330733
v -0.22875039 0.28090220 -0.17292536
v -0.22875039 0.28117151 -0.17292536
v -0.24005022 0.29323648 -0.18697407
v -0.22683038 0.28319009 -0.18291280
v -0.23473819 0.28088384 -0.16633072
v -0.23473819 0.28080305 -0.16684751
v -0.23301018 0.28108460 -0.16778839
v -0.23301018 0.28096219 -0.16778839
v -0.22961816 0.28243481 -0.17440831
v -0.24168599 0.29313611 -0.18291280
v -0.24034199 0.29313978 -0.18574108
v -0.24142999 0.28147754 -0.16219082
v -0.24142999 0.28188885 -0.16279748
v -0.22872215 0.28149591 -0.17353483
v -0.24008598 0.28084590 -0.16280590
v -0.23861398 0.28630549 -0.17203783
v -0.22462613 0.28150203 -0.18224435
v -0.22456213 0.28155344 -0.18291280
v -0.22430612 0.28094505 -0.18170791
v -0.22430612 0.28110174 -0.18170791
v -0.22360212 0.28089976 -0.18559222
v -0.22360212 0.28114336 -0.18559222
v -0.22901392 0.28574239 -0.19031913
v -0.22536589 0.28082019 -0.18023619
v -0.22299788 0.28106501 -0.18847106
v -0.22299788 0.28098667 -0.18847106
v -0.23436171 0.28641077 -0.17717199
v -0.23359371 0.28177868 -0.16835573
v -0.24105352 0.29109794 -0.17917734
v -0.22828168 0.28176399 -0.17501216
v -0.22597766 0.28353652 -0.19031913
v -0.22424965 0.28116662 -0.18224435
v -0.22424965 0.28087772 -0.18224435
v -0.23433348 0.28108338 -0.16646273
v -0.23433348 0.28096464 -0.16646273
v -0.23036545 0.28573260 -0.18319928
v -0.22767744 0.28373116 -0.18250555
v -0.23840127 0.28572526 -0.17118401
v -0.23942527 0.28081162 -0.16349963
v -0.23526525 0.29026431 -0.19031913
v -0.23187323 0.28161832 -0.17003248
v -0.23084922 0.28384622 -0.17621706
v -0.22848121 0.28163056 -0.17421170
v -0.23971704 0.29311285 -0.18760039
v -0.23946104 0.29327076 -0.19031913
v -0.22508919 0.28164525 -0.18139053
v -0.22489719 0.28179582 -0.18291280
v -0.22419318 0.28084222 -0.18291280
v -0.23286900 0.28853462 -0.19031913
v -0.23338100 0.28153630 -0.16815351
v -0.24167282 0.29045650 -0.17711020
v -0.24128882 0.28296118 -0.16463150
v -0.23975281 0.29308714 -0.18722684
v -0.23808880 0.28128291 -0.16415123
v -0.23808880 0.28084834 -0.16415123
v -0.22691696 0.28089364 -0.17621706
v -0.22691696 0.28116049 -0.17621706
v -0.23021675 0.28179459 -0.17233836
v -0.22836074 0.28100381 -0.17318656
v -0.22836074 0.28105032 -0.17318656
v -0.24190058 0.29166838 -0.17938518
v -0.23908457 0.28103563 -0.16315979
v -0.23908457 0.28102339 -0.16315979
v -0.23946857 0.29327198 -0.19027981
v -0.23812456 0.28615615 -0.17223724
v -0.23799656 0.29223515 -0.19031913
v -0.23607655 0.28181663 -0.16631668
v -0.23569254 0.28775853 -0.17848642
v -0.22500448 0.28171870 -0.18183710
v -0.22391647 0.28153508 -0.18626068
v -0.23444830 0.28166606 -0.16721824
v -0.24165211 0.28174073 -0.16243517
v -0.22881627 0.28184968 -0.17421170
v -0.24190811 0.28966939 -0.17532392
v -0.24120411 0.28164647 -0.16255594
v -0.24184411 0.29299533 -0.18474964
v -0.24184411 0.29318140 -0.18474964
v -0.22670426 0.28080917 -0.17755677
v -0.23979610 0.29304062 -0.18678027
v -0.22802003 0.28085936 -0.17422575
v -0.22802003 0.28127434 -0.17422575
v -0.22757203 0.28117396 -0.17488296
v -0.22757203 0.28088262 -0.17488296
v -0.22603602 0.28081407 -0.17889648
v -0.22699602 0.28306768 -0.18182025
v -0.23746385 0.28547309 -0.17157722
v -0.22494801 0.28111887 -0.18023619
v -0.22494801 0.28093526 -0.18023619
v -0.23490383 0.28313256 -0.16966174
v -0.22895180 0.28175909 -0.17375390
v -0.24076363 0.28155956 -0.16270198
v -0.24076363 0.28177745 -0.16303621
v -0.23833162 0.29180426 -0.18573266
v -0.23833162 0.29247630 -0.19031913
v -0.22568778 0.28100748 -0.17853417
v -0.23609161 0.28085324 -0.16549937
v -0.24169541 0.28909405 -0.17449537
v -0.22949957 0.28520500 -0.18358406
v -0.24022340 0.29321690 -0.18626068
v -0.24009540 0.29330504 -0.18827165
v -0.24009540 0.29329769 -0.18760039
v -0.23753538 0.29189852 -0.19027981
v -0.22373953 0.28099524 -0.19031913
v -0.24032316 0.29248242 -0.18369641
v -0.23929915 0.29226086 -0.19031913
v -0.23526713 0.29026309 -0.19027981
v -0.24176694 0.29308224 -0.18257577
v -0.22963510 0.28111031 -0.17177101
v -0.22963510 0.28093648 -0.17177101
v -0.23027510 0.28091689 -0.17106605
v -0.22502707 0.28103441 -0.17989354
v -0.22502707 0.28102462 -0.17989354
v -0.22483507 0.28184111 -0.18358406
v -0.22323506 0.28154487 -0.19027981
v -0.22349106 0.28083488 -0.18693194
v -0.23389489 0.28562733 -0.17607101
v -0.23498289 0.28912343 -0.18425251
v -0.23287088 0.28853462 -0.19027981
v -0.24122670 0.29033286 -0.17737140
v -0.22698285 0.28374952 -0.18626068
v -0.22621484 0.28247153 -0.18157590
v -0.22365483 0.28172604 -0.18907772
v -0.23674667 0.28087650 -0.16497135
v -0.22327082 0.28151549 -0.18961136
v -0.23469866 0.28153753 -0.16683908
v -0.23774244 0.28505199 -0.17052399
v -0.23607843 0.28404208 -0.17019819
v -0.23409442 0.28087405 -0.16685593
v -0.23409442 0.28122537 -0.16685593
v -0.24193823 0.29298676 -0.18212920
v -0.23963422 0.29251303 -0.19031913
v -0.22763038 0.28376543 -0.18291280
v -0.23765020 0.29113956 -0.18504735
v -0.23566619 0.28173216 -0.16645992
v -0.22321435 0.28152406 -0.19031913
v -0.24165399 0.28979792 -0.17576768
v -0.24152599 0.29323281 -0.18358406
v -0.22766615 0.28096586 -0.17445605
v -0.22766615 0.28108215 -0.17445605
v -0.22817815 0.28250214 -0.17755677
v -0.23902998 0.28708893 -0.17313881
v -0.22600213 0.28349123 -0.18961136
v -0.23557396 0.28985545 -0.18559222
v -0.23422995 0.28179582 -0.16766481
v -0.23237394 0.28100013 -0.16849617
v -0.23237394 0.28105400 -0.16849617
v -0.24143376 0.28092179 -0.16174144
v -0.24143376 0.28245317 -0.16369343
v -0.24143376 0.28112744 -0.16174144
v -0.24143376 0.28080550 -0.16215992
v -0.22533389 0.28187661 -0.18159837
v -0.23752973 0.28447053 -0.16970668
v -0.22360588 0.28176154 -0.18961136
v -0.23272970 0.28080305 -0.16885567
v -0.22940168 0.28087038 -0.17223443
v -0.23903751 0.29244937 -0.18643481
v -0.22479366 0.28085324 -0.18090464
v -0.22479366 0.28124129 -0.18090464
v -0.22402565 0.28081162 -0.18559222
v -0.22325765 0.28155956 -0.19031913
v -0.23250947 0.28163178 -0.16932471
v -0.24195329 0.29289985 -0.18425251
v -0.24195329 0.29325362 -0.18425251
v -0.24124929 0.28899856 -0.17466389
f 89 91 90
f 89 90 88
f 89 88 245
f 89 245 78
f 89 78 79
f 89 79 91
f 91 4 80
f 91 80 90
f 91 79 246
f 91 246 4
f 88 90 80
f 88 80 5
f 88 5 234
f 88 234 236
f 88 236 262
f 88 262 20
f 88 20 85
f 88 85 84
f 88 84 176
f 88 176 225
f 88 225 197
f 88 197 171
f 88 171 180
f 88 180 97
f 88 97 8
f 88 8 154
f 88 154 162
f 88 162 291
f 88 291 26
f 88 26 266
f 88 266 245
f 245 284 255
f 245 255 78
f 245 266 26
f 245 26 291
f 245 291 162
f 245 162 154
f 245 154 8
f 245 8 128
f 245 128 284
f 78 153 124
f 78 124 123
f 78 123 79
f 78 255 163
f 78 163 153
f 4 5 80
f 4 246 290
f 4 290 94
f 4 94 29
f 4 29 281
f 4 281 5
f 79 123 152
f 79 152 164
f 79 164 96
f 79 96 246
f 246 96 179
f 246 179 94
f 246 94 290
f 284 273 253
f 284 253 255
f 284 128 249
f 284 249 273
f 255 253 201
f 255 201 148
f 255 148 163
f 8 97 128
f 128 97 249
f 153 163 111
f 153 111 124
f 124 111 156
f 124 156 157
f 124 157 123
f 163 148 151
f 163 151 111
f 5 281 56
f 5 56 234
f 94 179 288
f 94 288 155
f 94 155 215
f 94 215 209
f 94 209 29
f 29 209 288
f 29 288 211
f 29 211 99
f 29 99 286
f 29 286 109
f 29 109 71
f 29 71 285
f 29 285 137
f 29 137 281
f 281 137 170
f 281 170 186
f 281 186 146
f 281 146 65
f 281 65 43
f 281 43 56
f 123 157 112
f 123 112 152
f 152 112 164
f 164 150 288
f 164 288 179
f 164 179 96
f 164 112 150
f 273 14 253
f 273 249 237
f 273 237 14
f 253 14 105
f 253 105 149
f 253 149 201
f 249 97 180
f 249 180 171
f 249 171 197
f 249 197 237
f 201 149 148
f 148 108 200
f 148 200 151
f 148 149 108
f 111 151 150
f 111 150 112
f 111 112 157
f 111 157 156
f 151 200 76
f 151 76 289
f 151 289 218
f 151 218 242
f 151 242 243
f 151 243 150
f 234 56 36
f 234 36 236
f 56 43 30
f 56 30 31
f 56 31 39
f 56 39 50
f 56 50 58
f 56 58 51
f 56 51 59
f 56 59 53
f 56 53 38
f 56 38 57
f 56 57 45
f 56 45 33
f 56 33 46
f 56 46 42
f 56 42 32
f 56 32 47
f 56 47 34
f 56 34 54
f 56 54 37
f 56 37 55
f 56 55 48
f 56 48 44
f 56 44 40
f 56 40 35
f 56 35 49
f 56 49 52
f 56 52 41
f 56 41 36
f 288 150 219
f 288 219 24
f 288 24 87
f 288 87 187
f 288 187 214
f 288 214 211
f 288 209 215
f 288 215 155
f 211 214 99
f 99 190 132
f 99 132 286
f 99 214 269
f 99 269 190
f 286 132 240
f 286 240 241
f 286 241 114
f 286 114 109
f 109 114 71
f 71 114 285
f 285 114 137
f 137 114 259
f 137 259 227
f 137 227 170
f 170 227 186
f 186 65 146
f 186 227 254
f 186 254 65
f 65 62 129
f 65 129 278
f 65 278 43
f 65 254 62
f 43 278 280
f 43 280 30
f 150 243 219
f 14 237 102
f 14 102 105
f 237 197 233
f 237 233 175
f 237 175 118
f 237 118 102
f 105 102 244
f 105 244 178
f 105 178 149
f 149 178 108
f 197 225 101
f 197 101 233
f 108 178 135
f 108 135 229
f 108 229 113
f 108 113 263
f 108 263 200
f 200 282 177
f 200 177 76
f 200 263 113
f 200 113 168
f 200 168 282
f 76 177 75
f 76 75 289
f 289 75 218
f 218 75 86
f 218 86 270
f 218 270 119
f 218 119 242
f 242 119 270
f 242 270 269
f 242 269 120
f 242 120 243
f 236 36 262
f 36 41 85
f 36 85 20
f 36 20 262
f 219 243 226
f 219 226 120
f 219 120 269
f 219 269 87
f 219 87 24
f 87 269 187
f 187 269 214
f 190 269 270
f 190 270 191
f 190 191 277
f 190 277 276
f 190 276 139
f 190 139 17
f 190 17 132
f 132 17 240
f 240 17 139
f 240 139 67
f 240 67 241
f 241 67 114
f 114 67 259
f 259 67 166
f 259 166 136
f 259 136 227
f 227 136 254
f 254 136 6
f 254 6 62
f 62 6 106
f 62 106 129
f 129 194 193
f 129 193 130
f 129 130 280
f 129 280 278
f 129 106 166
f 129 166 194
f 30 280 31
f 243 120 226
f 102 118 251
f 102 251 74
f 102 74 178
f 102 178 244
f 233 101 175
f 175 134 184
f 175 184 274
f 175 274 118
f 175 101 21
f 175 21 134
f 118 274 135
f 118 135 74
f 118 74 251
f 178 74 135
f 225 176 101
f 101 176 195
f 101 195 116
f 101 116 21
f 135 274 229
f 229 274 113
f 113 274 184
f 113 184 23
f 113 23 287
f 113 287 224
f 113 224 168
f 282 252 3
f 282 3 177
f 282 168 252
f 177 3 75
f 168 224 167
f 168 167 216
f 168 216 252
f 75 3 122
f 75 122 81
f 75 81 86
f 86 81 188
f 86 188 270
f 270 188 213
f 270 213 81
f 270 81 212
f 270 212 100
f 270 100 191
f 41 52 82
f 41 82 85
f 85 82 83
f 85 83 84
f 191 100 145
f 191 145 133
f 191 133 18
f 191 18 277
f 276 277 138
f 276 138 139
f 139 138 68
f 139 68 67
f 67 68 165
f 67 165 166
f 166 165 193
f 166 193 194
f 166 106 6
f 166 6 136
f 130 61 64
f 130 64 222
f 130 222 206
f 130 206 143
f 130 143 280
f 130 193 165
f 130 165 61
f 280 143 31
f 31 143 203
f 31 203 39
f 134 232 230
f 134 230 210
f 134 210 184
f 134 21 116
f 134 116 195
f 134 195 232
f 184 210 287
f 184 287 23
f 176 84 195
f 195 84 231
f 195 231 232
f 287 210 230
f 287 230 224
f 224 230 142
f 224 142 66
f 224 66 264
f 224 264 248
f 224 248 167
f 252 216 3
f 3 216 122
f 167 248 216
f 216 248 93
f 216 93 125
f 216 125 122
f 122 125 271
f 122 271 12
f 122 12 121
f 122 121 161
f 122 161 81
f 81 161 174
f 81 174 212
f 81 213 188
f 212 174 100
f 100 174 145
f 52 49 293
f 52 293 82
f 82 293 207
f 82 207 208
f 82 208 83
f 84 83 294
f 84 294 35
f 84 35 40
f 84 40 231
f 145 174 221
f 145 221 131
f 145 131 15
f 145 15 133
f 133 15 239
f 133 239 18
f 18 239 138
f 18 138 277
f 138 239 68
f 68 239 15
f 68 15 172
f 68 172 115
f 68 115 181
f 68 181 69
f 68 69 202
f 68 202 260
f 68 260 165
f 165 104 185
f 165 185 107
f 165 107 61
f 165 260 202
f 165 202 256
f 165 256 77
f 165 77 104
f 61 185 104
f 61 104 222
f 61 222 64
f 61 107 185
f 222 104 1
f 222 1 223
f 222 223 206
f 206 223 144
f 206 144 203
f 206 203 143
f 203 58 50
f 203 50 39
f 203 144 51
f 203 51 58
f 232 11 230
f 232 231 40
f 232 40 11
f 230 11 22
f 230 22 142
f 142 22 19
f 142 19 264
f 142 264 66
f 264 19 235
f 264 235 248
f 248 235 125
f 248 125 93
f 125 28 173
f 125 173 12
f 125 12 271
f 125 235 110
f 125 110 141
f 125 141 28
f 12 173 72
f 12 72 161
f 12 161 121
f 161 72 174
f 174 204 221
f 174 72 204
f 49 35 208
f 49 208 207
f 49 207 293
f 83 208 294
f 294 208 35
f 40 44 268
f 40 268 22
f 40 22 11
f 221 158 27
f 221 27 98
f 221 98 60
f 221 60 15
f 221 15 131
f 221 204 140
f 221 140 9
f 221 9 158
f 15 16 172
f 15 60 16
f 172 16 159
f 172 159 292
f 172 292 115
f 115 292 181
f 181 159 92
f 181 92 69
f 181 292 159
f 69 275 202
f 69 92 275
f 202 126 256
f 202 275 147
f 202 147 25
f 202 25 95
f 202 95 126
f 104 265 1
f 104 77 265
f 256 126 77
f 77 126 265
f 1 63 223
f 1 265 198
f 1 198 63
f 223 63 279
f 223 279 144
f 144 279 51
f 51 279 59
f 22 268 19
f 19 268 141
f 19 141 110
f 19 110 235
f 28 7 173
f 28 141 238
f 28 238 7
f 173 7 72
f 141 268 48
f 141 48 55
f 141 55 238
f 72 199 140
f 72 140 204
f 72 7 238
f 72 238 9
f 72 9 199
f 44 48 268
f 158 9 27
f 27 247 98
f 27 9 10
f 27 10 247
f 98 247 189
f 98 189 60
f 60 189 16
f 140 199 9
f 9 238 261
f 9 261 54
f 9 54 34
f 9 34 10
f 16 189 70
f 16 70 127
f 16 127 159
f 159 275 92
f 159 127 220
f 159 220 217
f 159 217 258
f 159 258 275
f 275 258 217
f 275 217 196
f 275 196 272
f 275 272 267
f 275 267 147
f 126 198 265
f 126 95 257
f 126 257 169
f 126 169 283
f 126 283 198
f 147 267 25
f 25 257 95
f 25 267 295
f 25 295 257
f 63 183 279
f 63 198 13
f 63 13 283
f 63 283 103
f 63 103 2
f 63 2 53
f 63 53 183
f 198 283 13
f 279 183 59
f 59 183 53
f 238 55 261
f 55 37 261
f 247 160 196
f 247 196 217
f 247 217 220
f 247 220 127
f 247 127 70
f 247 70 189
f 247 10 160
f 10 34 47
f 10 47 160
f 261 37 54
f 196 160 250
f 196 250 182
f 196 182 272
f 272 182 267
f 267 182 42
f 267 42 46
f 267 46 33
f 267 33 205
f 267 205 295
f 257 295 169
f 169 73 283
f 169 295 73
f 283 73 2
f 283 2 103
f 295 205 228
f 295 228 117
f 295 117 73
f 2 73 117
f 2 117 228
f 2 228 53
f 53 228 38
f 160 192 182
f 160 182 250
f 160 47 192
f 47 32 182
f 47 182 192
f 182 32 42
f 33 45 205
f 205 45 228
f 228 45 57
f 228 57 38
@@ -0,0 +1,576 @@
# https://github.com/mikedh/trimesh
v -0.24880126 0.29330215 -0.17688694
v -0.24880126 0.29181002 -0.17444633
v -0.24880126 0.29316506 -0.17642964
v -0.24880126 0.29293983 -0.17609660
v -0.24477437 0.29260321 -0.17819920
v -0.24946936 0.29324584 -0.17630288
v -0.24946936 0.28080691 -0.15947958
v -0.24946936 0.29245755 -0.17514720
v -0.24946936 0.28085832 -0.15900488
v -0.24946936 0.28119372 -0.15900488
v -0.24946936 0.28152911 -0.15938265
v -0.24409077 0.29324340 -0.18021979
v -0.24214004 0.29285904 -0.18160412
v -0.24214004 0.29317607 -0.18230996
v -0.24746225 0.28086567 -0.15967095
v -0.24746225 0.28152422 -0.16006115
v -0.24746225 0.29051251 -0.17304708
v -0.24305903 0.28305185 -0.16381402
v -0.24892389 0.28093054 -0.15907198
v -0.24892389 0.28111783 -0.15907198
v -0.24357349 0.28175067 -0.16175119
v -0.24429796 0.29316506 -0.17972520
v -0.24209635 0.29274887 -0.18355264
v -0.24209635 0.28986376 -0.17552000
v -0.24209635 0.29313568 -0.18227268
v -0.24209635 0.28988457 -0.17555728
v -0.24209635 0.28122922 -0.16162941
v -0.24209635 0.29122859 -0.17824394
v -0.24209635 0.29057616 -0.17688445
v -0.24209635 0.28088403 -0.16228305
v -0.24209635 0.28953693 -0.17495831
v -0.24209635 0.28180330 -0.16235016
v -0.24209635 0.29252977 -0.18096291
v -0.24209635 0.29188468 -0.17961336
v -0.24209635 0.29317240 -0.18375395
v -0.24209635 0.29317240 -0.18236713
v -0.24209635 0.28101501 -0.16252661
v -0.24209635 0.28084608 -0.16162941
v -0.24209635 0.28384137 -0.16553388
v -0.24209635 0.28344722 -0.16488272
v -0.24209635 0.29288597 -0.18171597
v -0.24209635 0.29316506 -0.18233979
v -0.24209635 0.28156339 -0.16201215
v -0.24209635 0.29329848 -0.18292384
v -0.24209635 0.28313019 -0.16437074
v -0.24209635 0.28917706 -0.17435686
v -0.24209635 0.29057739 -0.17688694
v -0.24209635 0.29021139 -0.17616619
v -0.24209635 0.28085465 -0.16221098
v -0.24209635 0.29023465 -0.17621093
v -0.24209635 0.28253162 -0.16344619
v -0.24209635 0.28216562 -0.16289445
v -0.24209635 0.29283578 -0.18160661
v -0.24209635 0.29325564 -0.18375395
v -0.25374432 0.29241715 -0.17386973
v -0.25226718 0.29313445 -0.17513726
v -0.24764126 0.29314669 -0.17711559
v -0.25044190 0.28438607 -0.16315292
v -0.24301533 0.29044274 -0.17581824
v -0.24213723 0.28085832 -0.16221346
v -0.25208535 0.29325808 -0.17548272
v -0.24212172 0.28951980 -0.17491109
v -0.24291526 0.28914523 -0.17374049
v -0.24278982 0.29320912 -0.18160412
v -0.25616581 0.29328134 -0.17490115
v -0.25616581 0.29328134 -0.17542556
v -0.25616581 0.28372753 -0.16179841
v -0.25616581 0.28080936 -0.15881102
v -0.25616581 0.28115332 -0.15837857
v -0.25616581 0.28148872 -0.15875138
v -0.25616581 0.28088770 -0.15837857
v -0.24373699 0.28506298 -0.16649074
v -0.24301251 0.28097461 -0.16111991
v -0.24301251 0.28107498 -0.16111991
v -0.24427964 0.29250651 -0.17840548
v -0.24305339 0.28440076 -0.16580727
v -0.25482680 0.28109335 -0.15843077
v -0.25482680 0.29326176 -0.17495334
v -0.25482680 0.28095135 -0.15843077
v -0.24362423 0.29182960 -0.17774438
v -0.24277431 0.28783916 -0.17167766
v -0.24277431 0.29330582 -0.18224534
v -0.24277431 0.28221948 -0.16271053
v -0.24444596 0.28571786 -0.16717918
v -0.24294063 0.28511806 -0.16706486
v -0.24816558 0.29321524 -0.17688943
v -0.25348779 0.29323115 -0.17500553
v -0.25348779 0.28307143 -0.16110997
v -0.24417957 0.29118207 -0.17624075
v -0.24257698 0.29300593 -0.18140033
v -0.24239516 0.28372753 -0.16514120
v -0.24226972 0.28645841 -0.16974157
v -0.25649563 0.28843528 -0.16946321
v -0.25649563 0.29249549 -0.17376038
v -0.25649563 0.28831532 -0.16929918
v -0.25649563 0.29240369 -0.17488624
v -0.25649563 0.28315712 -0.16099316
v -0.25649563 0.28116556 -0.15836615
v -0.25649563 0.28150096 -0.15873895
v -0.25649563 0.29211236 -0.17448858
v -0.25649563 0.29252977 -0.17505524
v -0.25649563 0.28096115 -0.15924099
v -0.25649563 0.28087669 -0.15836615
v -0.25649563 0.29269379 -0.17523419
v -0.25649563 0.29328012 -0.17541313
v -0.25649563 0.28154013 -0.16003381
v -0.25649563 0.28080814 -0.15881102
v -0.25649563 0.28175312 -0.15907447
v -0.25649563 0.29326298 -0.17485890
v -0.25649563 0.29306591 -0.17455569
v -0.25649563 0.29286394 -0.17541313
v -0.25649563 0.29311487 -0.17462528
v -0.25649563 0.28163071 -0.15890795
v -0.25281688 0.29319198 -0.17506021
v -0.25281688 0.29123104 -0.17231887
v -0.25281688 0.29328257 -0.17554734
v -0.25281688 0.29156520 -0.17277866
v -0.25281688 0.29180879 -0.17311419
v -0.24233878 0.28239575 -0.16312558
v -0.25036438 0.29176962 -0.17383494
v -0.25147787 0.28185471 -0.15960385
v -0.25147787 0.29325564 -0.17561196
v -0.24616835 0.29320545 -0.17823648
v -0.24796544 0.29301082 -0.17666823
v -0.25013886 0.28123656 -0.15896015
v -0.25013886 0.28181554 -0.15965604
v -0.25013886 0.28215093 -0.16011583
v -0.25013886 0.28157073 -0.15932052
v -0.25013886 0.28083384 -0.15896015
v -0.24743547 0.29325196 -0.17751822
v -0.24498297 0.28095747 -0.16043893
v -0.24565107 0.29313935 -0.17846762
v -0.25112691 0.28638987 -0.16583709
v -0.24839533 0.29175983 -0.17451840
v -0.24679275 0.29331072 -0.17822654
v -0.24679275 0.29317118 -0.17774190
v -0.25375841 0.28103704 -0.15847053
v -0.25375841 0.28102112 -0.15847053
v -0.24545374 0.28150585 -0.16074959
v -0.24545374 0.28087913 -0.16035939
v -0.24545374 0.28117168 -0.16035939
v -0.24545374 0.28080569 -0.16081918
v -0.24775261 0.29243062 -0.17585304
v -0.24256853 0.29034114 -0.17597979
v -0.24474195 0.29325319 -0.17952638
v -0.24543823 0.29324584 -0.17886527
v -0.24238670 0.29311120 -0.18184769
v -0.24493646 0.29317974 -0.17906659
v -0.25233483 0.29177819 -0.17315395
v -0.24233032 0.29113433 -0.17776427
v -0.25549630 0.29327400 -0.17492849
v -0.25549630 0.28172374 -0.15911175
v -0.25549630 0.28112517 -0.15840591
v -0.25549630 0.28453296 -0.16295161
v -0.25549630 0.28091586 -0.15840591
v -0.24344382 0.28089627 -0.16104783
v -0.24344382 0.28253284 -0.16292675
v -0.24344382 0.28115332 -0.16104783
v -0.24344382 0.28080814 -0.16149022
v -0.24235570 0.28976828 -0.17515714
v -0.25415729 0.29218336 -0.17351681
v -0.25415729 0.29324707 -0.17498068
v -0.25415729 0.28105907 -0.15845562
v -0.25415729 0.28099297 -0.15845562
v -0.25415729 0.29160438 -0.17272399
v -0.24210481 0.28156461 -0.16200966
v -0.24210481 0.29329848 -0.18291390
v -0.24210481 0.28313019 -0.16436577
v -0.24210481 0.28917951 -0.17435437
v -0.24210481 0.28180208 -0.16234518
v -0.24695343 0.28094278 -0.15975546
v -0.24695343 0.28110436 -0.15975546
v -0.25029672 0.29312466 -0.17582073
v -0.24214568 0.28346925 -0.16488521
v -0.24344100 0.29322748 -0.18091071
v -0.24976676 0.28237861 -0.16047123
v -0.24231200 0.29047456 -0.17642467
v -0.24886046 0.29256771 -0.17552746
v -0.24912403 0.29241470 -0.17520933
v -0.24509714 0.28170538 -0.16114725
v -0.25214737 0.29255425 -0.17433946
v -0.24903946 0.28172374 -0.15978031
v -0.24768777 0.29110496 -0.17382997
v -0.24366088 0.29314792 -0.18043104
v -0.24841224 0.29310385 -0.17651662
v -0.25080836 0.28439832 -0.16313552
v -0.25080836 0.29318709 -0.17573125
v -0.25080836 0.28083017 -0.15893778
v -0.25080836 0.29329481 -0.17621838
v -0.25080836 0.28357452 -0.16200718
v -0.25080836 0.29045988 -0.17178453
v -0.24300547 0.29247101 -0.17977740
v -0.24700417 0.29044886 -0.17313904
f 27 158 74
f 27 74 73
f 27 73 38
f 27 38 49
f 27 49 30
f 27 30 37
f 27 37 23
f 27 23 35
f 27 35 54
f 27 54 44
f 27 44 36
f 27 36 42
f 27 42 25
f 27 25 41
f 27 41 53
f 27 53 33
f 27 33 34
f 27 34 28
f 27 28 47
f 27 47 29
f 27 29 50
f 27 50 48
f 27 48 26
f 27 26 24
f 27 24 31
f 27 31 46
f 27 46 39
f 27 39 40
f 27 40 45
f 27 45 51
f 27 51 52
f 27 52 32
f 27 32 43
f 27 43 166
f 27 166 158
f 158 139 16
f 158 16 141
f 158 141 20
f 158 20 172
f 158 172 74
f 158 166 139
f 74 172 20
f 74 20 19
f 74 19 73
f 38 73 156
f 38 156 140
f 38 140 15
f 38 15 9
f 38 9 129
f 38 129 159
f 38 159 49
f 43 32 166
f 166 32 170
f 166 170 21
f 166 21 180
f 166 180 16
f 166 16 139
f 16 182 11
f 16 11 20
f 16 20 141
f 16 180 182
f 20 11 10
f 20 10 137
f 20 137 138
f 20 138 19
f 73 19 171
f 73 171 131
f 73 131 156
f 156 131 171
f 156 171 19
f 156 19 140
f 140 19 15
f 15 19 9
f 9 19 138
f 9 138 129
f 129 138 164
f 129 164 79
f 129 79 155
f 129 155 71
f 129 71 103
f 129 103 188
f 129 188 7
f 129 7 142
f 129 142 159
f 159 142 107
f 159 107 49
f 49 60 30
f 49 107 60
f 32 52 119
f 32 119 72
f 32 72 84
f 32 84 170
f 170 84 18
f 170 18 83
f 170 83 21
f 21 83 180
f 180 83 182
f 182 176 11
f 182 83 157
f 182 157 191
f 182 191 181
f 182 181 176
f 11 128 10
f 11 176 128
f 10 125 137
f 10 128 125
f 137 163 69
f 137 69 71
f 137 71 138
f 137 125 163
f 138 71 164
f 164 71 79
f 79 71 155
f 71 69 98
f 71 98 103
f 103 98 99
f 103 99 113
f 103 113 108
f 103 108 97
f 103 97 94
f 103 94 110
f 103 110 112
f 103 112 109
f 103 109 105
f 103 105 111
f 103 111 104
f 103 104 101
f 103 101 96
f 103 96 100
f 103 100 93
f 103 93 95
f 103 95 106
f 103 106 102
f 103 102 107
f 103 107 68
f 103 68 188
f 188 68 7
f 7 68 107
f 7 107 142
f 107 102 60
f 60 102 30
f 30 102 37
f 52 51 119
f 119 51 76
f 119 76 72
f 72 76 193
f 72 193 3
f 72 3 183
f 72 183 17
f 72 17 84
f 84 17 134
f 84 134 2
f 84 2 18
f 18 2 83
f 83 2 157
f 176 58 127
f 176 127 126
f 176 126 128
f 176 181 149
f 176 149 58
f 157 2 120
f 157 120 191
f 191 120 181
f 181 120 2
f 181 2 8
f 181 8 56
f 181 56 149
f 128 190 121
f 128 121 152
f 128 152 113
f 128 113 99
f 128 99 70
f 128 70 69
f 128 69 125
f 128 126 115
f 128 115 190
f 125 69 153
f 125 153 77
f 125 77 163
f 163 77 69
f 69 77 153
f 69 70 99
f 69 99 98
f 102 106 23
f 102 23 37
f 51 45 168
f 51 168 76
f 76 168 45
f 76 45 91
f 76 91 185
f 76 185 193
f 193 185 3
f 3 185 86
f 3 86 6
f 3 6 4
f 3 4 183
f 183 4 134
f 183 134 17
f 134 4 178
f 134 178 179
f 134 179 8
f 134 8 2
f 58 133 127
f 58 149 118
f 58 118 133
f 127 133 186
f 127 186 126
f 126 186 115
f 149 56 114
f 149 114 118
f 8 179 173
f 8 173 56
f 56 173 187
f 56 187 122
f 56 122 114
f 190 88 121
f 190 115 165
f 190 165 88
f 121 88 152
f 152 108 113
f 152 88 67
f 152 67 97
f 152 97 108
f 115 117 87
f 115 87 55
f 115 55 161
f 115 161 165
f 115 186 133
f 115 133 117
f 106 95 23
f 23 95 93
f 23 93 100
f 23 100 96
f 23 96 101
f 23 101 104
f 23 104 111
f 23 111 35
f 45 40 174
f 45 174 91
f 91 174 85
f 91 85 143
f 91 143 185
f 185 143 124
f 185 124 57
f 185 57 86
f 86 57 136
f 86 136 123
f 86 123 146
f 86 146 130
f 86 130 1
f 86 1 6
f 6 1 122
f 6 122 187
f 6 187 173
f 6 173 4
f 4 173 178
f 178 173 179
f 133 118 117
f 118 114 87
f 118 87 117
f 114 122 87
f 122 116 61
f 122 61 87
f 122 1 189
f 122 189 116
f 88 165 154
f 88 154 67
f 165 161 94
f 165 94 154
f 67 154 94
f 67 94 97
f 87 61 162
f 87 162 78
f 87 78 112
f 87 112 110
f 87 110 94
f 87 94 55
f 55 94 161
f 111 105 54
f 111 54 35
f 40 39 174
f 174 39 85
f 85 39 81
f 85 81 143
f 143 81 63
f 143 63 89
f 143 89 132
f 143 132 124
f 124 132 57
f 57 132 136
f 136 132 123
f 123 132 148
f 123 148 146
f 146 148 145
f 146 145 135
f 146 135 130
f 130 135 1
f 1 135 65
f 1 65 189
f 116 65 151
f 116 151 78
f 116 78 61
f 116 189 65
f 61 78 162
f 78 151 112
f 112 151 65
f 112 65 109
f 105 109 65
f 105 65 66
f 105 66 135
f 105 135 82
f 105 82 44
f 105 44 54
f 39 46 169
f 39 169 92
f 39 92 81
f 81 92 169
f 81 169 63
f 63 169 89
f 89 169 59
f 89 59 132
f 132 5 148
f 132 59 5
f 148 22 145
f 148 5 75
f 148 75 22
f 145 22 12
f 145 12 167
f 145 167 82
f 145 82 135
f 135 66 65
f 82 167 44
f 44 167 12
f 44 12 175
f 44 175 64
f 44 64 14
f 44 14 36
f 46 31 169
f 169 31 62
f 169 62 160
f 169 160 59
f 59 160 5
f 5 160 75
f 22 184 64
f 22 64 175
f 22 175 12
f 22 75 80
f 22 80 177
f 22 177 150
f 22 150 184
f 75 160 144
f 75 144 24
f 75 24 80
f 64 147 14
f 64 184 147
f 14 147 42
f 14 42 36
f 31 24 160
f 31 160 62
f 160 24 144
f 184 33 90
f 184 90 147
f 184 150 192
f 184 192 33
f 80 24 177
f 177 50 29
f 177 29 47
f 177 47 150
f 177 24 26
f 177 26 48
f 177 48 50
f 150 47 28
f 150 28 34
f 150 34 33
f 150 33 192
f 147 90 13
f 147 13 53
f 147 53 41
f 147 41 25
f 147 25 42
f 33 53 13
f 33 13 90
@@ -0,0 +1,603 @@
# https://github.com/mikedh/trimesh
v -0.22900480 0.28574962 -0.19095100
v -0.24295167 0.29250653 -0.20417610
v -0.23171326 0.28773385 -0.19054787
v -0.23171326 0.28773385 -0.19080038
v -0.24278268 0.29320548 -0.20228744
v -0.23638521 0.29109272 -0.19046813
v -0.22287865 0.28120095 -0.19095100
v -0.22287865 0.28084964 -0.19095100
v -0.22392824 0.28152900 -0.19898559
v -0.24545782 0.29322751 -0.20501633
v -0.22602741 0.28138701 -0.20540765
v -0.24014325 0.29217236 -0.20095252
v -0.23950065 0.29326179 -0.19362969
v -0.22460654 0.28152411 -0.20099387
v -0.24190446 0.29233026 -0.20313948
v -0.22548715 0.28084597 -0.20434149
v -0.22301669 0.28103815 -0.19469880
v -0.22301669 0.28102101 -0.19469880
v -0.22420194 0.28181544 -0.19831518
v -0.24407265 0.29325322 -0.20371538
v -0.24102624 0.29111720 -0.20478154
v -0.22295005 0.28112506 -0.19296076
v -0.22295005 0.28091574 -0.19296076
v -0.24143322 0.29330218 -0.19965452
v -0.23960537 0.29319201 -0.19563797
v -0.23930073 0.29226049 -0.19032194
v -0.22335704 0.28080924 -0.19229035
v -0.22335704 0.28081047 -0.19032194
v -0.22335704 0.28080557 -0.19162141
v -0.23909843 0.29306838 -0.19070883
v -0.23818450 0.29190551 -0.19697731
v -0.22498258 0.28108956 -0.20347320
v -0.22498258 0.28095736 -0.20347320
v -0.23906511 0.29175984 -0.20006061
v -0.22569421 0.28170527 -0.20335803
v -0.22325708 0.28155960 -0.19032194
v -0.22552523 0.28316682 -0.19162141
v -0.22566089 0.28108099 -0.20540765
v -0.22566089 0.28096715 -0.20540765
v -0.24143560 0.29321527 -0.20028949
v -0.23551175 0.28989312 -0.19764772
v -0.23686598 0.29123104 -0.19563797
v -0.24035269 0.29045008 -0.20540765
v -0.22501828 0.28237851 -0.19868878
v -0.23926979 0.29295332 -0.19563797
v -0.22559425 0.28089615 -0.20501190
v -0.22559425 0.28115321 -0.20501190
v -0.22407104 0.28191214 -0.19496903
v -0.24106432 0.29310388 -0.20004437
v -0.22603455 0.28080924 -0.20501190
v -0.23558077 0.29052108 -0.19162141
v -0.22386874 0.28157062 -0.19831518
v -0.23798458 0.29224091 -0.19229035
v -0.24099768 0.29247226 -0.20147526
v -0.23947447 0.29327403 -0.19296076
v -0.22586795 0.28157552 -0.20434149
v -0.22417576 0.28183502 -0.19764772
v -0.23172516 0.28571779 -0.20400924
v -0.24567202 0.29313571 -0.20540765
v -0.24171168 0.29123104 -0.20540765
v -0.22637727 0.28084474 -0.20540765
v -0.24228764 0.29317120 -0.20166280
v -0.24076444 0.29329483 -0.19764772
v -0.22631063 0.28307991 -0.19948471
v -0.23768470 0.29044885 -0.20145164
v -0.24679062 0.29323975 -0.20540765
v -0.23995285 0.29328015 -0.19095100
v -0.23961489 0.29249796 -0.19032194
v -0.22292625 0.28115321 -0.19229035
v -0.22292625 0.28088758 -0.19229035
v -0.22549905 0.28318518 -0.19095100
v -0.24293262 0.29183084 -0.20540765
v -0.22729357 0.28419259 -0.19630838
v -0.22529674 0.28150574 -0.20300215
v -0.24229002 0.29182961 -0.20483175
v -0.24015753 0.29325567 -0.19697731
v -0.22770056 0.28438600 -0.19801246
v -0.23968391 0.29313448 -0.19618877
v -0.22374022 0.28099530 -0.19032194
v -0.22583939 0.28087902 -0.20540765
v -0.22536577 0.28080680 -0.20300215
v -0.23839870 0.29242819 -0.19429862
v -0.23944829 0.29328137 -0.19229035
v -0.23227256 0.28579124 -0.20485537
v -0.23833206 0.29247593 -0.19032194
v -0.22421622 0.28086555 -0.20099387
v -0.22421622 0.28118871 -0.20099387
v -0.23999093 0.29284682 -0.19032194
v -0.23999093 0.29327280 -0.19032194
v -0.23528565 0.29027871 -0.19032194
v -0.23633524 0.28911094 -0.20277917
v -0.24361331 0.29317977 -0.20352046
v -0.22570611 0.28111894 -0.20540765
v -0.24039791 0.29047701 -0.20540765
v -0.22475886 0.28256824 -0.19229035
v -0.22414958 0.28185461 -0.19697731
v -0.22323565 0.28154369 -0.19032194
v -0.24341101 0.29324587 -0.20301839
v -0.23369580 0.28642409 -0.20540765
v -0.23975531 0.29241472 -0.19933261
v -0.22655339 0.28357444 -0.19764772
v -0.24476523 0.29324342 -0.20436512
v -0.22350698 0.28083373 -0.19831518
v -0.22350698 0.28123645 -0.19831518
v -0.22289769 0.28084229 -0.19032194
v -0.23806312 0.29218337 -0.19429862
v -0.23955301 0.29323118 -0.19496903
v -0.23907939 0.29309041 -0.19142649
v -0.23907939 0.29309041 -0.19115626
v -0.22327136 0.28151431 -0.19162141
v -0.23799648 0.29223478 -0.19032194
v -0.24009565 0.29328259 -0.19563797
v -0.24615516 0.29323118 -0.20540765
v -0.24097626 0.29316508 -0.19965452
v -0.22367834 0.28171016 -0.19346726
v -0.24036697 0.29312469 -0.19815865
v -0.23034713 0.28439579 -0.20540765
v -0.22290008 0.28086555 -0.19162141
v -0.22290008 0.28117891 -0.19162141
v -0.22774102 0.28262088 -0.20540765
v -0.22835030 0.28304196 -0.20540765
v -0.24002901 0.29325811 -0.19637040
v -0.23759188 0.29051373 -0.20099387
v -0.22286675 0.28120952 -0.19032194
v -0.22286675 0.28084474 -0.19032194
v -0.22300242 0.28099286 -0.19429862
v -0.24121426 0.29301085 -0.20049032
v -0.22466128 0.28215083 -0.19831518
v -0.23573071 0.29041213 -0.19544600
v -0.23965773 0.29253346 -0.19032194
v -0.24101196 0.29083322 -0.20540765
v -0.23038283 0.28638981 -0.19732876
v -0.23766090 0.29180758 -0.19563797
v -0.24703814 0.29295332 -0.20540765
v -0.24277317 0.29331075 -0.20166280
v -0.22638917 0.28167956 -0.20540765
v -0.23837252 0.29244777 -0.19362969
v -0.24033603 0.29179901 -0.20213386
v -0.24064067 0.29293985 -0.19965452
v -0.23969343 0.29245757 -0.19898559
v -0.22496830 0.28241523 -0.19764772
v -0.22601789 0.28084474 -0.20540765
v -0.24118332 0.29101315 -0.20522897
v -0.24206392 0.29325199 -0.20102045
v -0.23796792 0.29159214 -0.19764772
v -0.23035189 0.28440191 -0.20540174
v -0.23732532 0.29156521 -0.19563797
v -0.23837491 0.29110496 -0.20076794
v -0.23502385 0.28976704 -0.19677944
v -0.23563313 0.29048313 -0.19296076
v -0.23803694 0.29220296 -0.19362969
v -0.23058989 0.28690882 -0.19095100
v -0.22967596 0.28574595 -0.19809811
v -0.22436140 0.28236994 -0.19058922
v -0.22436140 0.28236994 -0.19063056
v -0.22754348 0.28248378 -0.20540765
v -0.24301355 0.29313938 -0.20280575
v -0.23952683 0.29324710 -0.19429862
v -0.24149034 0.29110863 -0.20540765
v -0.24497705 0.29314795 -0.20479483
v -0.22432808 0.28172363 -0.19941678
v -0.22324518 0.28153635 -0.19095100
v -0.24084774 0.29324587 -0.19898559
v -0.22354982 0.28085821 -0.19898559
v -0.22354982 0.28119360 -0.19898559
v -0.22338084 0.28082148 -0.19032194
v -0.23062559 0.28691372 -0.19032194
v -0.22348318 0.28083005 -0.19764772
v -0.22361884 0.28093043 -0.19953196
v -0.22361884 0.28111771 -0.19953196
v -0.24166170 0.29314672 -0.20081519
v -0.23770136 0.29177820 -0.19611936
v -0.22768152 0.28439824 -0.19764772
v -0.22297624 0.28109323 -0.19362969
v -0.22297624 0.28095124 -0.19362969
v -0.22646295 0.28173220 -0.20540765
v -0.22402582 0.28080680 -0.19898559
v -0.23753238 0.29190061 -0.19032194
v -0.22493974 0.28176280 -0.20099387
v -0.24159506 0.29116861 -0.20540765
v -0.22490642 0.28087902 -0.20300215
v -0.22656529 0.28089983 -0.20540765
v -0.23946257 0.29327035 -0.19032194
v -0.24007185 0.29256773 -0.19959546
v -0.24718095 0.29311245 -0.20540765
v -0.24718095 0.29305124 -0.20540765
v -0.22835982 0.28305175 -0.20539731
v -0.22426382 0.28177137 -0.19898559
v -0.23729676 0.29158480 -0.19496903
v -0.22605835 0.28152411 -0.20506801
v -0.24427019 0.29316508 -0.20415838
v -0.24562442 0.29311490 -0.20540765
v -0.24274698 0.29260323 -0.20368142
v -0.23103495 0.28506291 -0.20471804
v -0.23922695 0.29098990 -0.20246759
v -0.24027653 0.29318712 -0.19764772
v -0.23936261 0.29324587 -0.19094066
v -0.23936261 0.29324465 -0.19163913
v -0.22629635 0.28175056 -0.20488343
v -0.24616706 0.29326913 -0.20496317
v -0.22734593 0.28415342 -0.19764772
v -0.23963393 0.29251265 -0.19032194
f 186 26 68
f 186 68 202
f 186 202 130
f 186 130 88
f 186 88 89
f 186 89 185
f 186 185 66
f 186 66 113
f 186 113 59
f 186 59 192
f 186 192 72
f 186 72 60
f 186 60 180
f 186 180 159
f 186 159 131
f 186 131 94
f 186 94 43
f 186 43 99
f 186 99 117
f 186 117 121
f 186 121 120
f 186 120 156
f 186 156 176
f 186 176 136
f 186 136 11
f 186 11 93
f 186 93 38
f 186 38 39
f 186 39 80
f 186 80 142
f 186 142 61
f 186 61 182
f 186 182 134
f 186 134 79
f 186 79 26
f 26 79 166
f 26 166 28
f 26 28 105
f 26 105 125
f 26 125 124
f 26 124 97
f 26 97 36
f 26 36 167
f 26 167 90
f 26 90 178
f 26 178 111
f 26 111 85
f 26 85 183
f 26 183 89
f 26 89 88
f 26 88 130
f 26 130 202
f 26 202 68
f 185 89 66
f 134 182 79
f 79 182 166
f 89 183 67
f 89 67 200
f 89 200 66
f 66 200 113
f 182 61 28
f 182 28 166
f 183 30 109
f 183 109 197
f 183 197 83
f 183 83 67
f 183 85 30
f 67 83 135
f 67 135 200
f 200 135 20
f 200 20 102
f 200 102 10
f 200 10 113
f 113 10 59
f 61 50 28
f 61 142 50
f 28 29 105
f 28 50 29
f 30 85 111
f 30 111 6
f 30 6 3
f 30 3 109
f 109 108 197
f 109 3 4
f 109 4 108
f 197 108 198
f 197 198 83
f 83 198 108
f 83 108 55
f 83 55 112
f 83 112 63
f 83 63 24
f 83 24 135
f 135 24 144
f 135 144 98
f 135 98 20
f 20 92 191
f 20 191 102
f 20 98 92
f 102 191 10
f 10 160 59
f 10 191 160
f 59 160 192
f 50 142 16
f 50 16 103
f 50 103 81
f 50 81 29
f 142 80 16
f 29 177 168
f 29 168 27
f 29 27 125
f 29 125 105
f 29 81 177
f 111 178 6
f 6 178 3
f 3 167 36
f 3 36 154
f 3 154 155
f 3 155 4
f 3 178 90
f 3 90 167
f 108 51 53
f 108 53 151
f 108 151 137
f 108 137 107
f 108 107 158
f 108 158 13
f 108 13 55
f 108 4 152
f 108 152 51
f 55 13 112
f 112 76 63
f 112 13 122
f 112 122 76
f 63 76 24
f 24 76 163
f 24 163 40
f 24 40 144
f 144 40 98
f 98 40 5
f 98 5 92
f 92 5 157
f 92 157 193
f 92 193 94
f 92 94 2
f 92 2 191
f 191 2 75
f 191 75 72
f 191 72 160
f 160 72 192
f 16 80 46
f 16 46 181
f 16 181 86
f 16 86 164
f 16 164 103
f 103 164 18
f 103 18 126
f 103 126 175
f 103 175 23
f 103 23 70
f 103 70 118
f 103 118 8
f 103 8 168
f 103 168 177
f 103 177 81
f 80 39 46
f 168 8 125
f 168 125 27
f 125 8 7
f 125 7 124
f 36 97 162
f 36 162 155
f 36 155 154
f 4 155 152
f 51 150 151
f 51 151 53
f 51 152 1
f 51 1 37
f 51 37 150
f 151 189 106
f 151 106 82
f 151 82 137
f 151 150 73
f 151 73 101
f 151 101 189
f 137 82 107
f 107 45 25
f 107 25 76
f 107 76 122
f 107 122 158
f 107 82 106
f 107 106 189
f 107 189 42
f 107 42 147
f 107 147 133
f 107 133 45
f 158 122 13
f 152 155 1
f 76 196 163
f 76 25 78
f 76 78 196
f 163 114 40
f 163 196 116
f 163 116 139
f 163 139 114
f 40 171 62
f 40 62 5
f 40 114 49
f 40 49 171
f 5 62 157
f 157 62 171
f 157 171 54
f 157 54 138
f 157 138 195
f 157 195 15
f 157 15 43
f 157 43 21
f 157 21 193
f 193 21 94
f 94 131 143
f 94 143 2
f 94 21 43
f 2 143 75
f 75 143 159
f 75 159 180
f 75 180 60
f 75 60 72
f 46 39 33
f 46 33 169
f 46 169 181
f 181 169 86
f 86 169 164
f 164 169 170
f 164 170 165
f 164 165 17
f 164 17 18
f 18 17 22
f 18 22 23
f 18 23 175
f 18 175 126
f 23 22 119
f 23 119 118
f 23 118 70
f 118 119 7
f 118 7 8
f 39 38 32
f 39 32 33
f 124 7 162
f 124 162 97
f 162 7 119
f 162 119 110
f 162 110 52
f 162 52 115
f 162 115 48
f 162 48 95
f 162 95 37
f 162 37 71
f 162 71 155
f 155 71 1
f 150 37 95
f 150 95 73
f 1 71 37
f 189 129 42
f 189 101 129
f 73 95 48
f 73 48 141
f 73 141 101
f 45 133 172
f 45 172 25
f 25 172 78
f 42 129 101
f 42 101 201
f 42 201 173
f 42 173 132
f 42 132 147
f 147 132 133
f 133 132 77
f 133 77 172
f 196 78 140
f 196 140 116
f 78 31 145
f 78 145 140
f 78 172 149
f 78 149 31
f 114 139 65
f 114 65 49
f 116 140 100
f 116 100 184
f 116 184 139
f 139 184 123
f 139 123 148
f 139 148 65
f 171 49 127
f 171 127 54
f 49 91 12
f 49 12 127
f 49 65 146
f 49 146 91
f 54 127 12
f 54 12 138
f 138 12 195
f 15 195 43
f 43 195 99
f 131 159 143
f 33 32 170
f 33 170 169
f 165 104 17
f 165 170 9
f 165 9 52
f 165 52 104
f 17 174 22
f 17 104 174
f 22 69 119
f 22 174 104
f 22 104 52
f 22 52 69
f 119 69 52
f 119 52 110
f 38 93 47
f 38 47 32
f 52 9 44
f 52 44 19
f 52 19 57
f 52 57 96
f 52 96 115
f 115 96 48
f 48 96 141
f 101 141 19
f 101 19 201
f 141 96 57
f 141 57 19
f 172 77 44
f 172 44 149
f 201 19 128
f 201 128 173
f 173 128 132
f 132 128 77
f 77 128 44
f 140 34 100
f 140 145 123
f 140 123 34
f 31 149 41
f 31 41 145
f 145 41 64
f 145 64 199
f 145 199 123
f 149 44 153
f 149 153 41
f 65 148 194
f 65 194 146
f 100 34 184
f 184 34 123
f 123 199 187
f 123 187 58
f 123 58 194
f 123 194 148
f 91 99 195
f 91 195 12
f 91 146 84
f 91 84 99
f 146 194 187
f 146 187 121
f 146 121 117
f 146 117 99
f 146 99 84
f 32 47 170
f 170 87 14
f 170 14 9
f 170 47 87
f 9 14 161
f 9 161 188
f 9 188 44
f 93 11 190
f 93 190 47
f 47 74 14
f 47 14 87
f 47 190 74
f 44 128 19
f 44 188 161
f 44 161 64
f 44 64 153
f 41 153 64
f 64 161 179
f 64 179 199
f 199 179 35
f 199 35 14
f 199 14 74
f 199 74 56
f 199 56 190
f 199 190 136
f 199 136 176
f 199 176 156
f 199 156 120
f 199 120 187
f 194 58 187
f 187 120 121
f 14 35 161
f 161 35 179
f 11 136 190
f 190 56 74
@@ -0,0 +1,972 @@
# https://github.com/mikedh/trimesh
v -0.23233279 0.28108464 -0.21544543
v -0.23233279 0.28096221 -0.21544543
v -0.23877119 0.28085937 -0.22043567
v -0.23877119 0.28127441 -0.22043567
v -0.23747325 0.28090222 -0.21970669
v -0.23747325 0.28117157 -0.21970669
v -0.23807996 0.28149601 -0.21973435
v -0.24913660 0.28839372 -0.21472238
v -0.24974332 0.28170781 -0.22410625
v -0.25618171 0.29324440 -0.20909403
v -0.23678202 0.28087039 -0.21905476
v -0.24593401 0.28164537 -0.22336542
v -0.22673656 0.28147764 -0.20702563
v -0.22734327 0.28188901 -0.20702563
v -0.24172023 0.28106016 -0.22210896
v -0.24172023 0.28099160 -0.22210896
v -0.23920886 0.28899852 -0.20720738
v -0.24625397 0.28094507 -0.22414971
v -0.24625397 0.28110178 -0.22414971
v -0.25147893 0.28083488 -0.22496364
v -0.25147893 0.29225026 -0.20981115
v -0.24293365 0.29183033 -0.20540962
v -0.25641715 0.29307055 -0.20935875
v -0.22656752 0.28089977 -0.20540962
v -0.24718064 0.29305096 -0.20540962
v -0.24718064 0.29311217 -0.20540962
v -0.24879854 0.29045789 -0.21145679
v -0.24879854 0.28890180 -0.21380770
v -0.24879854 0.28222079 -0.22321923
v -0.24879854 0.28558517 -0.21855495
v -0.23895531 0.28243505 -0.21883745
v -0.23474153 0.28404255 -0.21237740
v -0.25616360 0.28151315 -0.22518490
v -0.25616360 0.28086549 -0.22555630
v -0.25616360 0.28080673 -0.22509995
v -0.25616360 0.28655482 -0.21829812
v -0.25616360 0.28117891 -0.22555630
v -0.25616360 0.28887242 -0.21512934
v -0.22951656 0.28087651 -0.21170966
v -0.23052775 0.28160497 -0.21237937
v -0.22943205 0.28346958 -0.20631245
v -0.22602722 0.28138704 -0.20540962
v -0.23639263 0.28639933 -0.20939629
v -0.24303326 0.28775830 -0.21276460
v -0.24615134 0.29321012 -0.20566842
v -0.24505564 0.28975269 -0.21073374
v -0.22695388 0.28111892 -0.20815169
v -0.22695388 0.28092916 -0.20815169
v -0.22646489 0.28173230 -0.20540962
v -0.23290329 0.28177882 -0.21486264
v -0.23270105 0.28153641 -0.21507402
v -0.23140311 0.28087406 -0.21436283
v -0.23140311 0.28122544 -0.21436283
v -0.23160534 0.28177392 -0.21356273
v -0.25513430 0.28237016 -0.22409637
v -0.24679125 0.28080673 -0.22376053
v -0.24679125 0.29323950 -0.20540962
v -0.24679125 0.28116667 -0.22420700
v -0.24679125 0.28150213 -0.22383165
v -0.24679125 0.28175066 -0.22349580
v -0.24679125 0.28087773 -0.22420700
v -0.24679125 0.29330683 -0.20568225
v -0.23824597 0.28245341 -0.21821910
v -0.25132499 0.29304116 -0.20866138
v -0.25525202 0.29306810 -0.20935678
v -0.24711121 0.29174708 -0.20870287
v -0.25415632 0.28151560 -0.22518490
v -0.25415632 0.28373280 -0.22211884
v -0.25415632 0.28080673 -0.22509995
v -0.25415632 0.28176168 -0.22485103
v -0.25415632 0.28118136 -0.22556025
v -0.25415632 0.28086672 -0.22556025
v -0.25415632 0.29324195 -0.20892611
v -0.24411086 0.28849044 -0.21218972
v -0.24159949 0.28242280 -0.22015712
v -0.24844236 0.28773259 -0.21540394
v -0.24171721 0.28641157 -0.21409415
v -0.23900361 0.28096588 -0.22078930
v -0.23900361 0.28108219 -0.22078930
v -0.23608777 0.28125972 -0.21840481
v -0.23608777 0.28085080 -0.21840481
v -0.22754249 0.28248402 -0.20540962
v -0.23086280 0.28181677 -0.21237937
v -0.22584007 0.28087896 -0.20540962
v -0.23539654 0.28084223 -0.21775287
v -0.23138500 0.28153763 -0.21375831
v -0.25009346 0.29325664 -0.20774670
v -0.24296384 0.29181196 -0.20547087
v -0.23955901 0.28176413 -0.22017490
v -0.24036796 0.29044320 -0.20544321
v -0.23424952 0.28581167 -0.20769139
v -0.22570424 0.28111892 -0.20540962
v -0.24210358 0.28114708 -0.22219589
v -0.24210358 0.28080917 -0.22175139
v -0.24210358 0.28090589 -0.22219589
v -0.24562613 0.29311462 -0.20540962
v -0.24230581 0.28575902 -0.21545531
v -0.24894644 0.28641280 -0.21743481
v -0.24040116 0.29047625 -0.20540962
v -0.24946864 0.29322481 -0.20758471
v -0.25027758 0.29180462 -0.21012527
v -0.23087789 0.28088386 -0.21371880
v -0.23209132 0.28086794 -0.21504044
v -0.23702953 0.28641280 -0.21008180
v -0.24367016 0.29179360 -0.20610897
v -0.22637736 0.28084468 -0.20540962
v -0.23220904 0.28179596 -0.21422651
v -0.22617512 0.28084590 -0.20635196
v -0.23504036 0.28640790 -0.20740691
v -0.22710179 0.28164660 -0.20725084
v -0.23937186 0.28153763 -0.22040406
v -0.24009629 0.28184983 -0.22030331
v -0.25548444 0.29324562 -0.20909205
v -0.24162968 0.29115207 -0.20549062
v -0.24685464 0.29317584 -0.20631838
v -0.24746135 0.28376586 -0.22082683
v -0.24746135 0.29329949 -0.20635196
v -0.24746135 0.28319044 -0.22162495
v -0.24746135 0.28155477 -0.22389289
v -0.24746135 0.29313666 -0.20676880
v -0.24746135 0.28179596 -0.22355902
v -0.24746135 0.29291506 -0.20710465
v -0.24746135 0.28084223 -0.22426429
v -0.24636565 0.28306801 -0.22145901
v -0.25482642 0.29189889 -0.21092141
v -0.25482642 0.28886875 -0.21512144
v -0.25482642 0.28120952 -0.22558989
v -0.25482642 0.28154498 -0.22522046
v -0.25482642 0.29223312 -0.21045716
v -0.25482642 0.29327255 -0.20898735
v -0.25482642 0.29247431 -0.21012132
v -0.25482642 0.28084468 -0.22558989
v -0.22566802 0.28097445 -0.20544518
v -0.22566802 0.28107485 -0.20544518
v -0.24960145 0.29247553 -0.20879177
v -0.24478096 0.28111892 -0.22350766
v -0.24478096 0.28093528 -0.22350766
v -0.24478096 0.28082019 -0.22309081
v -0.23101071 0.28108342 -0.21412181
v -0.23101071 0.28096466 -0.21412181
v -0.24307854 0.28104791 -0.22276880
v -0.24307854 0.28100751 -0.22276880
v -0.23785357 0.28163925 -0.21932146
v -0.25214602 0.29253675 -0.20953853
v -0.25214602 0.28186942 -0.22432949
v -0.25214602 0.29329826 -0.20836110
v -0.23254409 0.28361894 -0.21048877
v -0.24712329 0.29308279 -0.20668781
v -0.24703877 0.29295301 -0.20540962
v -0.24432517 0.29247064 -0.20545309
v -0.23808901 0.28079938 -0.21974225
v -0.23808901 0.28090957 -0.22020453
v -0.23808901 0.28115565 -0.22020453
v -0.22804355 0.28081162 -0.20903081
v -0.22735232 0.28084590 -0.20836900
v -0.25229694 0.28975881 -0.21341851
v -0.24958334 0.28108342 -0.22480559
v -0.24958334 0.28096344 -0.22480559
v -0.24958334 0.28842432 -0.21476386
v -0.25501054 0.29109330 -0.21207119
v -0.23561085 0.28091691 -0.21818157
v -0.23561085 0.28113361 -0.21818157
v -0.22767228 0.28239587 -0.20611885
v -0.24638074 0.28171883 -0.22345234
v -0.22698105 0.28174087 -0.20680436
v -0.23965560 0.28912095 -0.20745827
v -0.24568951 0.28373893 -0.22012354
v -0.24609399 0.28137358 -0.22376645
v -0.22770548 0.28103567 -0.20937258
v -0.22770548 0.28102343 -0.20937258
v -0.23163251 0.28111280 -0.21480733
v -0.23163251 0.28093405 -0.21480733
v -0.25013874 0.29256001 -0.20892018
v -0.25013874 0.28114341 -0.22485498
v -0.25013874 0.28089855 -0.22485498
v -0.24159345 0.29116798 -0.20540962
v -0.25597041 0.29309013 -0.20937653
v -0.23426160 0.28243749 -0.21484486
v -0.24171117 0.29123165 -0.20540962
v -0.25649261 0.29228332 -0.20918885
v -0.25649261 0.28361282 -0.22229467
v -0.25649261 0.28150090 -0.22517107
v -0.25649261 0.29252940 -0.20885499
v -0.25649261 0.29286486 -0.20849544
v -0.25649261 0.28087651 -0.22554247
v -0.25649261 0.28096099 -0.22466928
v -0.25649261 0.29327990 -0.20849544
v -0.25649261 0.29310850 -0.20929356
v -0.25649261 0.28162701 -0.22500710
v -0.25649261 0.29237147 -0.21031887
v -0.25649261 0.28080795 -0.22509995
v -0.25649261 0.29211804 -0.20941407
v -0.25649261 0.28116667 -0.22554247
v -0.25649261 0.29326276 -0.20905254
v -0.25649261 0.29306565 -0.20935480
v -0.25649261 0.29269958 -0.20867126
v -0.25649261 0.28572107 -0.21941234
v -0.25649261 0.28476367 -0.21946963
v -0.25649261 0.28175311 -0.22483720
v -0.25649261 0.28133073 -0.22536072
v -0.25649261 0.29249512 -0.21014897
v -0.25649261 0.29240820 -0.20901896
v -0.24774509 0.28573331 -0.21809069
v -0.24644715 0.29241677 -0.20736344
v -0.24032872 0.29043340 -0.20540962
v -0.22655847 0.28156457 -0.20635196
v -0.22635623 0.28100384 -0.20738122
v -0.22635623 0.28105036 -0.20738122
v -0.23631717 0.28111035 -0.21881967
v -0.23631717 0.28093650 -0.21881967
v -0.23340133 0.28080305 -0.21572398
v -0.24567140 0.29313543 -0.20540962
v -0.23773283 0.28100384 -0.22009588
v -0.23773283 0.28105036 -0.22009588
v -0.23955297 0.28380871 -0.21690734
v -0.22869856 0.28084835 -0.21036628
v -0.24036192 0.28097813 -0.22144913
v -0.25534559 0.28773382 -0.21674139
v -0.22638943 0.28167965 -0.20540962
v -0.24076639 0.28089365 -0.22154001
v -0.22601816 0.28084468 -0.20540962
v -0.23245655 0.28165394 -0.21467299
v -0.23034966 0.28439638 -0.20540962
v -0.24573781 0.29243513 -0.20672732
v -0.23115861 0.28163313 -0.21323676
v -0.25549652 0.28120095 -0.22557803
v -0.25549652 0.28153641 -0.22521058
v -0.25549652 0.28690864 -0.21786548
v -0.25549652 0.28178127 -0.22487671
v -0.25549652 0.28084958 -0.22557803
v -0.24614228 0.28187676 -0.22312242
v -0.25509204 0.28773382 -0.21674139
v -0.24443987 0.28103567 -0.22342863
v -0.24443987 0.28102343 -0.22342863
v -0.22965843 0.28095119 -0.21213243
v -0.25569875 0.29309013 -0.20937653
v -0.24545105 0.28181065 -0.22292289
v -0.24545105 0.28085325 -0.22366372
v -0.24545105 0.28124135 -0.22366372
v -0.24545105 0.28157681 -0.22325676
v -0.23702349 0.28096588 -0.21945777
v -0.23702349 0.28108219 -0.21945777
v -0.25281612 0.29330439 -0.20836110
v -0.25281612 0.29315747 -0.20880165
v -0.25151817 0.29323705 -0.20840654
v -0.22628680 0.28092181 -0.20702167
v -0.22628680 0.28112749 -0.20702167
v -0.24127048 0.28630506 -0.21390450
v -0.24499527 0.28173842 -0.22281424
v -0.23875911 0.28184983 -0.21963952
v -0.23875911 0.28163068 -0.21997537
v -0.23004480 0.28126217 -0.21236554
v -0.23004480 0.28085325 -0.21236554
v -0.23607871 0.28178984 -0.21755927
v -0.23457854 0.28161844 -0.21658137
v -0.24705084 0.28373158 -0.22077942
v -0.22724668 0.28155967 -0.20769139
v -0.25097787 0.29244982 -0.20941802
v -0.22785339 0.28161232 -0.20848556
v -0.23368507 0.28641770 -0.20540962
v -0.24615738 0.29323093 -0.20540962
v -0.24344377 0.28113361 -0.22285177
v -0.24344377 0.28081407 -0.22242110
v -0.24052793 0.29034158 -0.20588968
v -0.25028664 0.29314033 -0.20811416
v -0.25080884 0.29321746 -0.20823466
v -0.25080884 0.28085202 -0.22491227
v -0.23100467 0.28173107 -0.21279029
v -0.24639282 0.29311217 -0.20607143
v -0.23161138 0.28511749 -0.20551630
v -0.23201585 0.28156824 -0.21442407
v -0.22670637 0.28080550 -0.20702167
v -0.24812844 0.29323338 -0.20692882
v -0.24812844 0.28356997 -0.22122392
v -0.24812844 0.29113003 -0.21012132
v -0.25517354 0.28237016 -0.22409637
v -0.23658280 0.28630628 -0.20984276
v -0.23386919 0.28163190 -0.21594524
v -0.22823975 0.28245341 -0.20702167
v -0.25176871 0.29308768 -0.20870287
v -0.23176230 0.28166618 -0.21400920
v -0.23759398 0.28177637 -0.21887499
v -0.23528486 0.28160007 -0.21721947
v -0.23026213 0.28115075 -0.21290289
v -0.23026213 0.28090589 -0.21290289
v -0.23860517 0.28429109 -0.21523602
v -0.23139103 0.28080305 -0.21371880
v -0.22968862 0.28372791 -0.20606353
v -0.25301534 0.28106505 -0.22545950
v -0.25301534 0.28098670 -0.22545950
v -0.25301534 0.28841331 -0.21541777
v -0.22677278 0.28188411 -0.20568225
v -0.25362205 0.28172618 -0.22480164
v -0.23572253 0.28505872 -0.21139357
v -0.22758173 0.28177760 -0.20769139
v -0.24146970 0.28651564 -0.21369707
v -0.22689050 0.28180208 -0.20635196
v -0.22769945 0.28170536 -0.20803908
v -0.22830616 0.28110790 -0.21014305
v -0.22830616 0.28093895 -0.21014305
v -0.23304214 0.28099894 -0.21608156
v -0.23304214 0.28105403 -0.21608156
v -0.24612116 0.28247177 -0.22224133
v -0.22672146 0.28119850 -0.20764002
v -0.22672146 0.28088508 -0.20764002
v -0.23688464 0.28179474 -0.21823886
v -0.24101391 0.29083375 -0.20540962
v -0.23830031 0.28175923 -0.21950519
v -0.23226639 0.28244851 -0.21290289
v -0.23789583 0.28765424 -0.20852507
v -0.25348622 0.28092548 -0.22550099
v -0.25348622 0.28111770 -0.22550099
v -0.25348622 0.29320155 -0.20886289
v -0.25348622 0.28450534 -0.22092363
v -0.23036174 0.28440372 -0.20540962
v -0.22837257 0.28305699 -0.20540962
v -0.23942921 0.28117402 -0.22088412
v -0.23942921 0.28252075 -0.21896784
v -0.23942921 0.28088263 -0.22088412
v -0.23440648 0.28437679 -0.21137184
v -0.22565896 0.28108097 -0.20540962
v -0.22565896 0.28096711 -0.20540962
v -0.24436743 0.29251471 -0.20540962
v -0.24667655 0.29298729 -0.20651791
v -0.23723781 0.28698087 -0.20918293
f 132 230 226
f 132 226 127
f 132 127 71
f 132 71 72
f 132 72 20
f 132 20 69
f 132 69 35
f 132 35 191
f 132 191 230
f 230 191 34
f 230 34 37
f 230 37 226
f 127 128 71
f 127 226 227
f 127 227 128
f 72 71 289
f 72 289 290
f 72 290 311
f 72 311 175
f 72 175 61
f 72 61 267
f 72 267 20
f 20 267 123
f 20 123 56
f 20 56 69
f 69 56 151
f 69 151 35
f 35 151 272
f 35 272 191
f 191 186 198
f 191 198 192
f 191 192 180
f 191 180 202
f 191 202 183
f 191 183 196
f 191 196 184
f 191 184 187
f 191 187 194
f 191 194 188
f 191 188 195
f 191 195 201
f 191 201 190
f 191 190 197
f 191 197 181
f 191 181 199
f 191 199 189
f 191 189 182
f 191 182 200
f 191 200 193
f 191 193 185
f 191 185 34
f 191 272 106
f 191 106 186
f 226 37 227
f 34 185 193
f 34 193 37
f 128 227 276
f 128 276 55
f 128 55 232
f 128 232 70
f 128 70 67
f 128 67 71
f 71 312 289
f 71 67 59
f 71 59 58
f 71 58 174
f 71 174 312
f 227 229 276
f 227 37 33
f 227 33 189
f 227 189 199
f 227 199 229
f 290 289 157
f 290 157 158
f 290 158 311
f 311 158 175
f 175 158 61
f 61 18 238
f 61 238 123
f 61 123 267
f 61 158 18
f 123 238 56
f 56 238 138
f 56 138 263
f 56 263 94
f 56 94 151
f 151 94 238
f 151 238 3
f 151 3 152
f 151 152 11
f 151 11 81
f 151 81 85
f 151 85 211
f 151 211 287
f 151 287 272
f 272 287 154
f 272 154 216
f 272 216 155
f 272 155 305
f 272 305 108
f 272 108 221
f 272 221 106
f 186 106 24
f 186 24 198
f 106 221 84
f 106 84 322
f 106 322 321
f 106 321 92
f 106 92 42
f 106 42 219
f 106 219 49
f 106 49 82
f 106 82 316
f 106 316 223
f 106 223 315
f 106 315 260
f 106 260 205
f 106 205 99
f 106 99 307
f 106 307 176
f 106 176 179
f 106 179 22
f 106 22 323
f 106 323 96
f 106 96 212
f 106 212 261
f 106 261 57
f 106 57 26
f 106 26 25
f 106 25 149
f 106 149 24
f 37 193 200
f 37 200 33
f 276 218 232
f 276 232 55
f 276 229 38
f 276 38 177
f 276 177 228
f 276 228 218
f 232 218 177
f 232 177 236
f 232 236 160
f 232 160 126
f 232 126 70
f 70 126 125
f 70 125 68
f 70 68 293
f 70 293 67
f 67 293 119
f 67 119 59
f 312 174 157
f 312 157 289
f 59 119 60
f 59 60 164
f 59 164 19
f 59 19 58
f 58 19 157
f 58 157 174
f 229 199 181
f 229 181 197
f 229 197 36
f 229 36 38
f 33 200 182
f 33 182 189
f 158 157 19
f 158 19 18
f 18 19 233
f 18 233 234
f 18 234 137
f 18 137 238
f 238 137 95
f 238 95 220
f 238 220 319
f 238 319 3
f 238 94 263
f 238 263 138
f 3 319 152
f 152 213 5
f 152 5 11
f 152 319 78
f 152 78 213
f 11 210 161
f 11 161 103
f 11 103 81
f 11 5 210
f 81 103 85
f 85 103 211
f 211 103 287
f 287 103 52
f 287 52 253
f 287 253 154
f 154 253 216
f 216 305 155
f 216 253 39
f 216 39 305
f 305 207 246
f 305 246 108
f 305 39 48
f 305 48 207
f 108 246 322
f 108 322 84
f 108 84 221
f 198 24 192
f 24 149 184
f 24 184 196
f 24 196 183
f 24 183 202
f 24 202 180
f 24 180 192
f 218 228 177
f 38 36 197
f 38 197 190
f 38 190 177
f 177 113 236
f 177 190 201
f 177 201 23
f 177 23 188
f 177 188 194
f 177 194 10
f 177 10 113
f 236 113 130
f 236 130 65
f 236 65 160
f 160 65 129
f 160 129 125
f 160 125 126
f 125 129 244
f 125 244 144
f 125 144 156
f 125 156 291
f 125 291 145
f 125 145 314
f 125 314 68
f 68 314 145
f 68 145 293
f 293 145 9
f 293 9 119
f 119 9 121
f 119 121 60
f 60 121 118
f 60 118 116
f 60 116 164
f 164 231 237
f 164 237 240
f 164 240 12
f 164 12 168
f 164 168 19
f 164 116 8
f 164 8 256
f 164 256 231
f 19 168 239
f 19 239 136
f 19 136 233
f 234 233 141
f 234 141 142
f 234 142 137
f 137 142 16
f 137 16 217
f 137 217 78
f 137 78 95
f 95 78 220
f 220 78 319
f 213 214 302
f 213 302 301
f 213 301 2
f 213 2 241
f 213 241 5
f 213 78 79
f 213 79 214
f 5 241 210
f 78 217 16
f 78 16 142
f 78 142 141
f 78 141 15
f 78 15 79
f 210 241 2
f 210 2 172
f 210 172 161
f 161 172 103
f 103 172 52
f 52 172 140
f 52 140 102
f 52 102 253
f 253 102 39
f 39 102 285
f 39 285 48
f 207 208 134
f 207 134 133
f 207 133 322
f 207 322 246
f 207 48 300
f 207 300 235
f 207 235 140
f 207 140 170
f 207 170 169
f 207 169 208
f 48 285 300
f 322 133 134
f 322 134 321
f 149 25 184
f 184 25 26
f 184 26 187
f 113 10 194
f 113 194 130
f 201 195 23
f 23 195 188
f 194 187 243
f 194 243 130
f 130 243 146
f 130 146 245
f 130 245 73
f 130 73 65
f 65 73 131
f 65 131 129
f 129 131 244
f 244 313 245
f 244 245 280
f 244 280 144
f 244 131 313
f 144 280 21
f 144 21 159
f 144 159 98
f 144 98 30
f 144 30 156
f 156 30 291
f 291 30 145
f 145 30 29
f 145 29 9
f 9 29 121
f 121 29 274
f 121 274 30
f 121 30 118
f 118 30 116
f 116 30 98
f 116 98 8
f 231 256 303
f 231 303 237
f 237 249 240
f 237 303 124
f 237 124 203
f 237 203 76
f 237 76 28
f 237 28 167
f 237 167 97
f 237 97 249
f 240 136 239
f 240 239 168
f 240 168 12
f 240 249 111
f 240 111 93
f 240 93 262
f 240 262 136
f 8 101 256
f 8 98 159
f 8 159 21
f 8 21 280
f 8 280 258
f 8 258 101
f 256 124 303
f 256 101 203
f 256 203 124
f 136 262 93
f 136 93 79
f 136 79 15
f 136 15 141
f 136 141 233
f 214 6 242
f 214 242 1
f 214 1 302
f 214 79 153
f 214 153 7
f 214 7 6
f 301 302 1
f 301 1 2
f 2 1 171
f 2 171 172
f 79 93 317
f 79 317 111
f 79 111 4
f 79 4 153
f 172 171 139
f 172 139 140
f 140 139 169
f 140 169 170
f 140 235 285
f 140 285 102
f 285 235 300
f 208 47 304
f 208 304 257
f 208 257 110
f 208 110 13
f 208 13 247
f 208 247 321
f 208 321 134
f 208 169 299
f 208 299 47
f 321 247 206
f 321 206 92
f 187 26 57
f 187 57 62
f 187 62 243
f 243 62 117
f 243 117 146
f 146 266 245
f 146 117 87
f 146 87 266
f 245 266 64
f 245 64 280
f 245 313 73
f 73 313 131
f 280 64 258
f 30 274 29
f 249 97 75
f 249 75 112
f 249 112 89
f 249 89 111
f 203 101 76
f 76 101 173
f 76 173 28
f 28 173 265
f 28 265 135
f 28 135 27
f 28 27 167
f 167 27 275
f 167 275 97
f 97 74 318
f 97 318 89
f 97 89 112
f 97 112 75
f 97 275 66
f 97 66 122
f 97 122 74
f 111 89 251
f 111 251 4
f 111 317 93
f 101 265 173
f 101 258 266
f 101 266 265
f 258 64 266
f 6 7 283
f 6 283 80
f 6 80 209
f 6 209 242
f 242 209 1
f 1 209 171
f 153 4 251
f 153 251 7
f 7 251 308
f 7 308 143
f 7 143 283
f 171 51 271
f 171 271 281
f 171 281 53
f 171 53 139
f 171 209 162
f 171 162 283
f 171 283 255
f 171 255 278
f 171 278 51
f 139 53 281
f 139 281 86
f 139 86 284
f 139 284 299
f 139 299 169
f 47 257 304
f 47 299 259
f 47 259 257
f 257 295 110
f 257 259 298
f 257 298 295
f 110 295 14
f 110 14 165
f 110 165 13
f 13 206 247
f 13 165 206
f 299 284 259
f 92 206 42
f 206 219 42
f 206 165 297
f 206 297 219
f 57 261 62
f 62 261 45
f 62 45 117
f 117 45 115
f 117 115 273
f 117 273 87
f 266 87 100
f 266 100 265
f 87 273 100
f 89 318 251
f 265 100 120
f 265 120 122
f 265 122 135
f 135 122 66
f 135 66 275
f 135 275 27
f 74 122 46
f 74 46 148
f 74 148 318
f 318 44 31
f 318 31 250
f 318 250 251
f 318 148 204
f 318 204 44
f 122 120 148
f 122 148 46
f 251 250 308
f 283 306 254
f 283 254 50
f 283 50 255
f 283 162 80
f 283 143 308
f 283 308 282
f 283 282 306
f 80 162 209
f 308 77 215
f 308 215 63
f 308 63 282
f 308 250 31
f 308 31 204
f 308 204 77
f 51 278 271
f 271 278 222
f 271 222 107
f 271 107 281
f 281 54 86
f 281 107 277
f 281 277 325
f 281 325 320
f 281 320 54
f 255 50 278
f 278 50 222
f 86 225 40
f 86 40 259
f 86 259 252
f 86 252 284
f 86 54 225
f 284 252 259
f 259 40 225
f 259 225 268
f 259 268 54
f 259 54 83
f 259 83 298
f 295 298 279
f 295 279 14
f 298 41 279
f 298 83 309
f 298 309 147
f 298 147 260
f 298 260 41
f 14 279 223
f 14 223 165
f 165 163 297
f 165 223 163
f 219 297 292
f 219 292 49
f 297 163 316
f 297 316 82
f 297 82 292
f 261 212 45
f 45 269 115
f 45 212 269
f 115 269 324
f 115 324 204
f 115 204 148
f 115 148 120
f 115 120 273
f 273 120 100
f 44 204 31
f 204 324 269
f 204 269 224
f 204 224 77
f 306 282 63
f 306 63 77
f 306 77 248
f 306 248 254
f 254 178 50
f 254 248 286
f 254 286 178
f 50 107 222
f 50 178 32
f 50 32 107
f 77 296 248
f 77 63 215
f 77 224 296
f 107 32 294
f 107 294 104
f 107 104 166
f 107 166 114
f 107 114 277
f 54 309 83
f 54 268 225
f 54 320 309
f 277 114 325
f 325 114 310
f 325 310 320
f 320 310 17
f 320 17 43
f 320 43 309
f 279 41 288
f 279 288 223
f 41 260 288
f 309 43 147
f 147 43 91
f 147 91 260
f 260 315 270
f 260 270 288
f 260 91 109
f 260 109 90
f 260 90 205
f 223 288 315
f 223 316 163
f 292 82 49
f 212 96 269
f 269 96 150
f 269 150 88
f 269 88 224
f 224 88 105
f 224 105 294
f 224 294 248
f 224 248 296
f 248 294 32
f 248 32 178
f 248 178 286
f 294 105 88
f 294 88 104
f 104 88 166
f 166 88 114
f 114 88 22
f 114 22 179
f 114 179 176
f 114 176 17
f 114 17 310
f 17 176 264
f 17 264 90
f 17 90 43
f 43 109 91
f 43 90 109
f 288 270 315
f 90 264 307
f 90 307 99
f 90 99 205
f 96 323 150
f 150 323 88
f 88 323 22
f 176 307 264
@@ -0,0 +1,489 @@
# https://github.com/mikedh/trimesh
v -0.26886656 0.29285053 -0.18089138
v -0.26886656 0.29327040 -0.18089138
v -0.27411711 0.29255308 -0.18760150
v -0.27304702 0.29328019 -0.19295940
v -0.28864254 0.28236995 -0.19332106
v -0.28864254 0.28236995 -0.19328005
v -0.27496445 0.29220300 -0.19027982
v -0.26936829 0.29251881 -0.18089138
v -0.28964602 0.28080924 -0.19161961
v -0.28964602 0.28081047 -0.19358827
v -0.28964602 0.28080557 -0.19228950
v -0.28719354 0.28095491 -0.18089138
v -0.27263480 0.29312473 -0.18575090
v -0.27156470 0.29321531 -0.18361942
v -0.28241141 0.28690884 -0.19295940
v -0.27363828 0.29324469 -0.19297058
v -0.27344882 0.29323122 -0.18894128
v -0.27134194 0.29314676 -0.18309370
v -0.28410608 0.28515351 -0.18559430
v -0.27828716 0.28799705 -0.18089138
v -0.28809708 0.28087901 -0.18090754
v -0.27948009 0.28720262 -0.18089138
v -0.29010404 0.28084229 -0.19358827
v -0.27746273 0.28852341 -0.18089138
v -0.28532191 0.28439947 -0.18626420
v -0.28808668 0.28087901 -0.18089138
v -0.27022812 0.29331079 -0.18224608
v -0.27352793 0.29327407 -0.19094972
v -0.28770777 0.28150697 -0.18090754
v -0.27701720 0.28956632 -0.18358587
v -0.27613656 0.29123107 -0.18827139
v -0.27085269 0.29252860 -0.18089138
v -0.26959314 0.29324591 -0.18089138
v -0.28128718 0.28773387 -0.19336208
v -0.28128718 0.28773387 -0.19310854
v -0.28880077 0.28181666 -0.18559430
v -0.29002701 0.28109323 -0.19027982
v -0.29002701 0.28095123 -0.19027982
v -0.27462093 0.29176967 -0.18581926
v -0.27021771 0.29320552 -0.18162217
v -0.27458762 0.29241599 -0.18919855
v -0.27260357 0.29243068 -0.18320680
v -0.27364036 0.29324469 -0.19227086
v -0.28870083 0.28094267 -0.18240641
v -0.28870083 0.28110424 -0.18240641
v -0.27272640 0.29318716 -0.18626420
v -0.26954942 0.29324836 -0.18089138
v -0.27354043 0.29327040 -0.19358827
v -0.28913595 0.28157184 -0.18559430
v -0.27530171 0.29177824 -0.18778916
v -0.27297207 0.29325815 -0.18753935
v -0.27331766 0.29313452 -0.18772081
v -0.27661748 0.29109275 -0.19344286
v -0.27202480 0.29316512 -0.18425576
v -0.28399782 0.28574964 -0.19295940
v -0.27223716 0.29329488 -0.18626420
v -0.27399844 0.29247229 -0.18693409
v -0.27660707 0.29108541 -0.19174389
v -0.27235999 0.29293989 -0.18425576
v -0.27742109 0.29052111 -0.19228950
v -0.27339677 0.29319205 -0.18827139
v -0.27355292 0.29328141 -0.19161961
v -0.27021979 0.29290195 -0.18089138
v -0.27156887 0.29330222 -0.18425576
v -0.29005199 0.28112505 -0.19094972
v -0.29005199 0.28091574 -0.19094972
v -0.28530317 0.28438601 -0.18589631
v -0.27948426 0.28720507 -0.18090754
v -0.27791242 0.28837162 -0.18128660
v -0.28998537 0.28101978 -0.18920974
v -0.28998537 0.28103814 -0.18920974
v -0.27193736 0.29310514 -0.18386551
v -0.27347589 0.29324714 -0.18961117
v -0.27485827 0.29010614 -0.18089138
v -0.28938370 0.28093043 -0.18437756
v -0.28938370 0.28111771 -0.18437756
v -0.27290753 0.29328264 -0.18827139
v -0.27746689 0.28852708 -0.18090754
v -0.27570560 0.29158483 -0.18894128
v -0.28013173 0.28853565 -0.19358827
v -0.27293043 0.29256900 -0.18431417
v -0.27151474 0.29212833 -0.18089138
v -0.27868272 0.28778284 -0.18103555
v -0.28949612 0.28083372 -0.18559430
v -0.28949612 0.28123645 -0.18559430
v -0.27084645 0.29283585 -0.18162217
v -0.28939619 0.28176280 -0.19228950
v -0.27392350 0.29308923 -0.19248339
v -0.27392350 0.29308923 -0.19275557
v -0.28951902 0.28083005 -0.18626420
v -0.27300954 0.29327284 -0.19358827
v -0.27300954 0.29284809 -0.19358827
v -0.28945240 0.28085820 -0.18492441
v -0.28945240 0.28119483 -0.18492441
v -0.28769111 0.28151554 -0.18089138
v -0.28926295 0.28099530 -0.19358827
v -0.26998870 0.29313942 -0.18110391
v -0.28976469 0.28154369 -0.19358827
v -0.27467090 0.29247597 -0.19358827
v -0.28973138 0.28151431 -0.19228950
v -0.28762449 0.28080802 -0.18089138
v -0.29007697 0.28115321 -0.19161961
v -0.29007697 0.28088758 -0.19161961
v -0.27536209 0.28980135 -0.18089138
v -0.27460428 0.29242823 -0.18961117
v -0.27740235 0.29050642 -0.19358827
v -0.27334473 0.29253350 -0.19358827
v -0.28261960 0.28639105 -0.18658112
v -0.27736904 0.29048316 -0.19094972
v -0.28978759 0.28152411 -0.19358827
v -0.27500608 0.29223482 -0.19358827
v -0.28742463 0.28312888 -0.19094972
v -0.28531775 0.28372623 -0.18318070
v -0.27462718 0.29110499 -0.18314093
v -0.27531837 0.29044889 -0.18245736
v -0.27390268 0.29306842 -0.19320175
v -0.27336763 0.29251269 -0.19358827
v -0.28962104 0.28082148 -0.19358827
v -0.27666744 0.28911096 -0.18113001
v -0.28874039 0.28177137 -0.18492441
v -0.28820534 0.28084719 -0.18157743
v -0.28943158 0.28178728 -0.19358827
v -0.28763698 0.28080679 -0.18090754
v -0.28763698 0.28080802 -0.18089138
v -0.27886385 0.28761758 -0.18089138
v -0.27534127 0.29180884 -0.18827139
v -0.27093805 0.29325203 -0.18288863
v -0.27933228 0.28730300 -0.18089138
v -0.27599915 0.28978421 -0.18178871
v -0.27370281 0.29226053 -0.19358827
v -0.27807273 0.28916360 -0.18492441
v -0.27071529 0.29317124 -0.18224608
v -0.28907558 0.28152900 -0.18492441
v -0.28677924 0.28314112 -0.18492441
v -0.28237602 0.28691374 -0.19358827
v -0.26888738 0.29327407 -0.18089138
v -0.26888738 0.29327407 -0.18090257
v -0.28897565 0.28080679 -0.18492441
v -0.28809500 0.28088146 -0.18089138
v -0.28809500 0.28116912 -0.18089138
v -0.27215388 0.29324591 -0.18492441
v -0.28878619 0.28086555 -0.18291597
v -0.28878619 0.28118993 -0.18291597
v -0.27284507 0.29325571 -0.18693409
v -0.28737050 0.28174689 -0.18089138
v -0.29013527 0.28120952 -0.19358827
v -0.29013527 0.28084474 -0.19358827
v -0.27350295 0.29326183 -0.19027982
v -0.29010196 0.28086555 -0.19228950
v -0.29010196 0.28117891 -0.19228950
v -0.28975636 0.28153635 -0.19295940
v -0.27324688 0.29241599 -0.18457641
v -0.27412752 0.29189208 -0.18492441
v -0.28145165 0.28584022 -0.18089138
v -0.27934477 0.28844751 -0.18559430
v -0.28770569 0.28150330 -0.18089138
v -0.28839688 0.28152411 -0.18291597
v -0.29012486 0.28120095 -0.19295940
v -0.29012486 0.28084964 -0.19295940
v -0.27540997 0.29051376 -0.18291597
v -0.28974595 0.28155838 -0.19358827
v -0.28342530 0.28447537 -0.18089138
v -0.28798466 0.28237851 -0.18522021
v -0.28867585 0.28172363 -0.18449190
f 147 146 110
f 147 110 98
f 147 98 161
f 147 161 122
f 147 122 135
f 147 135 80
f 147 80 106
f 147 106 111
f 147 111 99
f 147 99 48
f 147 48 91
f 147 91 92
f 147 92 107
f 147 107 117
f 147 117 130
f 147 130 96
f 147 96 118
f 147 118 10
f 147 10 23
f 147 23 11
f 147 11 9
f 147 9 90
f 147 90 159
f 147 159 158
f 147 158 146
f 146 158 151
f 146 151 110
f 23 10 11
f 11 90 9
f 11 10 123
f 11 123 138
f 11 138 90
f 90 84 159
f 90 138 84
f 159 149 150
f 159 150 158
f 159 84 149
f 158 150 151
f 151 161 98
f 151 98 110
f 151 150 100
f 151 100 49
f 151 49 87
f 151 87 6
f 151 6 161
f 10 118 12
f 10 12 101
f 10 101 123
f 123 101 124
f 123 124 21
f 123 21 121
f 123 121 84
f 123 84 138
f 84 93 70
f 84 70 38
f 84 38 66
f 84 66 103
f 84 103 149
f 84 121 93
f 149 103 66
f 149 66 38
f 149 38 37
f 149 37 65
f 149 65 102
f 149 102 150
f 150 102 49
f 150 49 100
f 161 6 5
f 161 5 34
f 161 34 122
f 49 112 87
f 49 102 85
f 49 85 94
f 49 94 133
f 49 133 163
f 49 163 36
f 49 36 25
f 49 25 109
f 49 109 112
f 87 112 55
f 87 55 6
f 6 55 15
f 6 15 35
f 6 35 34
f 6 34 5
f 118 96 12
f 12 96 8
f 12 8 1
f 12 1 2
f 12 2 136
f 12 136 47
f 12 47 33
f 12 33 63
f 12 63 32
f 12 32 82
f 12 82 74
f 12 74 104
f 12 104 24
f 12 24 20
f 12 20 125
f 12 125 128
f 12 128 22
f 12 22 154
f 12 154 162
f 12 162 145
f 12 145 95
f 12 95 156
f 12 156 140
f 12 140 139
f 12 139 26
f 12 26 124
f 12 124 101
f 124 26 21
f 21 26 139
f 21 139 142
f 21 142 121
f 121 142 93
f 93 142 75
f 93 75 76
f 93 76 94
f 93 94 71
f 93 71 70
f 70 71 37
f 70 37 38
f 102 65 85
f 122 34 135
f 34 35 88
f 34 88 89
f 34 89 53
f 34 53 106
f 34 106 80
f 34 80 135
f 112 109 55
f 85 65 37
f 85 37 71
f 85 71 94
f 94 76 133
f 133 164 120
f 133 120 163
f 133 76 157
f 133 157 164
f 163 67 36
f 163 120 164
f 163 164 134
f 163 134 19
f 163 19 3
f 163 3 50
f 163 50 67
f 36 67 108
f 36 108 25
f 25 108 31
f 25 31 79
f 25 79 109
f 109 79 105
f 109 105 7
f 109 7 58
f 109 58 60
f 109 60 55
f 55 60 88
f 55 88 15
f 15 88 35
f 96 130 1
f 96 1 8
f 139 44 75
f 139 75 142
f 139 140 45
f 139 45 44
f 75 44 45
f 75 45 76
f 89 88 43
f 89 43 16
f 89 16 48
f 89 48 116
f 89 116 53
f 53 116 99
f 53 99 111
f 53 111 106
f 76 45 140
f 76 140 143
f 76 143 157
f 164 157 145
f 164 145 113
f 164 113 155
f 164 155 134
f 157 29 95
f 157 95 145
f 157 143 29
f 67 50 126
f 67 126 108
f 134 155 3
f 134 3 19
f 3 155 57
f 3 57 52
f 3 52 50
f 50 52 61
f 50 61 126
f 108 126 31
f 31 126 17
f 31 17 41
f 31 41 105
f 31 105 79
f 105 41 17
f 105 17 88
f 105 88 7
f 7 88 58
f 58 88 60
f 88 17 73
f 88 73 148
f 88 148 28
f 88 28 62
f 88 62 43
f 130 117 1
f 1 117 107
f 1 107 92
f 1 92 91
f 1 91 2
f 140 156 29
f 140 29 143
f 43 62 16
f 16 62 48
f 48 62 4
f 48 4 91
f 48 99 116
f 145 162 68
f 145 68 30
f 145 30 131
f 145 131 155
f 145 155 113
f 155 131 39
f 155 39 57
f 29 156 95
f 126 61 17
f 57 39 152
f 57 152 52
f 52 152 46
f 52 46 144
f 52 144 61
f 61 144 17
f 17 144 51
f 17 51 73
f 73 51 148
f 148 51 77
f 148 77 28
f 28 77 62
f 62 77 56
f 62 56 64
f 62 64 27
f 62 27 4
f 2 137 136
f 2 91 137
f 4 27 91
f 91 27 137
f 162 154 68
f 68 22 128
f 68 128 83
f 68 83 160
f 68 160 152
f 68 152 30
f 68 154 22
f 30 152 153
f 30 153 39
f 30 39 131
f 39 153 152
f 152 81 13
f 152 13 46
f 152 160 81
f 46 13 141
f 46 141 144
f 144 77 51
f 144 141 64
f 144 64 56
f 144 56 77
f 64 141 14
f 64 14 127
f 64 127 27
f 27 127 33
f 27 33 47
f 27 47 136
f 27 136 137
f 128 125 83
f 83 125 69
f 83 69 115
f 83 115 114
f 83 114 160
f 160 114 81
f 81 59 141
f 81 141 13
f 81 114 59
f 141 59 54
f 141 54 14
f 14 18 132
f 14 132 40
f 14 40 33
f 14 33 127
f 14 54 72
f 14 72 18
f 33 40 97
f 33 97 63
f 125 20 69
f 69 20 115
f 115 72 54
f 115 54 114
f 115 20 129
f 115 129 72
f 114 54 59
f 18 86 97
f 18 97 132
f 18 72 42
f 18 42 86
f 132 97 40
f 72 129 119
f 72 119 42
f 97 86 82
f 97 82 32
f 97 32 63
f 20 24 78
f 20 78 129
f 129 78 24
f 129 24 119
f 86 42 119
f 86 119 74
f 86 74 82
f 119 24 104
f 119 104 74
@@ -0,0 +1,567 @@
# https://github.com/mikedh/trimesh
v -0.26620926 0.29317125 -0.20617018
v -0.26620926 0.29331079 -0.20568355
v -0.26999801 0.29247108 -0.20413256
v -0.26656753 0.29108298 -0.20938241
v -0.27025391 0.28451584 -0.21770545
v -0.27025391 0.29319940 -0.20227954
v -0.27025391 0.29316880 -0.20234666
v -0.27025391 0.29056031 -0.20768520
v -0.27025391 0.29125925 -0.20635236
v -0.27025391 0.28582438 -0.21554319
v -0.27025391 0.29291052 -0.20290041
v -0.27025391 0.28411190 -0.21835988
v -0.27025391 0.29124946 -0.20637154
v -0.27025391 0.28163928 -0.22201320
v -0.27025391 0.29320797 -0.20226036
v -0.27025391 0.29090672 -0.20703796
v -0.27025391 0.29255799 -0.20364114
v -0.27025391 0.29286523 -0.20299630
v -0.27025391 0.28129409 -0.22242312
v -0.27025391 0.28188042 -0.22167759
v -0.27025391 0.28086934 -0.22183581
v -0.27025391 0.29330590 -0.20163709
v -0.27025391 0.28086689 -0.22244230
v -0.27025391 0.28313509 -0.21984854
v -0.27025391 0.28985769 -0.20887660
v -0.27025391 0.28784042 -0.21221109
v -0.27025391 0.29022124 -0.20826532
v -0.27025391 0.29052848 -0.20774033
v -0.27025391 0.29293745 -0.20105457
v -0.27025391 0.29321654 -0.20105937
v -0.27025391 0.28127695 -0.22244230
v -0.27025391 0.28419024 -0.21823523
v -0.27025391 0.28244716 -0.22086015
v -0.27025391 0.28379119 -0.21886090
v -0.26955758 0.28389646 -0.21900952
v -0.26955758 0.28089627 -0.22286180
v -0.26955758 0.28115332 -0.22286180
v -0.26955758 0.28080813 -0.22242072
v -0.26994413 0.28305186 -0.22009545
v -0.26875619 0.28847939 -0.21218472
v -0.26483680 0.29321532 -0.20701878
v -0.26091740 0.29325816 -0.20842593
v -0.26323672 0.28237862 -0.22343713
v -0.26073558 0.29313453 -0.20877352
v -0.26998993 0.28097461 -0.22278989
v -0.26998993 0.28107498 -0.22278989
v -0.26815953 0.29186027 -0.20700440
v -0.27001552 0.29181131 -0.20549177
v -0.26387917 0.29241600 -0.20870161
v -0.27024583 0.29125925 -0.20636195
v -0.26998723 0.29044280 -0.20809272
v -0.26926531 0.28506300 -0.21742018
v -0.26934208 0.29314799 -0.20347813
v -0.26872252 0.29250658 -0.20550615
v -0.26256059 0.28438609 -0.22075707
v -0.27021755 0.29056765 -0.20770198
v -0.26549946 0.29217241 -0.20831326
v -0.25683638 0.29328142 -0.20900845
v -0.25683638 0.29328142 -0.20848586
v -0.25683638 0.28080936 -0.22509838
v -0.25683638 0.28088770 -0.22552988
v -0.25683638 0.28488674 -0.22052694
v -0.27006131 0.28511809 -0.21684486
v -0.25884592 0.29324714 -0.20892934
v -0.25884592 0.28105907 -0.22545316
v -0.25884592 0.29242824 -0.21005842
v -0.25884592 0.28099297 -0.22545316
v -0.25817518 0.28109334 -0.22547953
v -0.25817518 0.29326183 -0.20895571
v -0.25817518 0.28095135 -0.22547953
v -0.26407851 0.28093054 -0.22483709
v -0.26407851 0.28111782 -0.22483709
v -0.26018471 0.29319206 -0.20885023
v -0.26018471 0.29123110 -0.21159022
v -0.26018471 0.28387688 -0.22164643
v -0.26018471 0.29328264 -0.20836121
v -0.26018471 0.29180886 -0.21079675
v -0.26531494 0.29110502 -0.21008239
v -0.26822822 0.29260328 -0.20570991
v -0.27021216 0.29320920 -0.20230591
v -0.26152350 0.29325571 -0.20829888
v -0.26152350 0.29224096 -0.20978753
v -0.26152350 0.28640214 -0.21808900
v -0.26997915 0.29312963 -0.20277096
v -0.26459032 0.29310515 -0.20739274
v -0.26935959 0.29248944 -0.20483973
v -0.26286229 0.28123656 -0.22494975
v -0.26286229 0.28181554 -0.22425457
v -0.26286229 0.28215094 -0.22379431
v -0.26286229 0.28157073 -0.22458778
v -0.26286229 0.29117601 -0.21085428
v -0.26286229 0.28083384 -0.22494975
v -0.26270605 0.29312596 -0.20809032
v -0.26420108 0.29330223 -0.20702118
v -0.26420108 0.29181008 -0.20946391
v -0.26420108 0.29316513 -0.20747904
v -0.26420108 0.29293990 -0.20781465
v -0.26806660 0.29317982 -0.20484453
v -0.26553987 0.28086567 -0.22423779
v -0.26553987 0.28152422 -0.22384944
v -0.26553987 0.28176291 -0.22351624
v -0.26553987 0.29051379 -0.21086387
v -0.26956162 0.29322756 -0.20299869
v -0.26994817 0.28440201 -0.21810338
v -0.26855551 0.28571788 -0.21672979
v -0.26754940 0.28150585 -0.22316145
v -0.26754940 0.28087913 -0.22354980
v -0.26754940 0.28117168 -0.22354980
v -0.26754940 0.28080569 -0.22308954
v -0.26687866 0.29249801 -0.20682940
v -0.26118004 0.28839370 -0.21538976
v -0.26888819 0.28157563 -0.22258852
v -0.26888819 0.28084608 -0.22296728
v -0.26888819 0.28181677 -0.22225531
v -0.26460783 0.29175990 -0.20939200
v -0.26940269 0.28579133 -0.21618323
v -0.26396268 0.28172374 -0.22412992
v -0.26942828 0.28175067 -0.22215943
v -0.25924459 0.28103704 -0.22543878
v -0.25924459 0.28102112 -0.22543878
v -0.27022698 0.28985647 -0.20889818
v -0.27022698 0.28783920 -0.21223267
v -0.27022698 0.28245084 -0.22086494
v -0.27022698 0.28086934 -0.22184060
v -0.27022698 0.29330590 -0.20166586
v -0.27022698 0.28582315 -0.21556476
v -0.27022698 0.28164295 -0.22201799
v -0.27022698 0.28379609 -0.21886809
v -0.27022698 0.28188409 -0.22168239
v -0.27025257 0.29321654 -0.20105937
v -0.26414181 0.29256901 -0.20838278
v -0.26599780 0.29044892 -0.21077278
v -0.26891108 0.29324469 -0.20369148
v -0.26790497 0.28170538 -0.22276352
v -0.26870367 0.29316635 -0.20418530
v -0.26826054 0.29325326 -0.20438187
v -0.26756421 0.29324714 -0.20504589
v -0.27019331 0.28413883 -0.21835748
v -0.26403137 0.28308001 -0.22214504
v -0.27019061 0.28320609 -0.21977183
v -0.25750578 0.29327407 -0.20898208
v -0.25750578 0.29023838 -0.21315798
v -0.25750578 0.28112517 -0.22550590
v -0.25750578 0.28453298 -0.22095844
v -0.25750578 0.28091585 -0.22550590
v -0.27003437 0.29115276 -0.20682461
v -0.25951531 0.29323123 -0.20890297
v -0.26735141 0.29313942 -0.20544383
v -0.26085410 0.28245328 -0.22354021
v -0.25649697 0.29286401 -0.20849545
v -0.25649697 0.29249556 -0.21014951
v -0.25649697 0.28873032 -0.21404494
v -0.25649697 0.28150096 -0.22517269
v -0.25649697 0.29326183 -0.20905160
v -0.25649697 0.28096114 -0.22466928
v -0.25649697 0.28087668 -0.22554426
v -0.25649697 0.29252984 -0.20885503
v -0.25649697 0.28162704 -0.22500729
v -0.25649697 0.29328019 -0.20849545
v -0.25649697 0.28291231 -0.22325254
v -0.25649697 0.29310882 -0.20929371
v -0.25649697 0.29109155 -0.21206966
v -0.25649697 0.29240743 -0.20902043
v -0.25649697 0.28080813 -0.22509838
v -0.25649697 0.29170359 -0.20998171
v -0.25649697 0.28116679 -0.22554426
v -0.25649697 0.28175312 -0.22483709
v -0.25649697 0.28856017 -0.21427747
v -0.25649697 0.28236515 -0.22274914
v -0.25649697 0.29306598 -0.20935604
v -0.25649697 0.29269998 -0.20867044
v -0.26683421 0.29320552 -0.20567396
v -0.26801945 0.28095747 -0.22347309
v -0.26801945 0.28108967 -0.22347309
v -0.26219289 0.29318716 -0.20818142
v -0.26219289 0.28083017 -0.22497133
v -0.26219289 0.28357453 -0.22190293
v -0.26219289 0.29329488 -0.20769239
v -0.26219289 0.28241534 -0.22348747
v -0.26536208 0.29314677 -0.20679584
v -0.26353168 0.29324592 -0.20760849
v -0.26353168 0.28080691 -0.22442957
v -0.26353168 0.28085832 -0.22490661
v -0.26353168 0.28119372 -0.22490661
v -0.26353168 0.28152911 -0.22452785
v -0.26353168 0.28177148 -0.22419224
v -0.26556680 0.29325204 -0.20639311
v -0.26997511 0.28842920 -0.21143201
v -0.26961415 0.28152422 -0.22239675
v -0.26066689 0.29177826 -0.21075600
f 159 150 171
f 159 171 157
f 159 157 163
f 159 163 165
f 159 165 152
f 159 152 168
f 159 168 169
f 159 169 155
f 159 155 164
f 159 164 156
f 159 156 166
f 159 166 153
f 159 153 158
f 159 158 167
f 159 167 160
f 159 160 162
f 159 162 151
f 159 151 170
f 159 170 161
f 159 161 154
f 159 154 58
f 159 58 59
f 159 59 2
f 159 2 22
f 159 22 130
f 159 130 29
f 159 29 150
f 150 29 171
f 154 161 58
f 58 161 141
f 58 141 76
f 58 76 178
f 58 178 94
f 58 94 2
f 58 2 59
f 2 94 187
f 2 187 137
f 2 137 136
f 2 136 125
f 2 125 22
f 22 125 136
f 22 136 133
f 22 133 103
f 22 103 80
f 22 80 15
f 22 15 6
f 22 6 7
f 22 7 11
f 22 11 18
f 22 18 17
f 22 17 9
f 22 9 13
f 22 13 16
f 22 16 8
f 22 8 28
f 22 28 27
f 22 27 25
f 22 25 26
f 22 26 10
f 22 10 5
f 22 5 32
f 22 32 12
f 22 12 34
f 22 34 24
f 22 24 33
f 22 33 20
f 22 20 14
f 22 14 19
f 22 19 31
f 22 31 23
f 22 23 21
f 22 21 29
f 22 29 30
f 22 30 130
f 130 30 29
f 29 168 152
f 29 152 165
f 29 165 163
f 29 163 157
f 29 157 171
f 29 21 124
f 29 124 155
f 29 155 169
f 29 169 168
f 161 170 69
f 161 69 141
f 141 69 76
f 76 69 42
f 76 42 81
f 76 81 178
f 178 81 94
f 94 181 41
f 94 41 187
f 94 81 181
f 187 41 137
f 137 98 136
f 137 41 172
f 137 172 98
f 136 98 133
f 133 135 103
f 133 98 135
f 103 135 80
f 80 135 15
f 15 135 53
f 15 53 84
f 15 84 6
f 21 23 38
f 21 38 124
f 124 38 164
f 124 164 155
f 170 151 147
f 170 147 64
f 170 64 69
f 69 64 42
f 42 64 147
f 42 147 81
f 81 175 181
f 81 147 73
f 81 73 44
f 81 44 175
f 181 97 96
f 181 96 41
f 181 175 93
f 181 93 97
f 41 180 1
f 41 1 172
f 41 96 85
f 41 85 180
f 98 172 148
f 98 148 79
f 98 79 51
f 98 51 54
f 98 54 135
f 172 1 148
f 135 54 146
f 135 146 86
f 135 86 3
f 135 3 53
f 6 84 7
f 53 3 84
f 84 18 11
f 84 11 7
f 84 3 18
f 23 31 46
f 23 46 45
f 23 45 36
f 23 36 113
f 23 113 38
f 38 113 92
f 38 92 109
f 38 109 164
f 164 109 182
f 164 182 60
f 164 60 156
f 151 66 147
f 151 162 142
f 151 142 66
f 147 66 74
f 147 74 77
f 147 77 73
f 175 44 93
f 73 77 190
f 73 190 44
f 44 82 93
f 44 190 43
f 44 43 117
f 44 117 82
f 97 93 131
f 97 131 78
f 97 78 96
f 96 78 132
f 96 132 85
f 93 95 49
f 93 49 131
f 93 82 91
f 93 91 114
f 93 114 123
f 93 123 95
f 180 110 148
f 180 148 1
f 180 85 57
f 180 57 110
f 85 132 104
f 85 104 57
f 148 110 47
f 148 47 121
f 148 121 51
f 148 51 79
f 51 121 25
f 51 25 27
f 51 27 56
f 51 56 54
f 54 56 146
f 146 56 8
f 146 8 16
f 146 16 13
f 146 13 9
f 146 9 50
f 146 50 48
f 146 48 86
f 86 48 3
f 3 17 18
f 3 48 17
f 31 19 46
f 45 46 174
f 45 174 173
f 45 173 36
f 36 173 71
f 36 71 107
f 36 107 113
f 113 107 99
f 113 99 183
f 113 183 92
f 92 183 120
f 92 120 67
f 92 67 70
f 92 70 145
f 92 145 61
f 92 61 156
f 92 156 176
f 92 176 182
f 92 182 109
f 182 176 60
f 60 176 156
f 156 61 145
f 156 145 143
f 156 143 166
f 66 142 83
f 66 83 74
f 162 160 62
f 162 62 142
f 142 62 144
f 142 144 75
f 142 75 177
f 142 177 83
f 74 83 111
f 74 111 77
f 77 111 55
f 77 55 190
f 190 55 43
f 82 117 139
f 82 139 91
f 43 55 89
f 43 89 88
f 43 88 90
f 43 90 185
f 43 185 186
f 43 186 117
f 117 186 185
f 117 185 100
f 117 100 134
f 117 134 101
f 117 101 139
f 131 49 115
f 131 115 78
f 78 115 102
f 78 102 52
f 78 52 132
f 132 52 104
f 95 123 49
f 49 123 102
f 49 102 115
f 91 139 101
f 91 101 114
f 114 101 134
f 114 134 118
f 114 118 123
f 123 118 129
f 123 129 20
f 123 20 33
f 123 33 52
f 123 52 39
f 123 39 102
f 110 57 4
f 110 4 188
f 110 188 47
f 57 104 116
f 57 116 4
f 104 52 140
f 104 140 24
f 104 24 128
f 104 128 34
f 104 34 138
f 104 138 12
f 104 12 32
f 104 32 5
f 104 5 63
f 104 63 116
f 47 188 121
f 121 188 122
f 121 122 26
f 121 26 25
f 27 28 56
f 56 28 8
f 9 17 48
f 9 48 50
f 19 14 46
f 46 14 189
f 46 189 37
f 46 37 174
f 173 174 72
f 173 72 71
f 71 72 184
f 71 184 183
f 71 183 99
f 71 99 107
f 183 184 119
f 183 119 120
f 120 119 143
f 120 143 145
f 120 145 70
f 120 70 67
f 166 143 87
f 166 87 90
f 166 90 153
f 83 177 88
f 83 88 111
f 160 167 149
f 160 149 75
f 160 75 144
f 160 144 62
f 75 149 177
f 177 149 179
f 177 179 88
f 111 88 55
f 55 88 89
f 88 179 167
f 88 167 90
f 90 167 158
f 90 158 153
f 90 87 184
f 90 184 185
f 185 184 72
f 185 72 100
f 100 72 108
f 100 108 106
f 100 106 134
f 134 106 118
f 102 39 105
f 102 105 52
f 52 105 35
f 52 35 39
f 52 33 140
f 118 106 112
f 118 112 127
f 118 127 129
f 129 127 14
f 129 14 20
f 33 24 140
f 39 35 105
f 4 40 188
f 4 116 63
f 4 63 40
f 188 40 63
f 188 63 122
f 24 34 128
f 34 12 138
f 5 10 126
f 5 126 63
f 63 126 122
f 122 126 10
f 122 10 26
f 14 127 189
f 189 112 106
f 189 106 37
f 189 127 112
f 37 106 108
f 37 108 72
f 37 72 174
f 184 87 119
f 119 87 65
f 119 65 68
f 119 68 143
f 143 68 87
f 87 68 65
f 167 179 149
@@ -0,0 +1,903 @@
# https://github.com/mikedh/trimesh
v -0.28533504 0.28096588 -0.20945385
v -0.28533504 0.28108218 -0.20945385
v -0.28940030 0.28114340 -0.19831660
v -0.28940030 0.28089855 -0.19831660
v -0.28428029 0.28149598 -0.21037466
v -0.28935165 0.28108341 -0.19887303
v -0.28935165 0.28096343 -0.19887303
v -0.27394299 0.28640036 -0.21206375
v -0.27336696 0.29251308 -0.19359110
v -0.27929846 0.28573437 -0.20739192
v -0.27087605 0.29253879 -0.20296583
v -0.27130612 0.28909495 -0.20941431
v -0.28805364 0.28111891 -0.20367480
v -0.28805364 0.28093527 -0.20367480
v -0.27776499 0.29024453 -0.19359110
v -0.28475123 0.28090956 -0.21036619
v -0.28475123 0.28115564 -0.21036619
v -0.28049138 0.28163188 -0.21458609
v -0.27996400 0.28841304 -0.19544119
v -0.29010670 0.28118135 -0.19430006
v -0.29010670 0.28086672 -0.19430006
v -0.27890925 0.28122542 -0.21705476
v -0.27890925 0.28087284 -0.21705476
v -0.28350188 0.28520549 -0.20032769
v -0.28799721 0.28171880 -0.20207327
v -0.28282856 0.28587148 -0.19898602
v -0.28976615 0.28154373 -0.19359110
v -0.28976615 0.28154496 -0.19363064
v -0.28880870 0.28084223 -0.20099711
v -0.27067366 0.29113457 -0.20614629
v -0.28780261 0.28157679 -0.20300537
v -0.28669921 0.28174451 -0.20482157
v -0.28617183 0.28319036 -0.20099711
v -0.27172062 0.29230986 -0.20245741
v -0.27301084 0.29327212 -0.19359110
v -0.27301084 0.29284731 -0.19359110
v -0.28176602 0.28160005 -0.21317098
v -0.27061722 0.29311175 -0.20206479
v -0.27152602 0.29250574 -0.20227381
v -0.27611865 0.28178246 -0.21820436
v -0.27932376 0.28642362 -0.20546557
v -0.28386773 0.28163922 -0.21060345
v -0.28702420 0.28353682 -0.19359110
v -0.27123411 0.29308236 -0.20133323
v -0.27060944 0.28372781 -0.21876927
v -0.28869583 0.28094507 -0.20220320
v -0.28869583 0.28110177 -0.20220320
v -0.27744973 0.28244846 -0.21619044
v -0.28295116 0.28085080 -0.21236598
v -0.27414732 0.29189851 -0.19898602
v -0.27926732 0.28839345 -0.19931932
v -0.27969739 0.28885010 -0.19359110
v -0.27361995 0.29287179 -0.19630833
v -0.27921867 0.28165514 -0.21600120
v -0.27778250 0.28163310 -0.21729767
v -0.27175370 0.28899824 -0.20924766
v -0.28472010 0.28176410 -0.20889742
v -0.28696776 0.28081407 -0.20501364
v -0.28830663 0.28080673 -0.20166653
v -0.28553159 0.28455051 -0.19430006
v -0.28739783 0.28113360 -0.20501364
v -0.28964550 0.28080673 -0.19430006
v -0.28964550 0.28081040 -0.19359110
v -0.27620038 0.28478924 -0.21299304
v -0.27667910 0.28095119 -0.21879752
v -0.28820933 0.28085325 -0.20300537
v -0.28820933 0.28124134 -0.20300537
v -0.27194052 0.28439380 -0.21675536
v -0.27466691 0.29247513 -0.19363064
v -0.28342210 0.28177634 -0.21086331
v -0.27131585 0.29313623 -0.20099711
v -0.28801472 0.28240071 -0.19697775
v -0.27628990 0.29085666 -0.19697775
v -0.27810749 0.28177389 -0.21685139
v -0.27346621 0.29256083 -0.19831660
v -0.27528380 0.28573559 -0.21208070
v -0.28820154 0.28253538 -0.19496949
v -0.28681402 0.28182041 -0.20434422
v -0.27370168 0.29226089 -0.19359110
v -0.28432311 0.28549931 -0.19359110
v -0.27877303 0.28179593 -0.21624693
v -0.28336566 0.28111034 -0.21213719
v -0.28336566 0.28093650 -0.21213719
v -0.27733686 0.28173227 -0.21745020
v -0.28135347 0.28442931 -0.20751903
v -0.28360113 0.28121563 -0.21167679
v -0.28360113 0.28087039 -0.21167679
v -0.27106481 0.29298810 -0.20177951
v -0.27340977 0.29320112 -0.19496949
v -0.27288240 0.28918677 -0.20765178
v -0.27866795 0.28108341 -0.21744737
v -0.27866795 0.28096466 -0.21744737
v -0.28732583 0.28238602 -0.20078809
v -0.28962214 0.28082142 -0.19359110
v -0.28498086 0.28085937 -0.20968547
v -0.28498086 0.28127439 -0.20968547
v -0.27320739 0.29304074 -0.19713310
v -0.28205987 0.28713981 -0.19363064
v -0.28335009 0.28375229 -0.20548534
v -0.28335009 0.28576497 -0.19697775
v -0.27354016 0.29327090 -0.19359110
v -0.28875422 0.28116666 -0.20166653
v -0.28875422 0.28087773 -0.20166653
v -0.27526045 0.28505123 -0.21338847
v -0.27291548 0.28084590 -0.22110519
v -0.27334556 0.29253267 -0.19359110
v -0.27659932 0.28974014 -0.20068076
v -0.27190939 0.29241637 -0.20201113
v -0.28348826 0.28317444 -0.20702191
v -0.28674202 0.28090589 -0.20635248
v -0.28425110 0.28090222 -0.21098477
v -0.28425110 0.28117156 -0.21098477
v -0.27999125 0.28108586 -0.21612265
v -0.27999125 0.28096221 -0.21612265
v -0.27855508 0.28166616 -0.21669321
v -0.29013395 0.28120951 -0.19359110
v -0.29013395 0.28084468 -0.19359110
v -0.28735891 0.28173839 -0.20346013
v -0.27156883 0.28092181 -0.22217005
v -0.27156883 0.28245335 -0.22021545
v -0.27156883 0.28112748 -0.22217005
v -0.27156883 0.28080550 -0.22175201
v -0.27156883 0.28850364 -0.21021366
v -0.27290770 0.29329783 -0.19630833
v -0.27290770 0.29330395 -0.19563891
v -0.27606416 0.28579803 -0.21103844
v -0.27826317 0.28088386 -0.21758013
v -0.27826317 0.28080305 -0.21706323
v -0.28338317 0.28243499 -0.20950187
v -0.27591821 0.28437666 -0.21404942
v -0.28285580 0.28656319 -0.19363064
v -0.28797580 0.28103566 -0.20401657
v -0.28797580 0.28102342 -0.20401657
v -0.27218572 0.28119849 -0.22173507
v -0.27218572 0.28088508 -0.22173507
v -0.27218572 0.28211424 -0.22035385
v -0.27811722 0.28247417 -0.21558599
v -0.28629638 0.28080918 -0.20635248
v -0.27931014 0.28842406 -0.19887303
v -0.28112773 0.28161841 -0.21387995
v -0.27179652 0.28164657 -0.22135375
v -0.27830404 0.28153761 -0.21707171
v -0.28418689 0.28184980 -0.20969677
v -0.27069312 0.29047469 -0.20748513
v -0.28494973 0.28153761 -0.20908384
v -0.28351356 0.28252069 -0.20902735
v -0.28537980 0.28175798 -0.20753880
v -0.27269753 0.28111891 -0.22150063
v -0.27269753 0.28092915 -0.22150063
v -0.28939640 0.28176165 -0.19430006
v -0.28843896 0.28155475 -0.20099711
v -0.27958647 0.28086794 -0.21636557
v -0.27958647 0.28121930 -0.21636557
v -0.28934775 0.28172615 -0.19483391
v -0.27819895 0.28992867 -0.19363064
v -0.27025526 0.28379147 -0.21885966
v -0.27025526 0.29320724 -0.20225969
v -0.27025526 0.29056039 -0.20768568
v -0.27025526 0.29319989 -0.20227946
v -0.27025526 0.28313404 -0.21984826
v -0.27025526 0.29316929 -0.20234725
v -0.27025526 0.29125699 -0.20635813
v -0.27025526 0.28223054 -0.22117298
v -0.27025526 0.28163922 -0.22201187
v -0.27025526 0.28411222 -0.21835971
v -0.27025526 0.29291097 -0.20290087
v -0.27025526 0.28582496 -0.21554362
v -0.27025526 0.29293668 -0.20105642
v -0.27025526 0.28129398 -0.22242143
v -0.27025526 0.28418935 -0.21823543
v -0.27025526 0.29090686 -0.20703885
v -0.27025526 0.28086916 -0.22183392
v -0.27025526 0.28188040 -0.22167857
v -0.27025526 0.29253512 -0.20368892
v -0.27025526 0.28086672 -0.22244121
v -0.27025526 0.28319893 -0.21975222
v -0.27025526 0.28445869 -0.21779762
v -0.27025526 0.29022127 -0.20826189
v -0.27025526 0.29052856 -0.20774217
v -0.27025526 0.28127684 -0.22244121
v -0.27025526 0.28985032 -0.20888612
v -0.27025526 0.29330640 -0.20163828
v -0.27025526 0.29321703 -0.20105925
v -0.27025526 0.28244723 -0.22085945
v -0.28791158 0.28164534 -0.20251955
v -0.28537202 0.28376576 -0.20099711
v -0.27470194 0.28442808 -0.21480358
v -0.28766833 0.28187673 -0.20231336
v -0.27135088 0.28174084 -0.22147520
v -0.28704365 0.28352213 -0.19363064
v -0.27307117 0.28765400 -0.21056109
v -0.28608621 0.28089365 -0.20769133
v -0.28608621 0.28116054 -0.20769133
v -0.28278380 0.28179470 -0.21157228
v -0.28263785 0.28573314 -0.20070900
v -0.29000551 0.28106505 -0.19544119
v -0.29000551 0.28098669 -0.19544119
v -0.27277926 0.29321703 -0.19764717
v -0.27966821 0.28886847 -0.19363064
v -0.28804197 0.28175063 -0.20166653
v -0.28665445 0.28106015 -0.20673662
v -0.28665445 0.28099159 -0.20673662
v -0.27086437 0.29317663 -0.20160156
v -0.28239459 0.28689741 -0.19363064
v -0.28000098 0.28575885 -0.20614911
v -0.28229729 0.28084223 -0.21305800
v -0.28464225 0.28100383 -0.21072491
v -0.28464225 0.28105035 -0.21072491
v -0.28272736 0.28091691 -0.21284333
v -0.27325020 0.29308726 -0.19668682
v -0.27042651 0.29300523 -0.20251107
v -0.27229275 0.29325621 -0.19836179
v -0.27353432 0.29327212 -0.19363064
v -0.27396439 0.29245065 -0.19747770
v -0.29013590 0.28120951 -0.19363064
v -0.29013590 0.28084468 -0.19363064
v -0.27157078 0.28147762 -0.22171812
v -0.27157078 0.28188897 -0.22111084
v -0.27616341 0.29056406 -0.19898602
v -0.27200085 0.29314725 -0.19952833
v -0.28951122 0.28083489 -0.19697775
v -0.27553873 0.28547360 -0.21233209
v -0.27089745 0.28156454 -0.22189889
v -0.27089745 0.28084590 -0.22228021
v -0.27089745 0.28123032 -0.22228021
v -0.27089745 0.28313037 -0.21954603
v -0.27089745 0.28180205 -0.22156559
v -0.27089745 0.29329906 -0.20099711
v -0.28013136 0.28853424 -0.19363064
v -0.27491406 0.28084835 -0.21975787
v -0.27491406 0.28128419 -0.21975787
v -0.27845194 0.28630487 -0.20718573
v -0.28405066 0.28175920 -0.21015717
v -0.27940938 0.28177879 -0.21555492
v -0.27467080 0.29180424 -0.19817819
v -0.27467080 0.29247636 -0.19359110
v -0.28763719 0.28082019 -0.20367480
v -0.27256131 0.29310073 -0.19457970
v -0.27256131 0.29306767 -0.19457970
v -0.27213123 0.29322560 -0.19898602
v -0.27897153 0.28156822 -0.21643900
v -0.28543040 0.28117400 -0.20902735
v -0.28543040 0.28088263 -0.20902735
v -0.28452160 0.28163065 -0.20969677
v -0.27935295 0.28111279 -0.21682315
v -0.27935295 0.28093405 -0.21682315
v -0.27691068 0.28085325 -0.21841055
v -0.27303225 0.28161229 -0.22060241
v -0.28973112 0.28151557 -0.19430006
v -0.27192885 0.28100383 -0.22210226
v -0.27192885 0.28105035 -0.22210226
v -0.27331637 0.28776663 -0.21011480
v -0.28532531 0.28373148 -0.20140385
v -0.27546673 0.29189851 -0.19363064
v -0.29010476 0.28084223 -0.19359110
v -0.27043624 0.29034125 -0.20793142
v -0.28062760 0.28099894 -0.21541651
v -0.28062760 0.28105403 -0.21541651
v -0.28943143 0.28178736 -0.19359110
v -0.28239654 0.28689864 -0.19359110
v -0.27962150 0.28153639 -0.21575546
v -0.28746789 0.28181062 -0.20300537
v -0.27215653 0.29258042 -0.20099711
v -0.28837668 0.28150211 -0.20166653
v -0.28550435 0.28184000 -0.20702191
v -0.29004832 0.28092548 -0.19496949
v -0.29004832 0.28111769 -0.19496949
v -0.27468832 0.28241418 -0.21814222
v -0.27468832 0.28110789 -0.22015048
v -0.27468832 0.28093895 -0.22015048
v -0.28770336 0.28217545 -0.20032769
v -0.27373087 0.28698066 -0.21121638
v -0.27875357 0.28245580 -0.21490244
v -0.27391769 0.28103566 -0.22075211
v -0.27391769 0.28102342 -0.22075211
v -0.27066393 0.28239581 -0.22078601
v -0.28678678 0.28247294 -0.20233595
v -0.27147542 0.29323295 -0.20032769
v -0.27659542 0.28438156 -0.21338565
v -0.28013331 0.28853547 -0.19359110
v -0.27223827 0.28155965 -0.22120970
v -0.27223827 0.28177756 -0.22087357
v -0.27132947 0.29045755 -0.20680159
v -0.27357713 0.28081162 -0.22041034
v -0.28831247 0.28137356 -0.20236137
v -0.27438863 0.28630609 -0.21187168
v -0.27625487 0.28087651 -0.21894157
v -0.27295246 0.29323662 -0.19693538
v -0.28400396 0.28096588 -0.21143105
v -0.28400396 0.28108218 -0.21143105
v -0.28027147 0.28080305 -0.21505497
v -0.27744779 0.28090589 -0.21819306
v -0.27328523 0.29311297 -0.19630833
v -0.28945673 0.28085202 -0.19764717
v -0.28428808 0.28079938 -0.21036619
v -0.27500552 0.29223518 -0.19359110
v -0.27266055 0.29313990 -0.19816689
v -0.27864070 0.28641138 -0.20673662
v -0.28926213 0.28099526 -0.19359110
v -0.27347205 0.29324152 -0.19430006
v -0.27064836 0.28976830 -0.20875054
v -0.28131844 0.28172492 -0.21343367
f 168 183 238
f 168 238 239
f 168 239 36
f 168 36 172
f 168 172 175
f 168 175 180
f 168 180 169
f 168 169 164
f 168 164 173
f 168 173 163
f 168 163 184
f 168 184 160
f 168 160 176
f 168 176 156
f 168 156 165
f 168 165 170
f 168 170 177
f 168 177 167
f 168 167 181
f 168 181 178
f 168 178 179
f 168 179 158
f 168 158 171
f 168 171 162
f 168 162 174
f 168 174 166
f 168 166 161
f 168 161 159
f 168 159 157
f 168 157 182
f 168 182 183
f 183 182 35
f 183 35 238
f 238 35 36
f 238 36 239
f 36 35 101
f 36 101 236
f 36 236 296
f 36 296 15
f 36 15 52
f 36 52 280
f 36 280 260
f 36 260 80
f 36 80 43
f 36 43 259
f 36 259 27
f 36 27 116
f 36 116 117
f 36 117 255
f 36 255 63
f 36 63 94
f 36 94 299
f 36 299 79
f 36 79 9
f 36 9 106
f 36 106 172
f 172 122 175
f 172 106 9
f 172 9 79
f 172 79 299
f 172 299 94
f 172 94 63
f 172 63 122
f 182 157 228
f 182 228 125
f 182 125 35
f 35 125 213
f 35 213 101
f 122 295 128
f 122 128 284
f 122 284 230
f 122 230 105
f 122 105 135
f 122 135 224
f 122 224 175
f 122 63 62
f 122 62 295
f 175 224 119
f 175 119 250
f 175 250 251
f 175 251 180
f 63 255 62
f 157 159 203
f 157 203 228
f 228 203 278
f 228 278 240
f 228 240 212
f 228 212 124
f 228 124 125
f 125 124 213
f 213 69 236
f 213 236 101
f 213 124 288
f 213 288 300
f 213 300 69
f 295 138 66
f 295 66 95
f 295 95 16
f 295 16 87
f 295 87 49
f 295 49 206
f 295 206 291
f 295 291 128
f 295 62 59
f 295 59 138
f 128 152 23
f 128 23 247
f 128 247 284
f 128 291 152
f 284 247 230
f 230 135 105
f 230 247 287
f 230 287 135
f 135 149 250
f 135 250 119
f 135 119 224
f 135 287 149
f 62 255 216
f 62 216 221
f 62 221 59
f 250 275 274
f 250 274 251
f 250 149 270
f 250 270 92
f 250 92 275
f 180 251 121
f 180 121 225
f 180 225 223
f 180 223 169
f 255 117 216
f 159 38 203
f 159 161 38
f 203 44 71
f 203 71 278
f 203 38 88
f 203 88 108
f 203 108 44
f 278 71 240
f 240 71 220
f 240 220 297
f 240 297 198
f 240 198 212
f 212 198 124
f 124 198 288
f 69 254 296
f 69 296 236
f 69 300 89
f 69 89 293
f 69 293 53
f 69 53 254
f 288 198 97
f 288 97 210
f 288 210 293
f 288 293 89
f 288 89 300
f 138 59 58
f 138 58 66
f 66 237 59
f 66 59 29
f 66 29 103
f 66 103 46
f 66 46 14
f 66 14 110
f 66 110 192
f 66 192 243
f 66 243 95
f 66 58 237
f 95 243 16
f 16 207 111
f 16 111 87
f 16 243 1
f 16 1 207
f 87 83 209
f 87 209 152
f 87 152 49
f 87 111 83
f 49 152 206
f 206 152 291
f 59 221 29
f 59 237 58
f 152 246 23
f 152 209 246
f 23 92 127
f 23 127 247
f 23 246 92
f 247 127 287
f 287 127 292
f 287 292 149
f 149 292 270
f 216 117 116
f 216 116 215
f 216 215 20
f 216 20 21
f 216 21 221
f 221 21 294
f 221 294 29
f 275 92 91
f 275 91 274
f 251 269 148
f 251 148 134
f 251 134 281
f 251 281 141
f 251 141 217
f 251 217 121
f 251 274 91
f 251 91 269
f 270 292 65
f 270 65 92
f 92 65 292
f 92 292 127
f 92 246 245
f 92 245 91
f 169 223 164
f 121 217 189
f 121 189 223
f 121 223 225
f 223 189 227
f 223 227 173
f 223 173 164
f 38 161 211
f 38 211 11
f 38 11 39
f 38 39 108
f 38 108 88
f 161 166 211
f 44 108 146
f 44 146 85
f 44 85 71
f 71 263 220
f 71 85 205
f 71 205 41
f 71 41 263
f 108 39 10
f 108 10 298
f 108 298 233
f 108 233 129
f 108 129 146
f 220 263 75
f 220 75 297
f 297 75 235
f 297 235 198
f 198 235 214
f 198 214 97
f 254 155 296
f 254 53 155
f 296 155 15
f 293 210 53
f 53 210 139
f 53 139 73
f 53 73 155
f 97 214 210
f 210 214 51
f 210 51 139
f 29 294 103
f 103 294 21
f 103 21 4
f 103 4 7
f 103 7 46
f 46 47 132
f 46 132 133
f 46 133 14
f 46 7 6
f 46 6 47
f 14 133 202
f 14 202 1
f 14 1 110
f 110 1 192
f 192 1 243
f 207 208 258
f 207 258 257
f 207 257 114
f 207 114 289
f 207 289 111
f 207 1 2
f 207 2 208
f 111 289 83
f 1 202 133
f 1 133 132
f 1 132 2
f 83 289 114
f 83 114 246
f 83 246 209
f 246 114 113
f 246 113 245
f 215 116 27
f 215 27 28
f 215 28 20
f 21 20 267
f 21 267 266
f 21 266 4
f 269 231 148
f 269 91 231
f 148 248 281
f 148 281 134
f 148 231 248
f 281 248 282
f 281 282 141
f 141 189 217
f 141 282 218
f 141 218 189
f 91 245 22
f 91 22 115
f 91 115 142
f 91 142 248
f 91 248 231
f 189 276 227
f 189 218 226
f 189 226 45
f 189 45 165
f 189 165 156
f 189 156 276
f 227 276 184
f 227 184 163
f 227 163 173
f 211 166 174
f 211 174 30
f 211 30 11
f 11 34 39
f 11 30 283
f 11 283 90
f 11 90 232
f 11 232 34
f 39 34 10
f 146 129 143
f 146 143 244
f 146 244 57
f 146 57 85
f 85 57 109
f 85 109 205
f 263 107 50
f 263 50 75
f 263 41 107
f 205 109 41
f 41 109 265
f 41 265 99
f 41 99 78
f 41 78 107
f 10 232 273
f 10 273 234
f 10 234 302
f 10 302 194
f 10 194 70
f 10 70 233
f 10 233 298
f 10 34 232
f 233 70 37
f 233 37 42
f 233 42 5
f 233 5 244
f 233 244 143
f 233 143 129
f 75 50 107
f 75 107 219
f 75 219 235
f 235 219 195
f 235 195 253
f 235 253 51
f 235 51 214
f 155 19 77
f 155 77 60
f 155 60 199
f 155 199 15
f 155 73 19
f 15 199 52
f 139 51 24
f 139 24 33
f 139 33 26
f 139 26 73
f 73 26 100
f 73 100 19
f 51 253 25
f 51 25 186
f 51 186 24
f 4 266 7
f 7 266 197
f 7 197 196
f 7 196 6
f 47 6 102
f 47 102 264
f 47 264 25
f 47 25 285
f 47 285 67
f 47 67 13
f 47 13 132
f 208 2 17
f 208 17 5
f 208 5 112
f 208 112 290
f 208 290 113
f 208 113 258
f 257 258 113
f 257 113 114
f 2 201 13
f 2 13 61
f 2 61 193
f 2 193 242
f 2 242 145
f 2 145 96
f 2 96 17
f 2 132 201
f 245 113 82
f 245 82 37
f 245 37 140
f 245 140 153
f 245 153 54
f 245 54 241
f 245 241 115
f 245 115 22
f 27 259 28
f 28 259 43
f 28 43 80
f 28 80 260
f 28 260 190
f 28 190 150
f 28 150 249
f 28 249 20
f 20 3 267
f 20 249 102
f 20 102 3
f 266 267 196
f 266 196 197
f 248 40 268
f 248 268 136
f 248 136 282
f 248 142 55
f 248 55 84
f 248 84 40
f 282 120 218
f 282 136 45
f 282 45 120
f 218 120 226
f 115 74 142
f 115 241 81
f 115 81 137
f 115 137 286
f 115 286 272
f 115 272 130
f 115 130 74
f 142 74 55
f 276 156 176
f 276 176 160
f 276 160 184
f 226 120 45
f 45 167 177
f 45 177 170
f 45 170 165
f 45 136 268
f 45 268 68
f 45 68 123
f 45 123 167
f 174 162 30
f 30 162 144
f 30 144 252
f 30 252 76
f 30 76 283
f 283 76 90
f 90 76 126
f 90 126 232
f 232 126 273
f 244 5 17
f 244 17 96
f 244 96 145
f 244 145 57
f 57 145 147
f 57 147 265
f 57 265 109
f 107 78 262
f 107 262 219
f 265 147 78
f 265 78 99
f 78 118 262
f 78 147 32
f 78 32 118
f 273 222 234
f 273 126 222
f 234 81 54
f 234 54 18
f 234 18 140
f 234 140 302
f 234 222 64
f 234 64 279
f 234 279 81
f 302 140 194
f 194 140 37
f 194 37 70
f 37 82 86
f 37 86 112
f 37 112 5
f 37 5 42
f 219 262 277
f 219 277 195
f 195 277 253
f 253 277 188
f 253 188 25
f 19 100 77
f 77 154 150
f 77 150 60
f 77 100 72
f 77 72 154
f 60 150 199
f 199 150 229
f 199 229 52
f 52 229 280
f 24 186 200
f 24 200 33
f 33 200 151
f 33 151 93
f 33 93 72
f 33 72 100
f 33 100 26
f 25 188 262
f 25 262 31
f 25 31 185
f 25 185 285
f 25 264 200
f 25 200 186
f 6 196 267
f 6 267 102
f 102 267 3
f 102 249 264
f 264 249 151
f 264 151 200
f 285 185 31
f 285 31 67
f 67 31 13
f 13 31 61
f 13 201 132
f 112 86 82
f 112 82 290
f 290 82 113
f 61 31 193
f 193 31 145
f 193 145 242
f 145 32 147
f 145 31 32
f 140 18 153
f 153 261 54
f 153 18 261
f 54 81 241
f 54 261 18
f 260 280 98
f 260 98 204
f 260 204 131
f 260 131 190
f 190 131 150
f 150 154 249
f 150 131 204
f 150 204 98
f 150 98 229
f 249 154 151
f 40 84 48
f 40 48 268
f 268 48 187
f 268 187 68
f 55 74 84
f 84 74 48
f 74 130 104
f 74 104 48
f 81 279 64
f 81 64 222
f 81 222 76
f 81 76 252
f 81 252 144
f 81 144 137
f 137 144 286
f 286 144 272
f 272 144 191
f 272 191 130
f 130 191 104
f 167 123 181
f 68 187 8
f 68 8 123
f 123 12 181
f 123 8 12
f 162 171 144
f 144 171 158
f 144 158 256
f 144 256 56
f 144 56 191
f 76 222 126
f 262 118 31
f 262 188 277
f 118 32 31
f 154 72 151
f 72 93 271
f 72 271 151
f 229 98 280
f 151 271 93
f 48 104 8
f 48 8 187
f 191 56 104
f 104 56 8
f 181 12 301
f 181 301 178
f 8 56 256
f 8 256 12
f 12 256 301
f 158 179 256
f 256 179 178
f 256 178 301
@@ -0,0 +1,537 @@
# https://github.com/mikedh/trimesh
v -0.26823423 0.29324428 -0.17954364
v -0.26800376 0.28173802 -0.16109734
v -0.26705394 0.29300566 -0.17802799
v -0.26754280 0.29322837 -0.17889187
v -0.26353127 0.29056320 -0.17229238
v -0.26353127 0.29322470 -0.17632454
v -0.25782755 0.28237066 -0.15981367
v -0.26816994 0.29185540 -0.17691887
v -0.25817569 0.28154467 -0.15868909
v -0.25817569 0.28120939 -0.15832012
v -0.25817569 0.29327243 -0.17492157
v -0.25817569 0.29223352 -0.17345232
v -0.25817569 0.29247459 -0.17378815
v -0.25817569 0.28084473 -0.15832012
v -0.26886623 0.29327120 -0.18089138
v -0.26886623 0.29285026 -0.18089138
v -0.26167774 0.29304115 -0.17524856
v -0.26272217 0.29180401 -0.17378373
v -0.26821847 0.28111883 -0.16040358
v -0.26821847 0.28093528 -0.16040358
v -0.26821847 0.28082025 -0.16081895
v -0.26594765 0.28373139 -0.16313220
v -0.26873037 0.29316597 -0.17974912
v -0.26863818 0.28775240 -0.17048509
v -0.26525379 0.28573333 -0.16581883
v -0.25683649 0.28086553 -0.15835547
v -0.25683649 0.28994157 -0.17024206
v -0.25683649 0.28151408 -0.15872444
v -0.25683649 0.28117879 -0.15835547
v -0.25683649 0.28176249 -0.15906027
v -0.25683649 0.28258725 -0.16018706
v -0.25683649 0.28080557 -0.15881060
v -0.26706365 0.28164502 -0.16054499
v -0.26655417 0.29241707 -0.17654548
v -0.26687927 0.28247222 -0.16166957
v -0.25730230 0.29309010 -0.17453272
v -0.26685622 0.28187629 -0.16078802
v -0.26152369 0.28083494 -0.15894538
v -0.26152369 0.29249172 -0.17443329
v -0.26690474 0.28137336 -0.16014287
v -0.26887593 0.29284414 -0.18089138
v -0.25681830 0.29324428 -0.17481552
v -0.25649563 0.29249539 -0.17376164
v -0.25649563 0.29240361 -0.17488622
v -0.25649563 0.28831530 -0.16929864
v -0.25649563 0.28150062 -0.15873769
v -0.25649563 0.28116533 -0.15836651
v -0.25649563 0.28108090 -0.15940493
v -0.25649563 0.28096098 -0.15923923
v -0.25649563 0.29252965 -0.17505635
v -0.25649563 0.28087654 -0.15836651
v -0.25649563 0.29211238 -0.17448853
v -0.25649563 0.29327977 -0.17541427
v -0.25649563 0.29225065 -0.17342581
v -0.25649563 0.29269363 -0.17523310
v -0.25649563 0.28993178 -0.17025531
v -0.25649563 0.28080802 -0.15881060
v -0.25649563 0.28175270 -0.15907352
v -0.25649563 0.29326264 -0.17485971
v -0.25649563 0.29306562 -0.17455481
v -0.25649563 0.28257746 -0.16020032
v -0.25649563 0.28163033 -0.15890782
v -0.25649563 0.29311457 -0.17462551
v -0.25649563 0.29286372 -0.17541427
v -0.26554007 0.28084228 -0.15964797
v -0.26554007 0.29329935 -0.17755739
v -0.26554007 0.28155446 -0.16001694
v -0.26554007 0.29313660 -0.17713981
v -0.26554007 0.28318930 -0.16228379
v -0.26554007 0.28376565 -0.16308359
v -0.26674583 0.28094507 -0.15976065
v -0.26674583 0.28110170 -0.15976065
v -0.26148244 0.29323694 -0.17550265
v -0.26660755 0.29311212 -0.17783798
v -0.25703058 0.29309010 -0.17453272
v -0.26018449 0.29291633 -0.17477354
v -0.26018449 0.29315740 -0.17510937
v -0.26018449 0.29330424 -0.17554904
v -0.26614416 0.29317698 -0.17759274
v -0.25786758 0.28237066 -0.15981367
v -0.26123134 0.29308765 -0.17520659
v -0.26872188 0.28981431 -0.17373954
v -0.26420087 0.29023647 -0.17211784
v -0.26856054 0.28103440 -0.16048091
v -0.26856054 0.28102461 -0.16048091
v -0.25937782 0.28172578 -0.15910887
v -0.26888564 0.28086798 -0.16152596
v -0.26888564 0.29327487 -0.18089138
v -0.25884529 0.28080679 -0.15881060
v -0.25884529 0.28488532 -0.16338849
v -0.25884529 0.28118124 -0.15835105
v -0.25884529 0.28176249 -0.15906027
v -0.25884529 0.28086675 -0.15835105
v -0.25884529 0.29324183 -0.17498343
v -0.25884529 0.28315626 -0.16099129
v -0.25884529 0.28151531 -0.15872444
v -0.26202225 0.29245011 -0.17449074
v -0.26341482 0.28108335 -0.15910666
v -0.26341482 0.28096465 -0.15910666
v -0.26888807 0.29327365 -0.18088917
v -0.26888807 0.29327365 -0.18086929
v -0.26888807 0.28120327 -0.16083884
v -0.26888807 0.28086798 -0.16152596
v -0.26888807 0.29171223 -0.17727680
v -0.26888807 0.28158505 -0.16130723
v -0.26888807 0.28088878 -0.16083884
v -0.26888807 0.29323572 -0.18010483
v -0.26888807 0.29072717 -0.17550927
v -0.26888807 0.28919390 -0.17283148
v -0.26888807 0.29325407 -0.18019542
v -0.26888807 0.29283680 -0.18089138
v -0.26888807 0.28849763 -0.17173120
v -0.26888807 0.28086920 -0.16152817
v -0.26888807 0.28976781 -0.17380582
v -0.26888807 0.29326998 -0.18089138
v -0.26888807 0.28903849 -0.17257519
v -0.26888807 0.29048243 -0.17507181
v -0.26888807 0.28881333 -0.17222168
v -0.26888807 0.29312191 -0.17981761
v -0.26888807 0.28088022 -0.16087419
v -0.26888807 0.29111018 -0.17619640
v -0.26888807 0.29149931 -0.17689457
v -0.26888807 0.28182000 -0.16164306
v -0.26888807 0.28123386 -0.16212250
v -0.26290534 0.29325652 -0.17616326
v -0.25998434 0.28106499 -0.15845047
v -0.25998434 0.28098668 -0.15845047
v -0.25799009 0.29109305 -0.17183725
v -0.25870943 0.29243910 -0.17383676
v -0.26661725 0.28171844 -0.16045882
v -0.26659420 0.28841074 -0.17050277
v -0.26685015 0.29321002 -0.17824231
v -0.26286167 0.28173434 -0.15976728
v -0.26286167 0.28089979 -0.15905585
v -0.26286167 0.28114331 -0.15905585
v -0.26877525 0.29050936 -0.17502321
v -0.25750609 0.28153611 -0.15870013
v -0.25750609 0.28120082 -0.15833116
v -0.25750609 0.28352092 -0.16141107
v -0.25750609 0.28178084 -0.15903375
v -0.25750609 0.28084962 -0.15833116
v -0.26587729 0.29308275 -0.17722156
v -0.26794311 0.28975312 -0.17317614
v -0.26754887 0.28181021 -0.16098907
v -0.26754887 0.28981553 -0.17308114
v -0.26754887 0.28085329 -0.16024672
v -0.26754887 0.28157649 -0.16065325
v -0.26754887 0.28124120 -0.16024672
v -0.26386243 0.28839361 -0.16919038
v -0.26219329 0.29321736 -0.17567719
v -0.26219329 0.28514352 -0.16436946
v -0.26219329 0.29186397 -0.17370198
v -0.26219329 0.28085207 -0.15899840
v -0.25658418 0.29307052 -0.17455039
v -0.26799405 0.28307427 -0.16311010
v -0.26620967 0.28080679 -0.16014950
v -0.26620967 0.28150184 -0.16007880
v -0.26620967 0.28116656 -0.15970320
v -0.26620967 0.28175025 -0.16041463
v -0.26620967 0.28446927 -0.16436504
v -0.26620967 0.28087777 -0.15970320
v -0.26620967 0.29330669 -0.17822684
v -0.26532900 0.28238657 -0.16113048
v -0.26085409 0.28244530 -0.16037928
v -0.26085409 0.29253699 -0.17437143
v -0.26085409 0.29329812 -0.17554904
v -0.26085409 0.29287106 -0.17483541
v -0.26521376 0.29107592 -0.17386990
v -0.25791003 0.28773405 -0.16716878
v -0.26862362 0.28908744 -0.17250007
v -0.26700057 0.29231061 -0.17673549
v -0.25774870 0.29306807 -0.17455260
v -0.25765651 0.28773405 -0.16716878
v -0.26271247 0.29314027 -0.17579429
v -0.25751822 0.29324550 -0.17481773
v -0.26487047 0.28184080 -0.16028870
v -0.26487047 0.29323327 -0.17698074
v -0.25951489 0.28092549 -0.15840849
v -0.25951489 0.28111761 -0.15840849
v -0.25951489 0.29320145 -0.17504751
f 32 57 14
f 32 14 89
f 32 89 156
f 32 156 21
f 32 21 57
f 57 49 48
f 57 48 45
f 57 45 52
f 57 52 44
f 57 44 50
f 57 50 55
f 57 55 64
f 57 64 53
f 57 53 59
f 57 59 63
f 57 63 60
f 57 60 43
f 57 43 54
f 57 54 56
f 57 56 61
f 57 61 58
f 57 58 62
f 57 62 46
f 57 46 47
f 57 47 51
f 57 51 26
f 57 26 141
f 57 141 14
f 57 21 87
f 57 87 49
f 14 141 138
f 14 138 10
f 14 10 91
f 14 91 93
f 14 93 38
f 14 38 89
f 89 38 156
f 156 38 65
f 156 65 146
f 156 146 21
f 21 146 120
f 21 120 103
f 21 103 87
f 49 87 124
f 49 124 111
f 49 111 48
f 51 47 138
f 51 138 141
f 51 141 26
f 87 103 113
f 87 113 124
f 10 138 137
f 10 137 9
f 10 9 91
f 93 91 179
f 93 179 178
f 93 178 134
f 93 134 161
f 93 161 153
f 93 153 38
f 38 153 65
f 65 161 146
f 65 153 161
f 146 20 106
f 146 106 120
f 146 161 71
f 146 71 20
f 120 106 102
f 120 102 105
f 120 105 123
f 120 123 112
f 120 112 118
f 120 118 116
f 120 116 109
f 120 109 114
f 120 114 117
f 120 117 108
f 120 108 121
f 120 121 122
f 120 122 104
f 120 104 119
f 120 119 107
f 120 107 110
f 120 110 101
f 120 101 100
f 120 100 115
f 120 115 111
f 120 111 124
f 120 124 113
f 120 113 103
f 48 111 45
f 111 115 88
f 111 88 15
f 111 15 16
f 111 16 41
f 111 41 64
f 111 64 55
f 111 55 50
f 111 50 44
f 111 44 52
f 111 52 45
f 47 29 138
f 47 46 28
f 47 28 29
f 138 29 28
f 138 28 137
f 9 92 96
f 9 96 91
f 9 137 7
f 9 7 80
f 9 80 169
f 9 169 92
f 91 96 158
f 91 158 135
f 91 135 179
f 178 179 126
f 178 126 127
f 178 127 99
f 178 99 134
f 134 99 161
f 161 99 71
f 20 71 85
f 20 85 106
f 106 85 84
f 106 84 102
f 71 99 98
f 71 98 72
f 71 72 84
f 71 84 85
f 115 100 88
f 41 16 64
f 64 16 15
f 64 15 53
f 46 62 28
f 28 62 137
f 137 62 58
f 137 58 30
f 137 30 140
f 137 140 7
f 92 95 164
f 92 164 133
f 92 133 67
f 92 67 86
f 92 86 96
f 92 169 95
f 96 86 67
f 96 67 157
f 96 157 158
f 7 173 169
f 7 169 80
f 7 140 30
f 7 30 58
f 7 58 61
f 7 61 31
f 7 31 139
f 7 139 75
f 7 75 173
f 169 36 128
f 169 128 95
f 169 173 75
f 169 75 36
f 179 135 98
f 179 98 126
f 158 157 72
f 158 72 98
f 158 98 135
f 127 126 98
f 127 98 99
f 102 84 19
f 102 19 105
f 72 157 130
f 72 130 40
f 72 40 148
f 72 148 19
f 72 19 84
f 100 101 88
f 88 101 110
f 88 110 162
f 88 162 53
f 88 53 15
f 53 162 78
f 53 78 59
f 95 90 164
f 95 128 12
f 95 12 90
f 164 90 163
f 164 163 133
f 133 163 176
f 133 176 67
f 67 176 163
f 67 163 159
f 67 159 157
f 157 159 130
f 61 139 31
f 61 56 139
f 139 56 27
f 139 27 75
f 75 27 54
f 75 54 43
f 75 43 154
f 75 154 63
f 75 63 59
f 75 59 42
f 75 42 175
f 75 175 36
f 36 175 11
f 36 11 172
f 36 172 128
f 128 172 12
f 19 148 147
f 19 147 105
f 105 147 2
f 105 2 123
f 130 37 144
f 130 144 147
f 130 147 33
f 130 33 40
f 130 159 70
f 130 70 149
f 130 149 22
f 130 22 35
f 130 35 37
f 40 33 147
f 40 147 148
f 110 107 1
f 110 1 66
f 110 66 162
f 162 66 78
f 78 66 166
f 78 166 11
f 78 11 59
f 59 11 175
f 59 175 42
f 90 151 163
f 90 12 165
f 90 165 151
f 12 172 13
f 12 13 129
f 12 129 165
f 163 69 159
f 163 151 165
f 163 165 39
f 163 39 69
f 159 69 70
f 56 54 27
f 43 60 154
f 154 60 63
f 11 166 73
f 11 73 94
f 11 94 172
f 172 94 13
f 147 144 2
f 2 144 123
f 123 144 155
f 123 155 24
f 123 24 112
f 37 35 144
f 144 35 160
f 144 160 155
f 70 69 39
f 70 39 149
f 149 39 81
f 149 81 152
f 149 152 97
f 149 97 18
f 149 18 22
f 22 25 35
f 22 18 25
f 35 25 160
f 107 119 23
f 107 23 1
f 1 23 4
f 1 4 66
f 66 4 132
f 66 132 79
f 66 79 177
f 66 177 6
f 66 6 125
f 66 125 166
f 166 125 150
f 166 150 73
f 165 129 76
f 165 76 167
f 165 167 39
f 13 94 180
f 13 180 129
f 129 180 77
f 129 77 76
f 39 167 81
f 73 150 17
f 73 17 81
f 73 81 77
f 73 77 180
f 73 180 94
f 155 160 131
f 155 131 145
f 155 145 24
f 24 145 112
f 112 145 143
f 112 143 142
f 112 142 34
f 112 34 170
f 112 170 118
f 160 25 5
f 160 5 83
f 160 83 131
f 81 17 97
f 81 97 152
f 81 167 76
f 81 76 77
f 97 17 150
f 97 150 18
f 18 150 174
f 18 174 5
f 18 5 25
f 119 104 23
f 23 104 122
f 23 122 121
f 23 121 108
f 23 108 8
f 23 8 171
f 23 171 3
f 23 3 74
f 23 74 132
f 23 132 4
f 132 74 79
f 79 142 68
f 79 68 177
f 79 74 34
f 79 34 142
f 177 68 6
f 6 174 150
f 6 150 125
f 6 68 174
f 131 83 168
f 131 168 145
f 145 168 68
f 145 68 143
f 143 68 142
f 34 74 3
f 34 3 171
f 34 171 108
f 34 108 136
f 34 136 82
f 34 82 116
f 34 116 170
f 170 116 118
f 5 174 83
f 83 174 168
f 174 68 168
f 108 171 8
f 108 117 136
f 136 117 82
f 82 117 114
f 82 114 109
f 82 109 116
@@ -0,0 +1,705 @@
# https://github.com/mikedh/trimesh
v -0.27771899 0.28160046 -0.16669105
v -0.27781111 0.28631534 -0.17605652
v -0.27491573 0.28090929 -0.16370533
v -0.27491573 0.28115596 -0.16370533
v -0.27491573 0.28080060 -0.16416663
v -0.27732980 0.28843649 -0.18046934
v -0.28203762 0.28511128 -0.17956636
v -0.26936562 0.28174456 -0.16175607
v -0.27476720 0.28580612 -0.17170651
v -0.28671724 0.28112787 -0.17688883
v -0.28671724 0.28092150 -0.17688883
v -0.27727340 0.28170670 -0.16649867
v -0.27576554 0.28698087 -0.17472560
v -0.28762345 0.28080793 -0.18088942
v -0.28542183 0.28177753 -0.17621748
v -0.28448742 0.28228675 -0.17608203
v -0.27492325 0.28149544 -0.16417645
v -0.27085279 0.29252858 -0.18088942
v -0.28397790 0.28305363 -0.17718720
v -0.27003870 0.29181176 -0.17843763
v -0.27842779 0.28161756 -0.16732706
v -0.28476379 0.28245405 -0.17688883
v -0.27553241 0.28090196 -0.16420393
v -0.27553241 0.28117184 -0.16420393
v -0.27541208 0.28177631 -0.16503428
v -0.27345111 0.28380831 -0.16700120
v -0.28159955 0.28087387 -0.16954917
v -0.28159955 0.28122557 -0.16954917
v -0.28123857 0.28166640 -0.16990448
v -0.26959311 0.29324662 -0.18088942
v -0.27071178 0.29183008 -0.17907561
v -0.27219144 0.28547030 -0.16890335
v -0.27668680 0.28093737 -0.16508924
v -0.27668680 0.28110956 -0.16508924
v -0.27828678 0.28799687 -0.18088942
v -0.26929605 0.28842305 -0.17182233
v -0.27620549 0.28681479 -0.17492190
v -0.28736964 0.28174700 -0.18088942
v -0.27515074 0.28163954 -0.16458868
v -0.28079298 0.28179585 -0.16968658
v -0.26938818 0.29317945 -0.18038885
v -0.28664767 0.28105094 -0.17652764
v -0.28664767 0.28100332 -0.17652764
v -0.27095996 0.29246386 -0.18088942
v -0.28719291 0.28095569 -0.18088942
v -0.28073658 0.28244794 -0.17100768
v -0.27805365 0.28512349 -0.17353995
v -0.28623028 0.28188499 -0.17822759
v -0.27470515 0.28175921 -0.16440612
v -0.26996913 0.28775875 -0.17114509
v -0.28572077 0.28288756 -0.18088942
v -0.28237228 0.28488048 -0.17956636
v -0.28626601 0.28147835 -0.17688490
v -0.28430504 0.28084823 -0.17354191
v -0.28430504 0.28128418 -0.17354191
v -0.28533159 0.28239665 -0.17778984
v -0.27208615 0.28175799 -0.16307520
v -0.27760806 0.28084212 -0.16615711
v -0.26907044 0.29166888 -0.17735406
v -0.27344548 0.28176410 -0.16373477
v -0.27597987 0.28096546 -0.16445127
v -0.27597987 0.28108269 -0.16445127
v -0.27193762 0.28573407 -0.16916050
v -0.28264866 0.28440179 -0.17850634
v -0.27136418 0.29221962 -0.18088942
v -0.28575650 0.28155894 -0.17621748
v -0.28771746 0.28149300 -0.18088942
v -0.27399071 0.29045139 -0.18045560
v -0.28768926 0.28151498 -0.18088942
v -0.28274078 0.28090684 -0.17100768
v -0.27004058 0.28241619 -0.16309287
v -0.27290776 0.28161756 -0.16327150
v -0.26955927 0.28092028 -0.16105921
v -0.26955927 0.28113276 -0.16105921
v -0.26955927 0.28782835 -0.17104105
v -0.26955927 0.28081404 -0.16148910
v -0.28337814 0.28309638 -0.17641574
v -0.27206547 0.28442988 -0.16710328
v -0.26892943 0.29325394 -0.18019255
v -0.26983565 0.29303047 -0.18065582
v -0.28054668 0.28165419 -0.16923902
v -0.28733579 0.28107536 -0.17846315
v -0.28733579 0.28097401 -0.17846315
v -0.27466379 0.28776607 -0.17513980
v -0.28145290 0.28583909 -0.18088942
v -0.28628105 0.28119870 -0.17627048
v -0.28628105 0.28088486 -0.17627048
v -0.28199814 0.28173112 -0.17111957
v -0.28809348 0.28088120 -0.18088942
v -0.28809348 0.28116939 -0.18088942
v -0.28670596 0.28175066 -0.17902457
v -0.27886210 0.28761709 -0.18088942
v -0.28565121 0.28084579 -0.17554025
v -0.28127617 0.28571820 -0.17989810
v -0.28495744 0.28081159 -0.17487872
v -0.27424640 0.28163099 -0.16393500
v -0.27424640 0.28184958 -0.16426871
v -0.27089791 0.28080915 -0.16215848
v -0.27089791 0.28114741 -0.16171485
v -0.27089791 0.28090684 -0.16171485
v -0.27400575 0.28844381 -0.17579544
v -0.27527295 0.28105094 -0.16381329
v -0.27527295 0.28100332 -0.16381329
v -0.27641982 0.28630557 -0.17406800
v -0.28010110 0.28177875 -0.16904861
v -0.27062906 0.28708711 -0.17047767
v -0.28212599 0.28088364 -0.17019304
v -0.28604791 0.28111933 -0.17575814
v -0.28604791 0.28092883 -0.17575814
v -0.28565873 0.28188865 -0.17688490
v -0.28611184 0.28180317 -0.17755821
v -0.27597424 0.28641303 -0.17382851
v -0.27793520 0.28505144 -0.17319643
v -0.28161647 0.28153696 -0.17015378
v -0.28529775 0.28102285 -0.17453715
v -0.28529775 0.28103629 -0.17453715
v -0.28469611 0.28093859 -0.17376766
v -0.28469611 0.28110834 -0.17376766
v -0.28514922 0.28161267 -0.17542443
v -0.26936938 0.29251881 -0.18088942
v -0.28098663 0.28156749 -0.16948832
v -0.26888807 0.29074691 -0.17554417
v -0.26888807 0.28182027 -0.16164418
v -0.26888807 0.28123411 -0.16212315
v -0.26888807 0.28088853 -0.16083739
v -0.26888807 0.29323563 -0.18010422
v -0.26888807 0.28919360 -0.17283131
v -0.26888807 0.29325394 -0.18019648
v -0.26888807 0.29171285 -0.17727750
v -0.26888807 0.28315499 -0.16366018
v -0.26888807 0.28976755 -0.17380692
v -0.26888807 0.28086899 -0.16152836
v -0.26888807 0.28158581 -0.16130851
v -0.26888807 0.29048192 -0.17507109
v -0.26888807 0.29283753 -0.18088942
v -0.26888807 0.28903852 -0.17257612
v -0.26888807 0.28120236 -0.16083739
v -0.26888807 0.28087998 -0.16087469
v -0.26888807 0.29312206 -0.17981762
v -0.26888807 0.28921558 -0.17286861
v -0.26888807 0.28881382 -0.17222278
v -0.26888807 0.29327348 -0.18088942
v -0.26888807 0.29327348 -0.18086979
v -0.26888807 0.28849144 -0.17172222
v -0.26888807 0.28086777 -0.16152444
v -0.27661159 0.28639960 -0.17451360
v -0.27947878 0.28720190 -0.18088942
v -0.27691618 0.28125976 -0.16550540
v -0.27691618 0.28085067 -0.16550540
v -0.27933025 0.28730203 -0.18088942
v -0.26907232 0.28900432 -0.17262912
v -0.27021919 0.29290225 -0.18088942
v -0.28334430 0.28109612 -0.17177718
v -0.28334430 0.28095081 -0.17177718
v -0.27423325 0.28085922 -0.16347370
v -0.27423325 0.28127441 -0.16347370
v -0.27746141 0.28852441 -0.18088942
v -0.28331610 0.28372771 -0.17784677
v -0.26937690 0.28913743 -0.17307472
v -0.27363161 0.28153818 -0.16350706
v -0.26958935 0.29262505 -0.17953102
v -0.26992213 0.28104728 -0.16114165
v -0.26992213 0.28100698 -0.16114165
v -0.28247381 0.28160535 -0.17153180
v -0.27128146 0.28099233 -0.16180122
v -0.28199250 0.28108391 -0.16979062
v -0.28199250 0.28096424 -0.16979062
v -0.28751441 0.28084579 -0.17956636
v -0.28808784 0.28087876 -0.18088942
v -0.27264078 0.28107170 -0.16246079
v -0.28184397 0.28163343 -0.17067594
v -0.27400011 0.28096546 -0.16312035
v -0.27400011 0.28108269 -0.16312035
v -0.27526731 0.28639472 -0.17319054
v -0.27065162 0.29246508 -0.18044382
v -0.27825482 0.28585374 -0.17559129
v -0.28275018 0.28178241 -0.17233663
v -0.26938442 0.29248828 -0.17909327
v -0.28066889 0.28096302 -0.16846560
v -0.28066889 0.28108513 -0.16846560
v -0.27913284 0.28163099 -0.16796504
v -0.27475780 0.28245405 -0.16568992
v -0.28730947 0.28170548 -0.18054982
v -0.28682816 0.28084579 -0.17755821
v -0.28139838 0.28177386 -0.17035008
v -0.28161083 0.28080305 -0.17019304
v -0.27826234 0.28404277 -0.17153377
v -0.28137018 0.28093493 -0.16910357
v -0.28137018 0.28111200 -0.16910357
v -0.27859512 0.28437615 -0.17253686
v -0.27739185 0.28091661 -0.16572918
v -0.28740912 0.28115352 -0.17889697
v -0.28740912 0.28089585 -0.17889697
v -0.28348719 0.28087754 -0.17220119
v -0.28602159 0.28174089 -0.17710476
v -0.28590126 0.28164686 -0.17665916
v -0.28644650 0.28156505 -0.17755821
v -0.28493864 0.28181661 -0.17560699
v -0.28629797 0.28080549 -0.17688883
v -0.27996197 0.28105338 -0.16782959
v -0.27996197 0.28099965 -0.16782959
v -0.28801828 0.28109002 -0.18043400
v -0.28801828 0.28095691 -0.18043400
v -0.27223844 0.28116084 -0.16237049
v -0.27223844 0.28089463 -0.16237049
v -0.27546660 0.28247237 -0.16632789
v -0.26888995 0.28158581 -0.16130851
v -0.26888995 0.28849022 -0.17172025
v -0.26888995 0.28181905 -0.16164222
v -0.26888995 0.28582321 -0.16769021
v -0.27960098 0.28080305 -0.16818489
v -0.27405087 0.28243573 -0.16507157
v -0.27622429 0.28087143 -0.16485564
v -0.27492889 0.29006306 -0.18088942
v -0.28295700 0.28085311 -0.17154554
v -0.28030227 0.28153574 -0.16883661
v -0.26889747 0.29074203 -0.17554221
v -0.27269907 0.28644722 -0.17108817
v -0.27707410 0.28562905 -0.17340843
v -0.28271634 0.28377045 -0.17707531
v -0.27025679 0.29260307 -0.18022592
v -0.27128334 0.28641059 -0.16981811
v -0.28763661 0.28080793 -0.18088942
v -0.27357708 0.28088242 -0.16302613
v -0.27357708 0.28117428 -0.16302613
v -0.27357708 0.28252121 -0.16494202
v -0.27840523 0.28791872 -0.18088942
v -0.28196617 0.28506243 -0.17918946
v -0.28091143 0.28121946 -0.16886998
v -0.28091143 0.28086899 -0.16886998
v -0.28504581 0.28286802 -0.17889697
v -0.27813637 0.28785033 -0.18023574
v -0.27536132 0.28980052 -0.18088942
v -0.27858948 0.28771356 -0.18058712
v -0.27005186 0.29250660 -0.17973125
v -0.28133633 0.28575971 -0.18023574
f 137 74 162
f 137 162 163
f 137 163 125
f 137 125 138
f 137 138 145
f 137 145 132
f 137 132 124
f 137 124 135
f 137 135 142
f 137 142 143
f 137 143 128
f 137 128 126
f 137 126 139
f 137 139 129
f 137 129 122
f 137 122 134
f 137 134 131
f 137 131 140
f 137 140 127
f 137 127 136
f 137 136 141
f 137 141 144
f 137 144 130
f 137 130 123
f 137 123 133
f 137 133 207
f 137 207 74
f 74 207 99
f 74 99 173
f 74 173 170
f 74 170 162
f 162 170 173
f 162 173 172
f 162 172 165
f 162 165 163
f 125 163 73
f 125 73 100
f 125 100 205
f 125 205 224
f 125 224 138
f 133 123 209
f 133 209 207
f 207 209 8
f 207 8 72
f 207 72 160
f 207 160 99
f 99 160 204
f 99 204 173
f 173 204 225
f 173 225 156
f 173 156 4
f 173 4 102
f 173 102 103
f 173 103 172
f 163 165 73
f 138 76 145
f 138 224 76
f 73 165 172
f 73 172 100
f 100 172 205
f 205 172 224
f 224 98 76
f 224 172 3
f 224 3 155
f 224 155 98
f 123 130 210
f 123 210 209
f 209 210 8
f 8 71 57
f 8 57 72
f 8 210 71
f 72 60 160
f 72 57 60
f 160 60 96
f 160 96 156
f 160 156 225
f 160 225 204
f 156 96 4
f 4 96 17
f 4 17 102
f 102 17 24
f 102 24 62
f 102 62 180
f 102 180 200
f 102 200 201
f 102 201 103
f 172 103 3
f 76 98 14
f 76 14 145
f 145 14 132
f 98 155 5
f 98 5 14
f 3 103 23
f 3 23 213
f 3 213 5
f 3 5 155
f 130 144 210
f 210 57 71
f 210 144 208
f 210 208 57
f 57 208 60
f 60 208 78
f 60 78 226
f 60 226 96
f 96 97 49
f 96 49 17
f 96 226 97
f 17 49 39
f 17 39 1
f 17 1 24
f 103 201 179
f 103 179 61
f 103 61 23
f 24 1 148
f 24 148 34
f 24 34 62
f 62 34 180
f 180 189 188
f 180 188 179
f 180 179 201
f 180 201 200
f 180 34 189
f 14 199 223
f 14 223 169
f 14 169 89
f 14 89 90
f 14 90 67
f 14 67 69
f 14 69 38
f 14 38 51
f 14 51 85
f 14 85 147
f 14 147 150
f 14 150 92
f 14 92 227
f 14 227 35
f 14 35 157
f 14 157 233
f 14 233 214
f 14 214 65
f 14 65 44
f 14 44 18
f 14 18 152
f 14 152 30
f 14 30 142
f 14 142 135
f 14 135 120
f 14 120 45
f 14 45 132
f 14 5 199
f 132 45 124
f 5 213 149
f 5 149 58
f 5 58 211
f 5 211 186
f 5 186 199
f 23 61 33
f 23 33 213
f 213 33 191
f 213 191 230
f 213 230 149
f 144 141 208
f 208 141 36
f 208 36 75
f 208 75 226
f 208 226 78
f 226 212 97
f 226 75 50
f 226 50 212
f 97 212 49
f 49 182 25
f 49 25 1
f 49 1 39
f 49 212 106
f 49 106 222
f 49 222 63
f 49 63 32
f 49 32 26
f 49 26 182
f 1 12 21
f 1 21 189
f 1 189 34
f 1 34 148
f 1 25 12
f 179 188 33
f 179 33 61
f 189 229 121
f 189 121 29
f 189 29 28
f 189 28 166
f 189 166 167
f 189 167 188
f 189 21 229
f 199 95 54
f 199 54 93
f 199 93 87
f 199 87 184
f 199 184 168
f 199 168 223
f 199 186 95
f 223 168 169
f 45 120 124
f 124 120 135
f 149 230 58
f 58 230 211
f 211 230 186
f 186 230 27
f 186 27 215
f 186 215 95
f 33 188 191
f 191 188 230
f 230 188 27
f 141 136 36
f 36 50 75
f 36 136 50
f 212 50 106
f 50 136 151
f 50 151 159
f 50 159 106
f 182 206 12
f 182 12 25
f 182 26 32
f 182 32 206
f 106 159 222
f 222 159 63
f 63 159 32
f 32 12 206
f 32 159 218
f 32 218 12
f 12 218 9
f 12 9 187
f 12 187 21
f 21 181 216
f 21 216 229
f 21 187 105
f 21 105 181
f 188 167 27
f 229 216 81
f 229 81 121
f 121 81 40
f 121 40 29
f 29 185 114
f 29 114 166
f 29 166 28
f 29 40 219
f 29 219 104
f 29 104 13
f 29 13 190
f 29 190 185
f 166 153 116
f 166 116 115
f 166 115 167
f 166 114 171
f 166 171 164
f 166 164 55
f 166 55 153
f 95 215 54
f 54 215 194
f 54 194 87
f 54 87 93
f 87 109 43
f 87 43 11
f 87 11 184
f 87 194 109
f 184 11 193
f 184 193 89
f 184 89 169
f 184 169 168
f 27 167 107
f 27 107 215
f 215 107 194
f 136 127 151
f 151 127 140
f 151 140 131
f 151 131 159
f 159 131 134
f 159 134 217
f 159 217 218
f 218 217 9
f 9 217 20
f 9 20 174
f 9 174 187
f 187 174 112
f 187 112 40
f 187 40 105
f 181 105 81
f 181 81 216
f 105 40 81
f 167 115 43
f 167 43 154
f 167 154 70
f 167 70 107
f 40 112 84
f 40 84 101
f 40 101 219
f 185 46 88
f 185 88 171
f 185 171 114
f 185 190 113
f 185 113 46
f 219 101 31
f 219 31 104
f 104 31 13
f 13 31 235
f 13 235 113
f 13 113 190
f 153 55 118
f 153 118 42
f 153 42 116
f 116 42 43
f 116 43 115
f 171 88 119
f 171 119 164
f 164 119 55
f 55 119 108
f 55 108 118
f 194 107 70
f 194 70 109
f 109 70 117
f 109 117 43
f 43 117 154
f 43 42 82
f 43 82 83
f 43 83 11
f 11 83 193
f 193 83 203
f 193 203 89
f 89 203 202
f 89 202 90
f 142 30 143
f 134 122 217
f 217 122 129
f 217 129 59
f 217 59 178
f 217 178 20
f 20 178 112
f 20 112 174
f 112 178 84
f 154 117 70
f 84 178 101
f 101 178 31
f 46 113 47
f 46 47 177
f 46 177 88
f 88 177 119
f 113 235 146
f 113 146 47
f 31 178 161
f 31 161 235
f 235 161 139
f 235 139 41
f 235 41 221
f 235 221 146
f 118 108 42
f 42 86 66
f 42 66 196
f 42 196 53
f 42 53 10
f 42 10 82
f 42 108 86
f 119 198 15
f 119 15 66
f 119 66 108
f 119 177 198
f 108 66 86
f 83 82 202
f 83 202 203
f 90 202 192
f 90 192 67
f 30 152 80
f 30 80 41
f 30 41 79
f 30 79 143
f 143 79 128
f 129 139 178
f 129 178 59
f 178 139 161
f 47 146 37
f 47 37 2
f 47 2 176
f 47 176 177
f 177 176 198
f 146 221 37
f 139 126 41
f 41 80 175
f 41 175 221
f 41 126 79
f 221 175 37
f 66 15 196
f 196 15 110
f 196 110 195
f 196 195 53
f 53 195 197
f 53 197 10
f 10 197 192
f 10 192 82
f 82 192 202
f 198 176 2
f 198 2 77
f 198 77 16
f 198 16 19
f 198 19 15
f 15 19 158
f 15 158 22
f 15 22 110
f 192 197 67
f 67 197 69
f 152 18 175
f 152 175 80
f 79 126 128
f 37 175 65
f 37 65 2
f 2 65 68
f 2 68 158
f 2 158 220
f 2 220 77
f 175 18 44
f 175 44 65
f 110 22 64
f 110 64 195
f 195 56 111
f 195 111 197
f 195 64 228
f 195 228 56
f 197 111 91
f 197 91 183
f 197 183 69
f 77 220 158
f 77 158 19
f 77 19 16
f 158 68 6
f 158 6 64
f 158 64 22
f 69 183 38
f 65 214 68
f 68 214 6
f 64 6 232
f 64 232 157
f 64 157 234
f 64 234 228
f 56 228 111
f 111 228 7
f 111 7 52
f 111 52 231
f 111 231 48
f 111 48 91
f 228 234 92
f 228 92 150
f 228 150 147
f 228 147 94
f 228 94 7
f 91 48 231
f 91 231 38
f 91 38 183
f 6 214 233
f 6 233 157
f 6 157 232
f 38 231 51
f 157 35 234
f 234 35 227
f 234 227 92
f 7 94 52
f 52 94 147
f 52 147 236
f 52 236 85
f 52 85 51
f 52 51 231
f 147 85 236
@@ -0,0 +1,141 @@
# https://github.com/mikedh/trimesh
v 0.12070400 -0.29205300 0.60488600
v -0.50677500 -0.32619000 0.28364200
v -0.54155000 -0.32619000 -0.14769100
v 0.39350800 -0.29205300 0.46522900
v -0.03201000 -0.32619000 0.59067100
v -0.40050400 -0.29205300 -0.41323300
v -0.27329500 -0.29205300 -0.50101900
v 0.25414700 -0.32619000 0.52927600
v -0.12770000 -0.29205300 -0.55289000
v -0.56817100 -0.32619000 -0.00251400
v 0.43573300 -0.29205300 -0.37100800
v 0.31801400 -0.29205300 -0.47116200
v 0.17838400 -0.29205300 -0.53743500
v -0.17718700 -0.32619000 0.56405100
v -0.32500900 -0.29205300 0.52315800
v 0.56117600 -0.32619000 0.05451000
v -0.44272800 -0.29205300 0.42300400
v -0.31052700 -0.32619000 0.50076300
v -0.55631000 -0.32619000 0.14460600
v -0.26114200 -0.32619000 -0.47728000
v 0.26630000 -0.29205300 0.55301500
v -0.58238600 -0.29205300 0.15020000
v 0.02501500 -0.32619000 -0.53867500
v 0.37562500 -0.32619000 0.44544400
v -0.47826300 -0.32619000 -0.28103100
v 0.53455500 -0.32619000 0.19968700
v 0.49978000 -0.32619000 -0.23164600
v -0.53051500 -0.29205300 0.29579500
v 0.55993500 -0.29205300 0.20788000
v 0.52351900 -0.29205300 -0.24379900
v 0.47126700 -0.32619000 0.33302700
v -0.38262100 -0.32619000 -0.39344700
v 0.58781100 -0.29205300 0.05585500
v 0.41594800 -0.32619000 -0.35312500
v -0.03335500 -0.29205300 0.61730700
v 0.49366200 -0.29205300 0.34751000
v 0.57539000 -0.29205300 -0.09820400
v -0.12210500 -0.32619000 -0.52681400
v 0.54931400 -0.32619000 -0.09260900
v 0.30353100 -0.32619000 -0.44876700
v 0.11511000 -0.32619000 0.57881000
v -0.50065700 -0.29205300 -0.29551300
v 0.17019100 -0.32619000 -0.51205500
v 0.02636000 -0.29205300 -0.56531100
v -0.42294300 -0.32619000 0.40512100
v -0.59480600 -0.29205300 -0.00385900
v -0.18538000 -0.29205300 0.58943100
v -0.56693000 -0.29205300 -0.15588400
f 14 41 5
f 41 14 8
f 8 14 18
f 8 18 24
f 24 18 45
f 24 45 31
f 31 45 2
f 31 2 26
f 26 2 19
f 26 19 16
f 16 19 10
f 16 10 39
f 39 10 3
f 39 3 27
f 27 3 25
f 27 25 34
f 34 25 32
f 34 32 40
f 40 32 20
f 40 20 43
f 43 20 38
f 43 38 23
f 46 3 10
f 3 46 48
f 48 25 3
f 25 48 42
f 42 32 25
f 32 42 6
f 32 7 20
f 7 32 6
f 20 9 38
f 9 20 7
f 23 9 44
f 9 23 38
f 43 44 13
f 44 43 23
f 40 13 12
f 13 40 43
f 40 11 34
f 11 40 12
f 11 27 34
f 27 11 30
f 30 39 27
f 39 30 37
f 37 16 39
f 16 37 33
f 33 26 16
f 26 33 29
f 29 31 26
f 31 29 36
f 24 36 4
f 36 24 31
f 21 24 4
f 24 21 8
f 1 8 21
f 8 1 41
f 35 41 1
f 41 35 5
f 35 14 5
f 14 35 47
f 47 18 14
f 18 47 15
f 17 18 15
f 18 17 45
f 17 2 45
f 2 17 28
f 28 19 2
f 19 28 22
f 22 10 19
f 10 22 46
f 1 47 35
f 47 1 21
f 47 21 15
f 15 21 4
f 15 4 17
f 17 4 36
f 17 36 28
f 28 36 29
f 28 29 22
f 22 29 33
f 22 33 46
f 46 33 37
f 46 37 48
f 48 37 30
f 48 30 42
f 42 30 11
f 42 11 6
f 6 11 12
f 6 12 7
f 7 12 13
f 7 13 9
f 9 13 44
@@ -0,0 +1,585 @@
# https://github.com/mikedh/trimesh
v 0.39211777 -0.29574581 0.46921802
v 0.13830914 -0.28763768 0.60536706
v 0.57629699 -0.29838020 0.02635503
v 0.55223043 -0.29154931 0.23884771
v 0.50731013 -0.29542505 0.32753679
v 0.48260101 -0.28672867 0.37039636
v 0.59329544 -0.28763768 0.05558806
v 0.58815499 -0.29400306 0.08709217
v 0.21529874 -0.29851915 0.56407980
v 0.54066450 -0.29375410 0.26289800
v 0.14438420 -0.29855736 0.58772241
v 0.57594648 -0.28672867 0.15609844
v 0.36898585 -0.29855736 0.46945092
v 0.41133596 -0.29441761 0.45279625
v 0.22715677 -0.29523282 0.57170831
v 0.22715677 -0.29773637 0.56407980
v 0.56823585 -0.28763768 0.19750219
v 0.56823585 -0.28672867 0.19750219
v 0.40683809 -0.28763768 0.45937659
v 0.40683809 -0.28672867 0.45937659
v 0.38084388 -0.29855736 0.45762961
v 0.38084388 -0.29785447 0.46945092
v 0.59037477 -0.29599015 0.05558806
v 0.56566566 -0.28763768 0.20845002
v 0.56566566 -0.28672867 0.20845002
v 0.56373798 -0.28672867 0.21392396
v 0.45175846 -0.29840566 0.38664342
v 0.42255148 -0.29392084 0.44033438
v 0.23451693 -0.29417444 0.57048543
v 0.46361649 -0.29816945 0.37482208
v 0.04519729 -0.28763768 0.61736311
v 0.38884659 -0.28672867 0.47614774
v 0.59002423 -0.28672867 0.07923070
v 0.54638903 -0.29855736 0.20932353
v 0.54638903 -0.29847168 0.22114485
v 0.45205050 -0.29642322 0.39863943
v 0.42284352 -0.28763768 0.44062553
v 0.42284352 -0.28672867 0.44062553
v 0.40006208 -0.29480784 0.46514168
v 0.39427912 -0.28763768 0.47195495
v 0.39427912 -0.28672867 0.47195495
v 0.29801291 -0.29735539 0.52855759
v 0.57588812 -0.29096918 0.15592375
v 0.15618383 -0.29564390 0.59604976
v 0.15618383 -0.29814744 0.58772241
v 0.19981903 -0.29444077 0.58259789
v 0.58967376 -0.29556864 0.02635503
v 0.59031634 -0.29594382 0.04376674
v 0.40420947 -0.29582686 0.45710553
v 0.30987094 -0.29817523 0.51673625
v 0.23895640 -0.29855736 0.55225845
v 0.28259162 -0.29488313 0.54783273
v 0.57746525 -0.29520851 0.13839558
v 0.46355806 -0.29612446 0.38641049
v 0.39264351 -0.29824935 0.45762961
v 0.55404127 -0.29510545 0.23092802
v 0.55404127 -0.28672867 0.23523728
v 0.57682274 -0.28727176 0.15126509
v 0.25081443 -0.29593340 0.56134283
v 0.25081443 -0.29843694 0.55225845
v 0.13240933 -0.28763768 0.60746345
v 0.47541609 -0.29785333 0.36300077
v 0.58996586 -0.28763768 0.07923070
v 0.40450154 -0.29855736 0.43398693
v 0.40450154 -0.29795638 0.44580827
v 0.58611051 -0.29674398 0.02635503
v 0.56589933 -0.28672867 0.20757653
v 0.55883121 -0.28672867 0.02635503
v 0.23539314 -0.28763768 0.57077658
v 0.23539314 -0.28672867 0.57083481
v 0.55818866 -0.29855736 0.17385954
v 0.55818866 -0.29848673 0.18568088
v 0.55818866 -0.29806871 0.19750219
v 0.57839987 -0.29585234 0.12657424
v 0.48727412 -0.29855736 0.33935813
v 0.48727412 -0.29745613 0.35117943
v 0.00243828 -0.29539726 0.61893538
v 0.00243828 -0.28763768 0.62079884
v 0.55626102 -0.29596814 0.22114485
v 0.50620024 -0.28763768 0.33598059
v 0.50620024 -0.28672867 0.33598059
v 0.27517304 -0.28763768 0.55458778
v 0.27517304 -0.28672867 0.55458778
v 0.48213370 -0.29428097 0.36981405
v 0.38779514 -0.29428213 0.47608952
v 0.50298750 -0.28763768 0.34186213
v 0.50298750 -0.28672867 0.34186213
v 0.58833023 -0.28763768 0.08831508
v 0.01429631 -0.29499312 0.61852774
v 0.01429631 -0.28763768 0.61986711
v 0.57004672 -0.29855736 0.10287337
v 0.57004672 -0.29855736 0.02635503
v 0.57004672 -0.29855621 0.11469469
v 0.57004672 -0.29835588 0.12657424
v 0.47506561 -0.29568212 0.37418154
v 0.28638852 -0.29635259 0.54072831
v 0.40093830 -0.28763768 0.46601519
v 0.40093830 -0.28672867 0.46607341
v 0.49334918 -0.29375062 0.35735217
v 0.28381831 -0.28672867 0.54870624
v 0.09706890 -0.29855736 0.59954378
v 0.00337290 -0.28672867 0.62074062
v 0.30402954 -0.29361745 0.53455557
v 0.52927375 -0.28672867 0.28747239
v 0.27353745 -0.29554201 0.55196730
v 0.32167057 -0.29855621 0.50491491
v 0.17984147 -0.29855621 0.57590110
v 0.56841108 -0.28672867 0.19657046
v 0.58990743 -0.29571917 0.03194540
v 0.47085978 -0.29470248 0.38233418
v 0.26261404 -0.29491902 0.55953759
v 0.26261404 -0.29742255 0.55225845
v 0.26261404 -0.28763768 0.56105164
v 0.27447207 -0.29830493 0.54037889
v 0.36624039 -0.29517261 0.48930845
v 0.38837928 -0.28763768 0.47649712
v 0.38837928 -0.28672867 0.47649712
v -0.00340312 -0.29855736 0.59954378
v -0.00340312 -0.29855736 0.02635503
v -0.00340312 -0.28684679 0.02635503
v -0.00340312 -0.29555590 0.61916835
v -0.00340312 -0.28763768 0.62120648
v -0.00340312 -0.29805944 0.61136509
v -0.00340312 -0.28672867 0.59162407
v -0.00340312 -0.28672867 0.62126470
v 0.49907374 -0.29792859 0.32753679
v 0.51735728 -0.29418949 0.31105681
v 0.59212721 -0.28672867 0.03101366
v 0.59212721 -0.28672867 0.06740938
v 0.54078130 -0.28763768 0.26318917
v 0.56356274 -0.28763768 0.21433158
v 0.56356274 -0.28672867 0.21433158
v 0.58184632 -0.29844736 0.04376674
v 0.58184632 -0.29807101 0.02635503
v 0.58184632 -0.29822271 0.03194540
v 0.58184632 -0.29849367 0.05558806
v 0.58184632 -0.29813007 0.06740938
v 0.51093177 -0.29855736 0.29213105
v 0.51093177 -0.29778500 0.30395237
v 0.02609593 -0.29450909 0.61806187
v 0.02609593 -0.28763768 0.61893538
v 0.32161213 -0.29624837 0.51696918
v 0.45958590 -0.29501861 0.39479606
v 0.04437951 -0.29360935 0.61730489
v 0.59306176 -0.28763768 0.04376674
v 0.59306176 -0.28672867 0.04376674
v 0.50322114 -0.28672867 0.34145452
v 0.58984899 -0.29562654 0.06740938
v 0.10886851 -0.29605267 0.60839519
v 0.10886851 -0.29855621 0.59954378
v 0.10886851 -0.28763768 0.61177273
v 0.10886851 -0.28672867 0.61183095
v 0.01517253 -0.28672867 0.61980888
v 0.26898117 -0.29386758 0.55837293
v 0.13036485 -0.29487153 0.60676466
v 0.49743814 -0.28672867 0.35117943
v 0.49936582 -0.29605151 0.33912520
v 0.59177674 -0.28763768 0.02635503
v 0.59177674 -0.28672867 0.02635503
v 0.56513995 -0.29466195 0.20664480
v 0.19164108 -0.29546905 0.58387903
v 0.19164108 -0.29797259 0.57590110
v 0.12072654 -0.29579212 0.60781284
v 0.12072654 -0.29829566 0.59954378
v 0.12072654 -0.28763768 0.61049158
v 0.12072654 -0.28672867 0.61049158
v 0.48651473 -0.29511123 0.36195256
v 0.34532819 -0.29802470 0.49309360
v 0.59206871 -0.28763768 0.06740938
v 0.59335387 -0.28672867 0.05558806
v 0.26927324 -0.28763768 0.55854764
v 0.26927324 -0.28672867 0.55854764
v 0.42810077 -0.29855736 0.41034432
v 0.49515999 -0.29495259 0.35117943
v 0.58885601 -0.29476500 0.07923070
v 0.56607457 -0.29556517 0.19750219
v 0.35718626 -0.29852262 0.48127226
v 0.28627170 -0.29855736 0.52855759
v 0.35268836 -0.29451025 0.50002335
v 0.43995880 -0.29854347 0.39846472
v 0.57664747 -0.29435971 0.14800404
v 0.50573293 -0.29438055 0.33504886
v 0.13287664 -0.28672867 0.60734697
v 0.03853811 -0.28672867 0.61794542
v 0.03789555 -0.29394285 0.61759601
v 0.52273140 -0.29762404 0.28030972
v 0.52273140 -0.29855274 0.26848838
v 0.59300340 -0.28672867 0.04283500
v 0.51887605 -0.29528146 0.30395237
v 0.35683575 -0.29610131 0.49321005
v 0.26313977 -0.28672867 0.56087696
v 0.58850553 -0.28672867 0.08761628
v 0.49352442 -0.28763768 0.35752684
v 0.49352442 -0.28672867 0.35752684
v 0.53458943 -0.29852495 0.24478751
v 0.53458943 -0.29742604 0.25660884
f 119 118 123
f 119 123 121
f 119 121 122
f 119 122 125
f 119 125 124
f 119 124 120
f 119 120 68
f 119 68 159
f 119 159 158
f 119 158 47
f 119 47 66
f 119 66 134
f 119 134 3
f 119 3 92
f 119 92 91
f 119 91 71
f 119 71 34
f 119 34 138
f 119 138 75
f 119 75 173
f 119 173 64
f 119 64 21
f 119 21 13
f 119 13 178
f 119 178 51
f 119 51 11
f 119 11 101
f 119 101 118
f 118 101 123
f 120 124 68
f 92 3 133
f 92 133 136
f 92 136 91
f 123 101 150
f 123 150 164
f 123 164 149
f 123 149 121
f 101 11 150
f 124 125 102
f 124 102 153
f 124 153 184
f 124 184 152
f 124 152 166
f 124 166 183
f 124 183 70
f 124 70 191
f 124 191 172
f 124 172 83
f 124 83 100
f 124 100 117
f 124 117 32
f 124 32 41
f 124 41 98
f 124 98 20
f 124 20 38
f 124 38 6
f 124 6 194
f 124 194 156
f 124 156 87
f 124 87 147
f 124 147 81
f 124 81 104
f 124 104 57
f 124 57 132
f 124 132 26
f 124 26 25
f 124 25 67
f 124 67 18
f 124 18 108
f 124 108 12
f 124 12 192
f 124 192 33
f 124 33 129
f 124 129 170
f 124 170 146
f 124 146 188
f 124 188 128
f 124 128 159
f 124 159 68
f 3 134 135
f 3 135 133
f 133 135 48
f 133 48 23
f 133 23 136
f 136 23 137
f 136 137 94
f 136 94 72
f 136 72 93
f 136 93 91
f 91 93 71
f 121 77 89
f 121 89 122
f 121 149 77
f 150 11 164
f 164 163 149
f 164 11 107
f 164 107 9
f 164 9 60
f 164 60 45
f 164 45 44
f 164 44 163
f 149 163 77
f 11 51 107
f 125 122 78
f 125 78 102
f 159 128 158
f 134 66 48
f 134 48 135
f 48 145 7
f 48 7 23
f 48 66 109
f 48 109 145
f 23 7 148
f 23 148 137
f 137 74 73
f 137 73 94
f 137 148 74
f 94 73 72
f 72 73 35
f 72 35 34
f 72 34 71
f 72 71 93
f 77 163 89
f 89 140 122
f 89 163 140
f 122 140 185
f 122 185 144
f 122 144 78
f 163 44 155
f 163 155 165
f 163 165 144
f 163 144 185
f 163 185 140
f 107 51 9
f 9 51 60
f 60 51 178
f 60 178 114
f 60 114 112
f 60 112 16
f 60 16 162
f 60 162 45
f 45 162 44
f 44 162 16
f 44 16 59
f 44 59 161
f 44 161 155
f 78 90 102
f 78 144 90
f 102 90 141
f 102 141 153
f 128 188 158
f 158 188 145
f 158 145 47
f 66 47 109
f 145 188 146
f 145 146 170
f 145 170 7
f 145 109 47
f 7 170 129
f 7 129 169
f 7 169 148
f 148 169 175
f 148 175 53
f 148 53 176
f 148 176 74
f 74 176 73
f 73 176 79
f 73 79 35
f 35 79 196
f 35 196 186
f 35 186 139
f 35 139 126
f 35 126 195
f 35 195 34
f 34 195 187
f 34 187 138
f 144 31 184
f 144 184 141
f 144 141 90
f 144 165 151
f 144 151 152
f 144 152 31
f 155 61 165
f 155 161 15
f 155 15 111
f 155 111 46
f 155 46 61
f 165 166 152
f 165 152 151
f 165 61 183
f 165 183 166
f 178 13 106
f 178 106 114
f 114 106 177
f 114 177 50
f 114 50 42
f 114 42 112
f 112 105 111
f 112 111 59
f 112 59 16
f 112 42 96
f 112 96 105
f 59 111 15
f 59 15 161
f 153 141 184
f 169 129 33
f 169 33 63
f 169 63 8
f 169 8 175
f 175 8 181
f 175 181 53
f 53 181 176
f 176 181 160
f 176 160 79
f 79 160 56
f 79 56 5
f 79 5 186
f 79 186 196
f 186 5 139
f 139 5 126
f 126 138 187
f 126 187 195
f 126 5 157
f 126 157 76
f 126 76 75
f 126 75 138
f 31 152 184
f 61 2 183
f 61 46 29
f 61 29 154
f 61 154 2
f 111 105 154
f 111 154 29
f 111 29 46
f 183 2 70
f 13 177 106
f 13 21 55
f 13 55 177
f 177 55 22
f 177 22 168
f 177 168 50
f 50 168 42
f 42 168 22
f 42 22 142
f 42 142 96
f 105 96 52
f 105 52 154
f 96 142 52
f 63 33 8
f 8 33 88
f 8 88 43
f 8 43 181
f 181 43 160
f 160 43 17
f 160 17 24
f 160 24 131
f 160 131 4
f 160 4 10
f 160 10 56
f 56 10 127
f 56 127 182
f 56 182 189
f 56 189 5
f 5 182 157
f 5 189 182
f 157 182 174
f 157 174 76
f 76 174 167
f 76 167 95
f 76 95 54
f 76 54 36
f 76 36 62
f 76 62 75
f 75 62 30
f 75 30 27
f 75 27 180
f 75 180 173
f 2 69 70
f 2 154 69
f 154 52 103
f 154 103 82
f 154 82 171
f 154 171 113
f 154 113 69
f 70 69 113
f 70 113 191
f 21 64 55
f 55 64 173
f 55 173 180
f 55 180 27
f 55 27 30
f 55 30 65
f 55 65 49
f 55 49 1
f 55 1 22
f 22 190 142
f 22 1 190
f 142 190 52
f 52 190 115
f 52 115 179
f 52 179 103
f 33 192 88
f 88 192 43
f 43 192 58
f 43 58 12
f 43 12 17
f 17 108 18
f 17 18 67
f 17 67 24
f 17 12 108
f 24 26 131
f 24 67 25
f 24 25 26
f 131 57 4
f 131 26 132
f 131 132 57
f 4 57 130
f 4 130 104
f 4 104 80
f 4 80 10
f 10 80 127
f 127 80 182
f 182 80 86
f 182 86 99
f 182 99 174
f 174 99 167
f 167 99 84
f 167 84 110
f 167 110 95
f 95 110 143
f 95 143 54
f 54 143 49
f 54 49 36
f 36 49 65
f 36 65 62
f 62 65 30
f 103 100 82
f 103 179 85
f 103 85 116
f 103 116 100
f 82 100 83
f 82 83 172
f 82 172 171
f 171 172 191
f 171 191 113
f 49 39 1
f 49 143 39
f 1 85 115
f 1 115 190
f 1 39 85
f 115 85 179
f 192 12 58
f 57 104 130
f 104 81 80
f 80 81 147
f 80 147 86
f 86 156 99
f 86 147 87
f 86 87 156
f 99 156 193
f 99 193 37
f 99 37 28
f 99 28 84
f 84 28 14
f 84 14 110
f 110 14 39
f 110 39 143
f 100 116 117
f 85 39 40
f 85 40 116
f 116 40 32
f 116 32 117
f 39 14 97
f 39 97 40
f 156 194 193
f 193 6 37
f 193 194 6
f 37 38 20
f 37 20 19
f 37 19 28
f 37 6 38
f 28 19 97
f 28 97 14
f 40 97 98
f 40 98 41
f 40 41 32
f 97 19 98
f 19 20 98
@@ -0,0 +1,618 @@
# https://github.com/mikedh/trimesh
v 0.32799232 -0.28763768 -0.47100736
v 0.32799232 -0.28672867 -0.47100736
v 0.25749504 -0.29398105 -0.50649147
v 0.56651781 -0.29564390 -0.13370353
v 0.30963974 -0.29605151 -0.47691164
v 0.58848262 -0.28763768 -0.01544258
v 0.58848262 -0.28672867 -0.01544258
v 0.51122695 -0.29635259 -0.26388993
v 0.57834503 -0.29579212 -0.09821938
v 0.43566087 -0.29480784 -0.37759112
v 0.29804555 -0.29542505 -0.48480350
v 0.29804555 -0.29792859 -0.47656088
v 0.34681101 -0.28672867 -0.45504825
v 0.30987277 -0.29855736 -0.46475233
v 0.30649358 -0.28672867 -0.48369280
v 0.35694864 -0.29612446 -0.44107674
v 0.32170000 -0.29495259 -0.47270264
v 0.32170000 -0.29745613 -0.46475233
v 0.32170000 -0.28763768 -0.47492404
v 0.32170000 -0.28672867 -0.47492404
v 0.33352723 -0.29785333 -0.45294375
v 0.34535445 -0.29816945 -0.44113521
v 0.35718168 -0.29840566 -0.42926819
v 0.53004568 -0.29491902 -0.24009744
v 0.36900890 -0.29854347 -0.41745964
v 0.38083613 -0.29855736 -0.40565106
v 0.50516767 -0.28763768 -0.28166122
v 0.50516767 -0.28672867 -0.28166122
v 0.45978144 -0.29517261 -0.34374385
v 0.43973922 -0.29574581 -0.36958238
v 0.41631781 -0.29855736 -0.37016695
v 0.41631781 -0.29795638 -0.38197550
v 0.01337640 -0.28672867 -0.57050319
v 0.20144681 -0.29510545 -0.53157006
v 0.58096682 -0.28763768 -0.09821938
v 0.42814507 -0.29824935 -0.37016695
v 0.43997230 -0.29855736 -0.34649135
v 0.43997230 -0.29785447 -0.35829993
v 0.52905520 -0.28763768 -0.24676168
v 0.52905520 -0.28672867 -0.24676168
v 0.45179952 -0.29852262 -0.33468281
v 0.04885808 -0.28672867 -0.56769721
v 0.35281203 -0.29470248 -0.44838403
v 0.46362675 -0.29802470 -0.32287426
v 0.42330931 -0.29441761 -0.38881510
v 0.47545397 -0.29855621 -0.29919870
v 0.55439925 -0.29546905 -0.16918764
v 0.48728120 -0.29817523 -0.28739011
v 0.49910843 -0.29855736 -0.26377302
v 0.49910843 -0.29735539 -0.27552313
v 0.51093565 -0.29830493 -0.25196446
v 0.25743678 -0.28672867 -0.50701757
v 0.52276288 -0.29855736 -0.21648033
v 0.52276288 -0.29843694 -0.22828889
v 0.52276288 -0.29742255 -0.24009744
v 0.53459010 -0.29773637 -0.20461331
v 0.53459010 -0.29851915 -0.19280477
v 0.59180360 -0.28672867 0.02635503
v 0.54641737 -0.29797259 -0.16918764
v 0.54641737 -0.29855621 -0.15732062
v 0.12174411 -0.28727176 -0.55431026
v 0.55824459 -0.29855736 -0.12183651
v 0.55824459 -0.29814744 -0.13370353
v 0.30643532 -0.28763768 -0.48369280
v 0.17895758 -0.28763768 -0.54314476
v 0.17895758 -0.28672867 -0.54320323
v 0.36533841 -0.29501861 -0.43710158
v 0.33346897 -0.28672867 -0.46638917
v 0.42762070 -0.29582686 -0.38168321
v 0.28155734 -0.29418949 -0.49485827
v 0.36918372 -0.29642322 -0.42956047
v 0.33393508 -0.28763768 -0.46597994
v 0.52876390 -0.28672867 -0.24722934
v 0.58935655 -0.28672867 -0.00451089
v 0.43653480 -0.28763768 -0.37840957
v 0.43653480 -0.28672867 -0.37840957
v 0.44667243 -0.28672867 -0.36636714
v 0.33247852 -0.29511123 -0.46405082
v 0.28225649 -0.28763768 -0.49520903
v 0.58790003 -0.28763768 -0.02269139
v 0.58790003 -0.28672867 -0.02269139
v 0.52247158 -0.29554201 -0.25102913
v 0.57630584 -0.29838020 0.02635503
v 0.57799547 -0.28763768 -0.10991102
v 0.57799547 -0.28672867 -0.10991102
v 0.48745598 -0.29624837 -0.29908179
v 0.59174530 -0.28763768 0.02635503
v 0.54129027 -0.28763768 -0.21291439
v 0.54129027 -0.28672867 -0.21291439
v 0.00242310 -0.28763768 -0.56968480
v 0.00242310 -0.29571917 -0.56740496
v 0.00242310 -0.29822271 -0.55939615
v 0.57001352 -0.29855736 -0.07454382
v 0.57001352 -0.29855736 0.02635503
v 0.57001352 -0.29829566 -0.09821938
v 0.57001352 -0.29855621 -0.08635238
v 0.49444745 -0.29471059 -0.29510660
v 0.01425033 -0.29844736 -0.55939615
v 0.01425033 -0.28763768 -0.57056162
v 0.01425033 -0.28672867 -0.57056162
v 0.01425033 -0.29594382 -0.56781408
v 0.53138569 -0.28672867 -0.24062357
v 0.20569993 -0.28672867 -0.53151159
v 0.42395017 -0.28672867 -0.38939970
v 0.02607755 -0.28763768 -0.57079551
v 0.02607755 -0.28672867 -0.57085394
v 0.02607755 -0.29599015 -0.56787259
v 0.02607755 -0.29849367 -0.55939615
v 0.58184075 -0.29807101 0.02635503
v 0.03790478 -0.28763768 -0.56956786
v 0.03790478 -0.28672867 -0.56962637
v 0.03790478 -0.29562654 -0.56734646
v 0.03790478 -0.29813007 -0.55939615
v 0.11853967 -0.29435971 -0.55413489
v 0.56517776 -0.29467353 -0.14258916
v 0.04973201 -0.29476500 -0.56635269
v 0.04973201 -0.28763768 -0.56752183
v 0.20931220 -0.29154931 -0.52975785
v 0.07338646 -0.29855736 -0.54752914
v 0.43601047 -0.28672867 -0.37887720
v 0.53185176 -0.29593340 -0.22828889
v 0.52509337 -0.28763768 -0.25266595
v 0.52509337 -0.28672867 -0.25266595
v 0.51833497 -0.29488313 -0.26009015
v 0.08521370 -0.29855621 -0.54752914
v 0.57892763 -0.29605267 -0.08635238
v 0.50505115 -0.29361745 -0.28154431
v 0.09704093 -0.29585234 -0.55588867
v 0.09704093 -0.29835588 -0.54752914
v 0.58230686 -0.28763768 -0.08635238
v 0.58230686 -0.28672867 -0.08635238
v 0.57723806 -0.29487153 -0.10786499
v 0.10886815 -0.29520851 -0.55495334
v 0.18443423 -0.28672867 -0.54121564
v 0.41113249 -0.28763768 -0.40033139
v 0.41113249 -0.28672867 -0.40033139
v 0.23319970 -0.28672867 -0.51853387
v 0.54222246 -0.29523282 -0.20461331
v 0.14434983 -0.29855736 -0.53572055
v -0.00340312 -0.29855736 -0.54752914
v -0.00340312 -0.29855736 0.02635503
v -0.00340312 -0.28684679 0.02635503
v -0.00340312 -0.28763768 -0.56921711
v -0.00340312 -0.28672867 -0.53963727
v -0.00340312 -0.28672867 -0.56927561
v -0.00340312 -0.29556053 -0.56717108
v -0.00340312 -0.29806407 -0.55939615
v 0.15617706 -0.29848673 -0.53572055
v 0.31237804 -0.28763768 -0.48047756
v 0.31237804 -0.28672867 -0.48047756
v 0.16800429 -0.28763768 -0.54571692
v 0.16800429 -0.28672867 -0.54577539
v 0.16800429 -0.29556517 -0.54361242
v 0.16800429 -0.29806871 -0.53572055
v 0.58784173 -0.29360935 -0.02187297
v 0.17983151 -0.29855736 -0.52391201
v 0.58615217 -0.29674398 0.02635503
v 0.19165875 -0.29596814 -0.53373300
v 0.19165875 -0.29847168 -0.52391201
v 0.12116148 -0.28672867 -0.55442721
v 0.23366581 -0.28763768 -0.51830005
v 0.44201145 -0.28672867 -0.37232989
v 0.21531321 -0.29602141 -0.52233364
v 0.21531321 -0.29852495 -0.51204503
v 0.32781754 -0.29375062 -0.47089042
v 0.54099898 -0.29417444 -0.21203752
v 0.47050170 -0.29451025 -0.33018152
v 0.22714043 -0.29742604 -0.51204503
v 0.58807484 -0.29394285 -0.01544258
v 0.34471356 -0.29568212 -0.45253453
v 0.23896766 -0.29855274 -0.50023644
v 0.25079490 -0.29762404 -0.50023644
v 0.26262213 -0.29855736 -0.48842786
v 0.27444935 -0.29528146 -0.49637820
v 0.27444935 -0.29778500 -0.48842786
v 0.17715146 -0.29466195 -0.54261866
v 0.58854092 -0.29450909 -0.00357556
v 0.44247756 -0.28763768 -0.37180379
v 0.44247756 -0.28672867 -0.37180379
v 0.53156050 -0.28763768 -0.24009744
v 0.55352532 -0.28672867 -0.17859942
v 0.41084119 -0.29392084 -0.40009754
v 0.34034392 -0.29428097 -0.45960801
v 0.42942682 -0.28672867 -0.38472304
v 0.58900700 -0.29499312 0.00823300
v 0.55882719 -0.28672867 0.02635503
v 0.20465123 -0.28761915 -0.53203769
v 0.30556135 -0.29438055 -0.48322510
v 0.44655591 -0.29428213 -0.36525644
v 0.23337449 -0.29375410 -0.51812468
v 0.52888042 -0.29386758 -0.24646939
v 0.05882091 -0.28672867 -0.56588500
v 0.32752621 -0.28672867 -0.47135812
v 0.42989293 -0.28763768 -0.38431385
v 0.42989293 -0.28672867 -0.38431385
v 0.58102511 -0.28672867 -0.09821938
v 0.18484208 -0.28763768 -0.54104026
v 0.18484208 -0.28672867 -0.54104026
v 0.58947314 -0.29539726 0.02004155
v 0.46368501 -0.29610131 -0.33433205
v 0.44702199 -0.28763768 -0.36589952
v 0.44702199 -0.28672867 -0.36589952
v 0.51920890 -0.28672867 -0.26131777
v 0.58970618 -0.29556864 0.02635503
v 0.12640507 -0.29097032 -0.55337494
v 0.05759740 -0.29400306 -0.56565118
v 0.20366078 -0.28672867 -0.53244692
f 58 6 74
f 58 74 7
f 58 7 81
f 58 81 131
f 58 131 196
f 58 196 85
f 58 85 181
f 58 181 89
f 58 89 102
f 58 102 40
f 58 40 73
f 58 73 123
f 58 123 203
f 58 203 28
f 58 28 202
f 58 202 77
f 58 77 179
f 58 179 162
f 58 162 76
f 58 76 120
f 58 120 195
f 58 195 184
f 58 184 104
f 58 104 136
f 58 136 13
f 58 13 68
f 58 68 2
f 58 2 193
f 58 193 20
f 58 20 150
f 58 150 15
f 58 15 52
f 58 52 137
f 58 137 103
f 58 103 207
f 58 207 198
f 58 198 134
f 58 134 66
f 58 66 152
f 58 152 160
f 58 160 192
f 58 192 42
f 58 42 111
f 58 111 106
f 58 106 100
f 58 100 33
f 58 33 145
f 58 145 144
f 58 144 186
f 58 186 142
f 58 142 141
f 58 141 94
f 58 94 83
f 58 83 109
f 58 109 157
f 58 157 204
f 58 204 87
f 58 87 155
f 58 155 6
f 6 7 74
f 6 155 80
f 6 80 81
f 6 81 7
f 186 144 142
f 87 204 199
f 87 199 185
f 87 185 177
f 87 177 155
f 155 130 80
f 155 177 169
f 155 169 9
f 155 9 35
f 155 35 130
f 80 130 131
f 80 131 81
f 142 144 145
f 142 145 143
f 142 143 146
f 142 146 147
f 142 147 140
f 142 140 141
f 204 157 126
f 204 126 199
f 199 126 9
f 199 9 185
f 185 9 177
f 177 9 169
f 130 35 196
f 130 196 131
f 9 95 63
f 9 63 4
f 9 4 132
f 9 132 35
f 9 126 95
f 35 132 84
f 35 84 196
f 141 140 119
f 141 119 139
f 141 139 156
f 141 156 173
f 141 173 14
f 141 14 26
f 141 26 31
f 141 31 37
f 141 37 49
f 141 49 53
f 141 53 62
f 141 62 93
f 141 93 94
f 145 33 99
f 145 99 90
f 145 90 143
f 157 109 126
f 126 109 95
f 196 84 85
f 95 62 60
f 95 60 57
f 95 57 54
f 95 54 63
f 95 109 96
f 95 96 62
f 63 59 4
f 63 54 59
f 4 59 56
f 4 56 121
f 4 121 47
f 4 47 132
f 132 47 138
f 132 138 115
f 132 115 84
f 84 115 166
f 84 166 191
f 84 191 88
f 84 88 181
f 84 181 85
f 94 93 83
f 140 147 92
f 140 92 98
f 140 98 108
f 140 108 119
f 33 100 99
f 99 100 106
f 99 106 105
f 99 105 101
f 99 101 91
f 99 91 146
f 99 146 90
f 90 146 143
f 109 83 96
f 62 53 60
f 62 96 93
f 60 53 57
f 57 53 54
f 54 49 51
f 54 51 55
f 54 55 56
f 54 56 59
f 54 53 49
f 96 83 93
f 56 55 121
f 121 55 24
f 121 24 138
f 121 138 47
f 138 24 115
f 115 24 166
f 166 24 191
f 191 24 82
f 191 82 124
f 191 124 127
f 191 127 122
f 191 122 39
f 191 39 180
f 191 180 88
f 88 89 181
f 88 180 102
f 88 102 89
f 147 146 91
f 147 91 101
f 147 101 92
f 92 101 98
f 98 101 107
f 98 107 108
f 108 107 113
f 108 113 129
f 108 129 148
f 108 148 125
f 108 125 119
f 119 125 139
f 106 111 110
f 106 110 105
f 105 110 112
f 105 112 107
f 105 107 101
f 49 37 46
f 49 46 51
f 51 46 41
f 51 41 48
f 51 48 50
f 51 50 55
f 55 50 8
f 55 8 82
f 55 82 24
f 82 8 124
f 124 8 86
f 124 86 200
f 124 200 29
f 124 29 97
f 124 97 127
f 127 27 203
f 127 203 122
f 127 97 167
f 127 167 189
f 127 189 201
f 127 201 27
f 122 203 123
f 122 123 73
f 122 73 39
f 39 40 102
f 39 102 180
f 39 73 40
f 107 112 113
f 113 112 128
f 113 128 154
f 113 154 129
f 129 154 148
f 148 139 125
f 148 154 159
f 148 159 156
f 148 156 139
f 111 42 117
f 111 117 110
f 110 117 206
f 110 206 116
f 110 116 112
f 112 116 133
f 112 133 153
f 112 153 128
f 37 41 46
f 37 31 36
f 37 36 41
f 41 36 38
f 41 38 44
f 41 44 48
f 48 44 50
f 50 44 38
f 50 38 86
f 50 86 8
f 86 38 200
f 200 38 30
f 200 30 29
f 29 167 97
f 29 30 189
f 29 189 167
f 27 28 203
f 27 201 202
f 27 202 28
f 189 30 10
f 189 10 178
f 189 178 201
f 201 178 77
f 201 77 202
f 128 153 154
f 154 158 159
f 154 153 158
f 159 158 168
f 159 168 172
f 159 172 175
f 159 175 12
f 159 12 164
f 159 164 156
f 156 164 171
f 156 171 173
f 42 192 117
f 117 192 205
f 117 205 206
f 206 205 114
f 206 114 116
f 116 114 133
f 133 114 153
f 153 114 176
f 153 176 158
f 31 26 36
f 36 26 25
f 36 25 23
f 36 23 22
f 36 22 32
f 36 32 69
f 36 69 30
f 36 30 38
f 30 69 10
f 10 69 67
f 10 67 43
f 10 43 45
f 10 45 75
f 10 75 178
f 178 75 162
f 178 162 179
f 178 179 77
f 158 34 11
f 158 11 163
f 158 163 172
f 158 172 168
f 158 176 34
f 172 11 175
f 172 163 11
f 175 11 12
f 12 18 14
f 12 14 173
f 12 173 171
f 12 171 164
f 12 11 5
f 12 5 18
f 192 160 61
f 192 61 205
f 205 61 152
f 205 152 151
f 205 151 176
f 205 176 114
f 176 151 65
f 176 65 197
f 176 197 118
f 176 118 190
f 176 190 34
f 26 14 25
f 25 14 23
f 23 14 22
f 22 21 32
f 22 14 21
f 32 21 71
f 32 71 69
f 69 71 16
f 69 16 67
f 67 16 170
f 67 170 43
f 43 170 78
f 43 78 183
f 43 183 45
f 45 182 75
f 45 183 182
f 75 120 76
f 75 76 162
f 75 182 194
f 75 194 120
f 34 190 3
f 34 3 70
f 34 70 188
f 34 188 174
f 34 174 11
f 11 188 5
f 11 174 188
f 18 5 17
f 18 17 78
f 18 78 170
f 18 170 16
f 18 16 71
f 18 71 21
f 18 21 14
f 5 188 17
f 160 152 61
f 152 66 65
f 152 65 151
f 65 66 197
f 197 66 134
f 197 134 198
f 197 198 187
f 197 187 118
f 118 187 161
f 118 161 79
f 118 79 64
f 118 64 190
f 190 64 3
f 78 17 165
f 78 165 183
f 183 165 182
f 182 135 194
f 182 165 135
f 120 194 195
f 194 135 104
f 194 104 184
f 194 184 195
f 3 64 70
f 70 64 188
f 188 64 149
f 188 149 165
f 188 165 17
f 198 207 187
f 187 207 103
f 187 103 137
f 187 137 161
f 161 137 52
f 161 52 79
f 79 15 64
f 79 52 15
f 64 15 149
f 165 149 19
f 165 19 193
f 165 193 1
f 165 1 72
f 165 72 135
f 135 136 104
f 135 72 13
f 135 13 136
f 149 15 150
f 149 150 20
f 149 20 19
f 19 20 193
f 193 2 1
f 1 2 68
f 1 68 72
f 72 68 13
@@ -0,0 +1,225 @@
# https://github.com/mikedh/trimesh
v 0.53928964 0.25160740 -0.18369294
v 0.52466437 -0.28672749 -0.25330529
v 0.53795083 0.25250487 -0.19279368
v 0.52332556 0.23962326 -0.18127469
v 0.55234324 -0.28672749 -0.18127469
v 0.55261974 0.23270733 -0.18127469
v 0.55261974 0.22605537 -0.18127469
v 0.47054360 0.25139621 -0.33020933
v 0.44401438 -0.28672749 -0.36986124
v 0.43778592 0.25192414 -0.36986124
v 0.42966563 0.25171299 -0.36986124
v 0.49443881 0.25160740 -0.29511703
v 0.53157682 0.24453307 -0.24010646
v 0.44410171 -0.27981155 -0.36986124
v 0.52511550 -0.28672749 -0.25264075
v 0.52511550 0.24453307 -0.25264075
v 0.44709953 0.23270733 -0.36598467
v 0.44709953 -0.27579925 -0.36598467
v 0.45983297 0.25202974 -0.34375890
v 0.48368451 0.25208253 -0.30868507
v 0.44414535 0.23270733 -0.36986124
v 0.44414535 -0.27579925 -0.36986124
v 0.51920717 -0.28672749 -0.26127998
v 0.51920717 0.24453307 -0.26126153
v 0.53004882 0.25181855 -0.24010646
v 0.50485843 -0.28672749 -0.28213970
v 0.54605656 0.25155460 -0.18127469
v 0.55228505 0.24453307 -0.18127469
v 0.40898651 0.23914813 -0.36312336
v 0.52520284 0.23270733 -0.25273304
v 0.52520284 -0.27579925 -0.25273304
v 0.53632094 0.24807024 -0.18127469
v 0.44017252 0.25197694 -0.35911758
v 0.54448489 0.25150181 -0.18127469
v 0.51929451 0.23270733 -0.26137229
v 0.51929451 -0.27579925 -0.26137229
v 0.44399982 0.24453307 -0.36986124
v 0.52879731 -0.28672749 -0.24719507
v 0.55237236 -0.27579925 -0.18127469
v 0.54102139 0.25102667 -0.21201045
v 0.44704130 -0.28672749 -0.36591079
v 0.44704130 0.24453307 -0.36589236
v 0.47116937 0.23270733 -0.33111385
v 0.47116937 -0.27579925 -0.33111385
v 0.54134156 -0.28672749 -0.21289654
v 0.44870031 0.25202974 -0.35834226
v 0.50507670 0.25049874 -0.28154896
v 0.51836313 0.25176575 -0.26004317
v 0.52892828 0.25076269 -0.24643820
v 0.53164960 0.25261047 -0.22827365
v 0.54438304 0.23270733 -0.20462649
v 0.54438304 -0.27579925 -0.20462649
v 0.40514465 -0.28672749 -0.36986124
v 0.44661928 0.25118503 -0.36530162
v 0.40518829 -0.28672749 -0.35902527
v 0.40518829 0.24009840 -0.36986124
v 0.50516400 0.24453307 -0.28167821
v 0.54419384 0.24453307 -0.20462649
v 0.53173690 0.23270733 -0.24010646
v 0.53173690 -0.27579925 -0.24010646
v 0.43964864 0.25192414 -0.36986124
v 0.52910288 -0.28672749 -0.24673357
v 0.52910288 0.24453307 -0.24673357
v 0.52315092 -0.28672749 -0.18127469
v 0.52587224 0.25261047 -0.22827365
v 0.54132700 0.24453307 -0.21287807
v 0.40398045 0.23159867 -0.36986124
v 0.54377182 0.25250487 -0.19279368
v 0.52914655 0.23270733 -0.24680741
v 0.52914655 -0.27579925 -0.24680741
v 0.53159137 -0.28672749 -0.24010646
v 0.51161077 -0.28672749 -0.19347671
v 0.51677691 0.23867299 -0.18668346
v 0.51677691 0.23825066 -0.18668346
v 0.52328189 0.23297131 -0.18127469
v 0.54224382 0.25213533 -0.20462649
f 27 68 3
f 27 3 1
f 27 1 34
f 27 34 32
f 27 32 4
f 27 4 75
f 27 75 64
f 27 64 5
f 27 5 39
f 27 39 7
f 27 7 6
f 27 6 28
f 27 28 68
f 68 28 76
f 68 76 50
f 68 50 65
f 68 65 3
f 3 65 33
f 3 33 11
f 3 11 1
f 1 32 34
f 1 11 56
f 1 56 73
f 1 73 4
f 1 4 32
f 28 58 40
f 28 40 76
f 28 6 58
f 76 25 50
f 76 40 25
f 50 20 19
f 50 19 46
f 50 46 65
f 50 25 48
f 50 48 20
f 65 46 33
f 33 46 10
f 33 10 11
f 11 10 61
f 11 61 37
f 11 37 21
f 11 21 22
f 11 22 14
f 11 14 9
f 11 9 53
f 11 53 67
f 11 67 56
f 56 29 73
f 56 67 29
f 73 29 67
f 73 67 55
f 73 55 72
f 73 72 74
f 73 74 64
f 73 64 75
f 73 75 4
f 58 6 66
f 58 66 40
f 40 66 49
f 40 49 25
f 6 51 66
f 6 7 52
f 6 52 51
f 25 49 48
f 20 48 19
f 19 48 12
f 19 12 8
f 19 8 54
f 19 54 46
f 46 54 61
f 46 61 10
f 48 49 12
f 67 53 55
f 55 53 9
f 55 9 41
f 55 41 26
f 55 26 23
f 55 23 2
f 55 2 15
f 55 15 38
f 55 38 62
f 55 62 71
f 55 71 45
f 55 45 5
f 55 5 64
f 55 64 72
f 72 64 74
f 66 51 59
f 66 59 13
f 66 13 49
f 49 13 63
f 49 63 16
f 49 16 47
f 49 47 8
f 49 8 12
f 51 52 60
f 51 60 59
f 7 39 52
f 8 47 54
f 54 47 42
f 54 42 37
f 54 37 61
f 5 45 52
f 5 52 39
f 59 69 63
f 59 63 13
f 59 60 70
f 59 70 69
f 63 69 30
f 63 30 16
f 16 24 47
f 16 30 35
f 16 35 24
f 47 24 57
f 47 57 42
f 52 45 60
f 42 57 43
f 42 43 17
f 42 17 21
f 42 21 37
f 9 14 41
f 45 71 60
f 69 70 31
f 69 31 30
f 60 71 62
f 60 62 70
f 30 31 36
f 30 36 35
f 24 35 57
f 35 43 57
f 35 36 44
f 35 44 43
f 43 44 18
f 43 18 17
f 17 18 22
f 17 22 21
f 41 14 22
f 41 22 18
f 41 18 44
f 41 44 26
f 70 62 38
f 70 38 31
f 31 38 15
f 31 15 2
f 31 2 36
f 36 2 23
f 36 23 26
f 36 26 44
@@ -0,0 +1,285 @@
# https://github.com/mikedh/trimesh
v 0.32784129 0.25060641 -0.47088933
v 0.41112583 -0.28672752 -0.40037235
v 0.41112583 0.24453875 -0.40035677
v 0.42899211 0.25181996 -0.37095259
v 0.32809231 -0.27580566 -0.47110760
v 0.32809231 0.23266715 -0.47110760
v 0.32756751 -0.28672752 -0.47135706
v 0.40480535 0.25213653 -0.39394895
v 0.35383064 -0.27580566 -0.44923378
v 0.35383064 0.23266715 -0.44923378
v 0.36669981 -0.27580566 -0.43828909
v 0.36669981 0.23266715 -0.43828909
v 0.42397220 0.24453875 -0.38941204
v 0.41082921 0.25081746 -0.40012288
v 0.39663664 0.23915694 -0.37464762
v 0.43656755 -0.28672752 -0.37845176
v 0.43656755 0.24453875 -0.37845176
v 0.30650679 -0.28672752 -0.48370496
v 0.30650679 0.24453875 -0.48370496
v 0.32804666 -0.28672752 -0.47104525
v 0.42762302 0.25208377 -0.38174140
v 0.36535360 0.25187272 -0.43711977
v 0.29808707 0.25229481 -0.47824819
v 0.29808707 0.25229481 -0.48479631
v 0.25078599 0.25197825 -0.50799533
v 0.25078599 -0.27580566 -0.51027158
v 0.25078599 0.23266715 -0.51027158
v 0.31253065 -0.27580566 -0.48061798
v 0.31253065 0.23266715 -0.48078948
v 0.32172619 -0.28672752 -0.47494293
v 0.32172619 -0.27580566 -0.47511444
v 0.32172619 0.25176720 -0.47261992
v 0.32172619 0.23266715 -0.47528594
v 0.32172619 0.24453875 -0.47492736
v 0.42997325 -0.27580566 -0.38445419
v 0.42997325 0.23266715 -0.38445419
v 0.28152141 0.25108130 -0.49489912
v 0.42944846 -0.28672752 -0.38475042
v 0.40396110 0.23161192 -0.36986124
v 0.32802386 0.24453875 -0.47104525
v 0.21530450 0.25224205 -0.51565039
v 0.21530450 0.25224205 -0.52226090
v 0.22712406 0.25181996 -0.51956369
v 0.44256860 -0.27580566 -0.37191921
v 0.44256860 0.23266715 -0.37191921
v 0.23367273 -0.28672752 -0.51830083
v 0.23367273 0.24453875 -0.51830083
v 0.34034540 0.25113406 -0.45963282
v 0.31196022 -0.28672752 -0.48074271
v 0.44412022 -0.27580566 -0.36986124
v 0.44412022 0.23266715 -0.36986124
v 0.33402492 -0.27580566 -0.46607179
v 0.33402492 0.23266715 -0.46607179
v 0.42965379 0.25171444 -0.36986124
v 0.23337610 0.25060641 -0.51816052
v 0.44409738 -0.27981564 -0.36986124
v 0.21103759 -0.28672752 -0.50043382
v 0.21103759 -0.28672752 -0.52898049
v 0.21103759 0.23841828 -0.52910522
v 0.21103759 -0.28498636 -0.52904287
v 0.21103759 -0.27580566 -0.52913641
v 0.21103759 0.24190060 -0.52902729
v 0.21103759 0.23266715 -0.52913641
v 0.21103759 0.25203101 -0.52319633
v 0.21103759 0.24701857 -0.52885579
v 0.21103759 0.23198125 -0.49793930
v 0.21103759 0.24063430 -0.50004404
v 0.21103759 0.25171444 -0.51650789
v 0.43962513 0.25192548 -0.36986124
v 0.42990481 -0.28672752 -0.38436065
v 0.42333331 0.25129235 -0.38886638
v 0.43777690 0.25192548 -0.36986124
v 0.28222876 -0.28672752 -0.49524209
v 0.28222876 0.24453875 -0.49524209
v 0.42988197 0.24453875 -0.38436065
v 0.43565485 0.25166168 -0.37760983
v 0.30559406 0.25123959 -0.48326842
v 0.40517045 0.24010668 -0.36986124
v 0.44247735 -0.28672752 -0.37184125
v 0.44247735 0.24453875 -0.37182568
v 0.31241656 -0.28672752 -0.48049324
v 0.31241656 0.24453875 -0.48049324
v 0.34472639 0.25203101 -0.45257019
v 0.21728965 0.23915694 -0.49332445
v 0.39332807 -0.28672752 -0.37085905
v 0.30662088 -0.27580566 -0.48376731
v 0.30662088 0.23266715 -0.48376731
v 0.37781202 0.25208377 -0.42581646
v 0.35284950 0.25155615 -0.44839189
v 0.43665883 -0.27580566 -0.37852969
v 0.43665883 0.23266715 -0.37852969
v 0.40512481 -0.28672752 -0.36986124
v 0.21594340 -0.28672752 -0.48908377
v 0.25744876 0.25087022 -0.50652982
v 0.44398333 -0.28672752 -0.36986124
v 0.44398333 0.24453875 -0.36986124
f 58 57 66
f 58 66 67
f 58 67 68
f 58 68 64
f 58 64 65
f 58 65 62
f 58 62 59
f 58 59 63
f 58 63 61
f 58 61 60
f 58 60 46
f 58 46 73
f 58 73 18
f 58 18 49
f 58 49 81
f 58 81 30
f 58 30 7
f 58 7 20
f 58 20 2
f 58 2 38
f 58 38 70
f 58 70 16
f 58 16 79
f 58 79 95
f 58 95 92
f 58 92 85
f 58 85 93
f 58 93 57
f 57 93 66
f 60 61 46
f 46 61 26
f 46 26 86
f 46 86 73
f 93 85 84
f 93 84 66
f 66 84 67
f 61 63 27
f 61 27 26
f 26 27 87
f 26 87 86
f 86 28 18
f 86 18 73
f 86 87 29
f 86 29 28
f 85 92 39
f 85 39 15
f 85 15 84
f 84 15 78
f 84 78 54
f 84 54 68
f 84 68 67
f 63 59 27
f 27 59 87
f 28 31 30
f 28 30 81
f 28 81 49
f 28 49 18
f 28 29 33
f 28 33 31
f 87 59 47
f 87 47 74
f 87 74 19
f 87 19 29
f 29 19 82
f 29 82 34
f 29 34 33
f 92 95 56
f 92 56 50
f 92 50 51
f 92 51 96
f 92 96 69
f 92 69 72
f 92 72 54
f 92 54 78
f 92 78 39
f 39 78 15
f 54 72 4
f 54 4 41
f 54 41 68
f 68 41 64
f 59 62 47
f 31 5 7
f 31 7 30
f 31 33 5
f 47 62 65
f 47 65 55
f 47 55 74
f 74 55 19
f 19 55 94
f 19 94 37
f 19 37 77
f 19 77 82
f 82 77 1
f 82 1 34
f 34 1 40
f 34 40 33
f 33 40 6
f 33 6 5
f 95 79 56
f 72 69 21
f 72 21 8
f 72 8 4
f 4 8 41
f 41 8 23
f 41 23 24
f 41 24 42
f 41 42 64
f 64 42 65
f 5 52 20
f 5 20 7
f 5 6 53
f 5 53 52
f 65 42 43
f 65 43 55
f 55 43 94
f 94 43 37
f 37 43 77
f 77 43 25
f 77 25 24
f 77 24 32
f 77 32 1
f 1 32 48
f 1 48 14
f 1 14 13
f 1 13 3
f 1 3 40
f 40 12 10
f 40 10 53
f 40 53 6
f 40 3 12
f 79 16 90
f 79 90 44
f 79 44 56
f 56 44 50
f 69 96 76
f 69 76 21
f 21 88 24
f 21 24 8
f 21 76 88
f 8 24 23
f 42 24 25
f 42 25 43
f 52 9 20
f 52 53 10
f 52 10 9
f 20 9 11
f 20 11 2
f 24 88 83
f 24 83 32
f 32 22 89
f 32 89 48
f 32 83 22
f 48 89 71
f 48 71 14
f 14 17 75
f 14 75 13
f 14 71 17
f 13 75 36
f 13 36 3
f 3 36 12
f 12 36 35
f 12 35 11
f 12 11 9
f 12 9 10
f 16 70 90
f 44 90 91
f 44 91 45
f 44 45 51
f 44 51 50
f 96 51 45
f 96 45 80
f 96 80 76
f 76 71 22
f 76 22 88
f 76 80 17
f 76 17 71
f 88 22 83
f 11 35 2
f 2 35 38
f 22 71 89
f 17 80 45
f 17 45 91
f 17 91 36
f 17 36 75
f 36 91 90
f 36 90 35
f 70 38 35
f 70 35 90
@@ -0,0 +1,279 @@
# https://github.com/mikedh/trimesh
v 0.20929536 0.24840446 -0.52967287
v 0.18435844 -0.28672752 -0.54124736
v 0.19162120 0.23266373 -0.53831076
v 0.19162120 0.25236604 -0.53351910
v 0.19162120 0.25236604 -0.52727348
v 0.12669707 0.23995305 -0.55350228
v 0.12669707 -0.28308286 -0.55350228
v 0.11848971 0.25125682 -0.55414687
v 0.05904414 -0.27579351 -0.56592905
v 0.05904414 0.23266373 -0.56592905
v 0.00243230 0.25257734 -0.56741885
v 0.00243230 0.25257734 -0.56211867
v 0.00243230 -0.28672752 -0.56973231
v 0.00243230 0.24449568 -0.56971801
v 0.00243230 -0.27579351 -0.56990424
v 0.00243230 0.23266373 -0.56990424
v 0.05757479 0.25088707 -0.56565689
v 0.17890087 -0.28672752 -0.54320270
v 0.17890087 0.24449568 -0.54319555
v 0.17806124 -0.28672752 -0.54341040
v 0.09703725 0.25273580 -0.55593748
v 0.20942129 0.24053409 -0.52986626
v 0.20942129 -0.28366387 -0.52986626
v 0.17711666 0.25152091 -0.54263688
v 0.18479924 0.24449568 -0.54093939
v 0.16796472 -0.28672752 -0.54578117
v 0.16796472 0.24449568 -0.54577402
v 0.16796472 0.25241888 -0.54362529
v 0.16796472 -0.27579351 -0.54595306
v 0.16796472 0.23266373 -0.54595306
v 0.03790653 -0.28672752 -0.56962489
v 0.03790653 0.24449568 -0.56961058
v 0.03790653 -0.27579351 -0.56980393
v 0.03790653 0.23266373 -0.56980393
v 0.03790653 0.25252450 -0.56736154
v 0.10883400 0.25210195 -0.55499923
v 0.20459344 0.24449568 -0.53204364
v 0.18482023 -0.28672752 -0.54107547
v 0.19218795 -0.28672752 -0.50084410
v 0.01425005 -0.28672752 -0.57061329
v 0.01425005 0.24449568 -0.57059179
v 0.01425005 -0.27579351 -0.57085683
v 0.01425005 0.25284142 -0.56781993
v 0.01425005 0.25284142 -0.56226191
v 0.01425005 0.23266373 -0.57085683
v 0.20450947 -0.28672752 -0.53210095
v 0.20345995 -0.27579351 -0.53273839
v 0.20345995 0.23266373 -0.53273839
v 0.04972428 0.24449568 -0.56751915
v 0.04972428 0.25162654 -0.56635164
v 0.17904781 -0.27579351 -0.54326001
v 0.17904781 0.23266373 -0.54326001
v 0.21103758 0.23197705 -0.49795050
v 0.21103758 0.25199629 -0.52321236
v 0.21103758 -0.28672752 -0.52899243
v 0.21103758 -0.28672752 -0.50045017
v 0.21103758 0.24190744 -0.52903543
v 0.21103758 -0.27579351 -0.52914286
v 0.21103758 0.25167937 -0.51651551
v 0.21103758 0.23266373 -0.52914286
v 0.21103758 0.23842124 -0.52911421
v 0.21103758 0.24703111 -0.52886351
v 0.21103758 0.24063972 -0.50004908
v 0.21103758 -0.28498442 -0.52905690
v 0.03700393 -0.28672752 -0.56972512
v -0.00340310 -0.28672752 -0.56928111
v -0.00340310 -0.28672752 -0.53966444
v -0.00340310 0.24449568 -0.56926673
v -0.00340310 0.25241888 -0.56720400
v -0.00340310 0.25241888 -0.56203271
v -0.00340310 -0.27579351 -0.56943147
v -0.00340310 0.23266373 -0.56943147
v -0.00340310 0.24835163 -0.56837144
v -0.00340310 0.25078140 -0.55912477
v -0.00340310 0.23852687 -0.56935985
v -0.00340310 0.23947767 -0.54043084
v 0.20568495 -0.28672752 -0.53155660
v 0.05879225 0.24449568 -0.56587893
v 0.02606779 -0.28672752 -0.57084964
v 0.02606779 0.24449568 -0.57082814
v 0.02606779 -0.27579351 -0.57111468
v 0.02606779 0.23266373 -0.57111468
v 0.02606779 0.25289426 -0.56792736
v 0.02606779 0.25289426 -0.56226191
v 0.12172228 0.24412592 -0.55434026
v 0.12067274 -0.27579351 -0.55462676
v 0.12067274 0.23266373 -0.55462676
v 0.18496717 0.23266373 -0.54137628
v 0.15614698 0.25284142 -0.54443465
v 0.15614698 0.25284142 -0.53874766
v 0.05881324 -0.28672752 -0.56588612
v 0.12237299 -0.28672752 -0.55423283
v 0.04882168 -0.28672752 -0.56769820
v 0.20140286 0.25199629 -0.53158525
f 66 67 76
f 66 76 74
f 66 74 70
f 66 70 69
f 66 69 73
f 66 73 68
f 66 68 75
f 66 75 72
f 66 72 71
f 66 71 15
f 66 15 42
f 66 42 13
f 66 13 40
f 66 40 79
f 66 79 65
f 66 65 31
f 66 31 93
f 66 93 91
f 66 91 92
f 66 92 26
f 66 26 20
f 66 20 18
f 66 18 2
f 66 2 38
f 66 38 46
f 66 46 77
f 66 77 55
f 66 55 56
f 66 56 39
f 66 39 67
f 67 39 76
f 71 72 16
f 71 16 15
f 15 16 45
f 15 45 42
f 42 81 40
f 42 40 13
f 42 45 82
f 42 82 81
f 39 56 53
f 39 53 76
f 76 53 63
f 76 63 59
f 76 59 74
f 72 75 16
f 16 75 45
f 81 33 65
f 81 65 79
f 81 79 40
f 81 82 34
f 81 34 33
f 45 75 68
f 45 68 14
f 45 14 41
f 45 41 82
f 56 55 64
f 56 64 58
f 56 58 60
f 56 60 61
f 56 61 57
f 56 57 62
f 56 62 54
f 56 54 59
f 56 59 63
f 56 63 53
f 59 54 5
f 59 5 44
f 59 44 12
f 59 12 70
f 59 70 74
f 33 9 7
f 33 7 91
f 33 91 93
f 33 93 31
f 33 31 65
f 33 34 10
f 33 10 9
f 82 41 80
f 82 80 32
f 82 32 34
f 68 73 14
f 14 73 41
f 41 73 69
f 41 69 11
f 41 11 43
f 41 43 80
f 55 77 64
f 54 62 1
f 54 1 94
f 54 94 4
f 54 4 5
f 5 4 89
f 5 89 90
f 5 90 44
f 44 43 11
f 44 11 12
f 44 90 84
f 44 84 83
f 44 83 43
f 12 11 69
f 12 69 70
f 9 86 7
f 9 10 87
f 9 87 86
f 7 86 29
f 7 29 26
f 7 26 92
f 7 92 91
f 34 32 49
f 34 49 78
f 34 78 6
f 34 6 10
f 80 43 83
f 80 83 35
f 80 35 32
f 32 35 50
f 32 50 17
f 32 17 49
f 77 46 47
f 77 47 23
f 77 23 64
f 64 23 58
f 62 57 1
f 1 57 22
f 1 22 37
f 1 37 25
f 1 25 24
f 1 24 94
f 94 24 28
f 94 28 4
f 4 28 89
f 90 89 83
f 90 83 84
f 86 87 30
f 86 30 29
f 10 6 87
f 29 51 20
f 29 20 26
f 29 30 52
f 29 52 51
f 49 17 78
f 78 85 6
f 78 17 85
f 6 85 27
f 6 27 30
f 6 30 87
f 83 89 21
f 83 21 35
f 35 21 28
f 35 28 36
f 35 36 50
f 50 36 8
f 50 8 17
f 17 8 27
f 17 27 85
f 46 38 47
f 47 58 23
f 47 38 88
f 47 88 3
f 47 3 48
f 47 48 60
f 47 60 58
f 57 61 22
f 22 61 48
f 22 48 3
f 22 3 37
f 37 3 88
f 37 88 25
f 25 19 24
f 25 88 19
f 24 8 28
f 24 19 27
f 24 27 8
f 28 21 89
f 28 8 36
f 51 38 2
f 51 2 18
f 51 18 20
f 51 52 88
f 51 88 38
f 30 27 19
f 30 19 52
f 88 52 19
f 48 61 60
@@ -0,0 +1,258 @@
# https://github.com/mikedh/trimesh
v -0.21159164 0.24449568 0.58404253
v -0.21266425 -0.28672752 0.58355464
v -0.05581303 -0.28672752 0.61968814
v -0.02123761 -0.28672752 0.62260838
v -0.02123761 0.24449568 0.62258681
v -0.02123761 -0.27579354 0.62285234
v -0.02123761 0.25284142 0.61425664
v -0.02123761 0.25284142 0.61981727
v -0.02123761 0.23266369 0.62285234
v -0.04399345 -0.28672752 0.62172585
v -0.19918320 -0.28672752 0.55283834
v -0.00941805 0.25257730 0.61941548
v -0.00941805 0.25257730 0.61411312
v -0.00941805 -0.28672752 0.62172585
v -0.00941805 0.24449568 0.62171147
v -0.19194843 0.23266369 0.59337010
v -0.18589145 0.24449568 0.59519257
v -0.16313559 0.25284142 0.59074404
v -0.16313559 0.25284142 0.59643385
v -0.19135956 -0.28672752 0.59324811
v -0.18412480 0.25152087 0.59463292
v -0.10403773 0.25273580 0.60793542
v -0.19182226 -0.28672752 0.59306875
v -0.11583628 0.25210192 0.60699547
v -0.06456204 0.25088703 0.61765042
v -0.21642885 -0.28361108 0.58186134
v -0.21642885 0.24053406 0.58186134
v -0.13369182 -0.28303003 0.60549592
v -0.13369182 0.23995305 0.60549592
v -0.21045595 -0.27579354 0.58473136
v -0.21045595 0.23266369 0.58473136
v -0.18603866 -0.27579354 0.59525714
v -0.18603866 0.23266369 0.59525714
v -0.19180122 0.24449568 0.59293243
v -0.12870742 0.24412592 0.60633538
v -0.00340310 -0.28672752 0.59166245
v -0.00340310 -0.28672752 0.62125949
v -0.00340310 0.25241884 0.61919302
v -0.00340310 0.25241884 0.61402702
v -0.00340310 0.24449568 0.62125230
v -0.00340310 -0.27579354 0.62141731
v -0.00340310 0.23266369 0.62141731
v -0.00340310 0.23868533 0.62133837
v -0.00340310 0.24845726 0.62032670
v -0.00340310 0.25072857 0.61102067
v -0.00340310 0.23947763 0.59242300
v -0.20839491 0.25199629 0.58358333
v -0.06580288 -0.28672752 0.61788001
v -0.21825856 0.23197702 0.54981046
v -0.21825856 0.25199629 0.57515268
v -0.21825856 -0.28672752 0.58087837
v -0.21825856 -0.28672752 0.55242217
v -0.21825856 -0.28514288 0.58093574
v -0.21825856 -0.27579354 0.58102904
v -0.21825856 0.23266369 0.58102904
v -0.21825856 0.23810429 0.58100750
v -0.21825856 0.25173217 0.56846555
v -0.21825856 0.24063972 0.55197731
v -0.21825856 0.24681979 0.58074919
v -0.21825856 0.24206590 0.58091424
v -0.05671737 0.24449568 0.61951593
v -0.05671737 0.25162654 0.61835356
v -0.04489780 -0.28672752 0.62162540
v -0.04489780 0.24449568 0.62161102
v -0.04489780 -0.27579354 0.62180473
v -0.04489780 0.23266369 0.62180473
v -0.04489780 0.25252450 0.61935810
v -0.03307822 -0.28672752 0.62284515
v -0.03307822 0.24449568 0.62282358
v -0.03307822 -0.27579354 0.62311061
v -0.03307822 0.23266369 0.62311061
v -0.03307822 0.25289426 0.61992491
v -0.03307822 0.25289426 0.61426379
v -0.12546860 0.25125678 0.60614167
v -0.19861537 0.23266369 0.59030634
v -0.19861537 0.25236604 0.58551344
v -0.19861537 0.25236604 0.57927117
v -0.21150752 -0.28672752 0.58409276
v -0.17497621 -0.28672752 0.59778274
v -0.17497621 0.25241884 0.59561589
v -0.17497621 0.24449568 0.59776840
v -0.17497621 -0.27579354 0.59794776
v -0.17497621 0.23266369 0.59794776
v -0.18591247 -0.28672752 0.59519972
v -0.06578185 0.24449568 0.61787282
v -0.21628163 0.24840443 0.58166760
v -0.12935938 -0.28672752 0.60622777
f 52 11 36
f 52 36 37
f 52 37 14
f 52 14 4
f 52 4 68
f 52 68 10
f 52 10 63
f 52 63 3
f 52 3 48
f 52 48 87
f 52 87 79
f 52 79 84
f 52 84 20
f 52 20 23
f 52 23 78
f 52 78 2
f 52 2 51
f 52 51 53
f 52 53 54
f 52 54 55
f 52 55 56
f 52 56 60
f 52 60 59
f 52 59 50
f 52 50 57
f 52 57 58
f 52 58 49
f 52 49 11
f 11 49 46
f 11 46 36
f 51 2 53
f 49 58 46
f 36 46 45
f 36 45 39
f 36 39 38
f 36 38 44
f 36 44 40
f 36 40 43
f 36 43 42
f 36 42 41
f 36 41 37
f 46 58 57
f 46 57 45
f 2 78 26
f 2 26 53
f 53 26 54
f 37 41 6
f 37 6 14
f 57 50 77
f 57 77 18
f 57 18 7
f 57 7 13
f 57 13 39
f 57 39 45
f 78 23 30
f 78 30 26
f 26 30 54
f 54 30 31
f 54 31 55
f 14 6 4
f 41 42 9
f 41 9 6
f 6 70 4
f 6 9 71
f 6 71 70
f 50 47 76
f 50 76 77
f 50 59 86
f 50 86 47
f 77 76 19
f 77 19 18
f 18 19 72
f 18 72 73
f 18 73 7
f 7 73 72
f 7 72 8
f 7 8 12
f 7 12 13
f 13 12 38
f 13 38 39
f 23 20 16
f 23 16 30
f 30 16 75
f 30 75 31
f 55 31 56
f 4 70 68
f 42 43 9
f 70 65 10
f 70 10 68
f 70 71 66
f 70 66 65
f 9 43 40
f 9 40 15
f 9 15 5
f 9 5 71
f 47 21 80
f 47 80 76
f 47 86 21
f 76 80 19
f 59 60 86
f 86 60 27
f 86 27 1
f 86 1 34
f 86 34 21
f 19 80 22
f 19 22 72
f 8 72 69
f 8 69 5
f 8 5 12
f 12 5 38
f 38 5 44
f 20 84 32
f 20 32 16
f 16 33 17
f 16 17 34
f 16 34 1
f 16 1 75
f 16 32 33
f 75 1 27
f 75 27 31
f 31 27 56
f 56 27 60
f 65 82 28
f 65 28 48
f 65 48 3
f 65 3 63
f 65 63 10
f 65 66 83
f 65 83 82
f 71 5 69
f 71 69 64
f 71 64 66
f 40 44 15
f 15 44 5
f 21 74 80
f 21 34 17
f 21 17 81
f 21 81 74
f 80 67 22
f 80 74 24
f 80 24 67
f 72 22 67
f 72 67 69
f 69 67 64
f 84 79 82
f 84 82 32
f 32 82 83
f 32 83 33
f 33 83 17
f 17 83 81
f 82 79 28
f 28 79 87
f 28 87 48
f 66 64 61
f 66 61 85
f 66 85 29
f 66 29 83
f 64 67 62
f 64 62 25
f 64 25 61
f 74 25 62
f 74 62 24
f 74 81 25
f 81 83 29
f 81 29 35
f 81 35 25
f 67 24 62
f 61 25 85
f 85 35 29
f 85 25 35
@@ -0,0 +1,264 @@
# https://github.com/mikedh/trimesh
v -0.26504191 -0.27580566 0.55881937
v -0.26504191 0.23266708 0.55881937
v -0.37357562 0.24453864 0.49017350
v -0.31950064 -0.27580566 0.53261842
v -0.31950064 0.23266708 0.53278875
v -0.40363757 0.23915687 0.42665320
v -0.24037100 0.25060634 0.57015451
v -0.28850668 0.25108120 0.54689575
v -0.40495337 -0.28672752 0.46330667
v -0.40495337 -0.28672752 0.42282837
v -0.40495337 0.23340574 0.46366281
v -0.40495337 0.24474969 0.46324474
v -0.40495337 -0.27580566 0.46344602
v -0.40495337 0.23931515 0.42598736
v -0.40495337 0.23266708 0.46367832
v -0.40495337 0.25187265 0.45678741
v -0.40495337 0.25187265 0.44924612
v -0.40495337 0.24453864 0.46333765
v -0.40495337 -0.28630540 0.46332214
v -0.40495337 0.23477757 0.42580151
v -0.35985128 0.25155608 0.50039371
v -0.22229728 0.25224198 0.57425809
v -0.22229728 0.25224198 0.56764593
v -0.40032985 -0.28672752 0.42285935
v -0.25776856 -0.27580566 0.56227255
v -0.25776856 0.23266708 0.56227255
v -0.25776856 0.25197817 0.55998076
v -0.22427095 0.23915687 0.54531626
v -0.40349138 0.25181989 0.44995845
v -0.31895241 -0.28672752 0.53274230
v -0.32871112 -0.28672752 0.52693534
v -0.32871112 -0.27580566 0.52710568
v -0.32871112 0.25176713 0.52461257
v -0.32871112 0.23266708 0.52727602
v -0.32871112 0.24453864 0.52691987
v -0.38792130 0.25208370 0.46954721
v -0.22293690 -0.28672752 0.54108879
v -0.33503417 -0.28672752 0.52304855
v -0.33503417 0.24453864 0.52303307
v -0.37960628 -0.27580566 0.48524921
v -0.37960628 0.23266708 0.48524921
v -0.36074674 -0.28672752 0.50115249
v -0.37854633 0.25208370 0.47264424
v -0.30508187 0.25229474 0.53679940
v -0.30508187 0.25229474 0.53023369
v -0.36072848 0.24453864 0.50113702
v -0.37233293 0.25187265 0.48912049
v -0.23412105 0.25181989 0.57154820
v -0.23412105 -0.27580566 0.57349931
v -0.23412105 0.23266708 0.57349931
v -0.36664950 0.24453864 0.49608884
v -0.26443884 0.25087015 0.55852515
v -0.38642276 -0.28672752 0.47919448
v -0.38655070 -0.27580566 0.47933383
v -0.31348824 -0.28672752 0.53569997
v -0.33485143 0.25060634 0.52287821
v -0.28921940 0.24453864 0.54723643
v -0.39102798 0.25203094 0.46127812
v -0.26495052 -0.28672752 0.55877292
v -0.33510727 -0.27580566 0.52309500
v -0.33510727 0.23266708 0.52309500
v -0.31255622 0.25123948 0.53526636
v -0.24015171 -0.28672752 0.57054164
v -0.31940929 -0.28672752 0.53249453
v -0.21825854 -0.28672752 0.58087026
v -0.21825854 -0.28672752 0.55240849
v -0.21825854 0.24680745 0.58074641
v -0.21825854 0.24205882 0.58090124
v -0.21825854 0.24068699 0.55195940
v -0.21825854 -0.28514465 0.58093222
v -0.21825854 -0.27580566 0.58102512
v -0.21825854 0.23810161 0.58099414
v -0.21825854 0.23266708 0.58102512
v -0.21825854 0.25203094 0.57514076
v -0.21825854 0.23198118 0.54980697
v -0.21825854 0.25171437 0.56845113
v -0.35171901 0.25203094 0.50457472
v -0.31346998 0.24453864 0.53569997
v -0.38481458 0.25208370 0.47781630
v -0.31359792 -0.27580566 0.53576190
v -0.31359792 0.23266708 0.53576190
v -0.28141607 0.25213646 0.54839781
v -0.36674085 -0.27580566 0.49619722
v -0.36674085 0.23266708 0.49619722
v -0.24066339 0.24453864 0.57029387
v -0.34735137 0.25113396 0.51163598
v -0.39733278 0.25203094 0.46643467
v -0.37359388 -0.28672752 0.49018897
v -0.31939099 0.24453864 0.53249453
f 10 24 37
f 10 37 66
f 10 66 65
f 10 65 63
f 10 63 59
f 10 59 55
f 10 55 30
f 10 30 64
f 10 64 31
f 10 31 38
f 10 38 42
f 10 42 88
f 10 88 53
f 10 53 9
f 10 9 19
f 10 19 13
f 10 13 15
f 10 15 11
f 10 11 18
f 10 18 12
f 10 12 16
f 10 16 17
f 10 17 14
f 10 14 20
f 10 20 24
f 24 20 6
f 24 6 28
f 24 28 37
f 9 53 19
f 20 14 6
f 37 28 75
f 37 75 66
f 6 14 28
f 28 14 76
f 28 76 69
f 28 69 75
f 53 88 54
f 53 54 19
f 19 54 13
f 14 17 29
f 14 29 76
f 66 75 69
f 66 69 76
f 66 76 74
f 66 74 67
f 66 67 68
f 66 68 72
f 66 72 73
f 66 73 71
f 66 71 70
f 66 70 65
f 76 29 23
f 76 23 74
f 88 42 54
f 54 42 40
f 54 40 15
f 54 15 13
f 17 16 87
f 17 87 58
f 17 58 23
f 17 23 29
f 65 70 63
f 23 58 43
f 23 43 45
f 23 45 44
f 23 44 22
f 23 22 74
f 74 22 67
f 42 38 40
f 40 38 83
f 40 83 84
f 40 84 41
f 40 41 15
f 15 41 39
f 15 39 46
f 15 46 51
f 15 51 11
f 16 12 87
f 87 79 36
f 87 36 58
f 87 12 79
f 58 36 43
f 70 71 63
f 63 71 49
f 63 49 59
f 43 36 45
f 45 36 44
f 22 44 82
f 22 82 27
f 22 27 48
f 22 48 67
f 67 48 7
f 67 7 85
f 67 85 68
f 38 31 32
f 38 32 60
f 38 60 83
f 83 60 61
f 83 61 84
f 41 84 39
f 39 35 56
f 39 56 46
f 39 84 61
f 39 61 34
f 39 34 35
f 46 56 51
f 51 56 3
f 51 3 11
f 11 3 18
f 12 21 47
f 12 47 79
f 12 18 21
f 79 44 36
f 79 47 77
f 79 77 44
f 71 73 50
f 71 50 49
f 59 49 25
f 59 25 1
f 59 1 80
f 59 80 55
f 49 50 26
f 49 26 25
f 44 77 33
f 44 33 62
f 44 62 82
f 82 62 27
f 27 62 48
f 48 62 8
f 48 8 52
f 48 52 7
f 7 52 78
f 7 78 57
f 7 57 85
f 85 57 72
f 85 72 68
f 31 64 4
f 31 4 32
f 32 4 5
f 32 5 34
f 32 34 60
f 60 34 61
f 35 89 56
f 35 34 5
f 35 5 89
f 56 62 33
f 56 33 86
f 56 86 18
f 56 18 3
f 56 89 62
f 18 86 21
f 21 86 33
f 21 33 47
f 47 33 77
f 73 72 50
f 55 80 4
f 55 4 30
f 25 26 2
f 25 2 1
f 1 2 81
f 1 81 80
f 80 81 5
f 80 5 4
f 50 72 26
f 62 89 78
f 62 78 8
f 8 78 52
f 78 89 5
f 78 5 81
f 78 81 57
f 57 81 72
f 72 81 2
f 72 2 26
f 64 30 4
@@ -0,0 +1,306 @@
# https://github.com/mikedh/trimesh
v -0.53864958 0.25261047 0.28027621
v -0.43590909 -0.28672749 0.37559997
v -0.45403642 -0.28672749 0.41789530
v -0.45403642 0.24453307 0.41789530
v -0.46683637 0.25202974 0.39575201
v -0.44366576 0.23270733 0.43052019
v -0.44366576 -0.27579925 0.43052019
v -0.40495337 -0.28672749 0.46329704
v -0.40495337 -0.28672749 0.42281382
v -0.40495337 0.24474422 0.46321739
v -0.40495337 0.25187135 0.45676559
v -0.40495337 0.25187135 0.44923844
v -0.40495337 0.23270733 0.46367543
v -0.40495337 0.23476629 0.42578086
v -0.40495337 0.24453307 0.46331699
v -0.40495337 0.23935932 0.42596008
v -0.40495337 -0.27579925 0.46341652
v -0.53704425 0.25181855 0.29210456
v -0.43099368 -0.28672749 0.44139271
v -0.43099368 0.24453307 0.44139271
v -0.43644890 -0.28672749 0.43673307
v -0.42406096 -0.28672749 0.44730688
v -0.41182927 0.25213533 0.44591299
v -0.53859277 -0.28672749 0.29210456
v -0.45369546 -0.28672749 0.41835331
v -0.52535240 0.25176575 0.31205743
v -0.52620480 -0.28672749 0.31327212
v -0.43698878 0.23270733 0.43643437
v -0.43698878 -0.27579925 0.43643437
v -0.41785277 0.25081549 0.45208600
v -0.41813692 -0.28672749 0.45234487
v -0.41813692 0.24453307 0.45234487
v -0.40518069 -0.28672749 0.46311786
v -0.45568436 0.25202974 0.41034827
v -0.52072113 0.23724756 0.26026358
v -0.55007153 0.23270733 0.26026358
v -0.55007153 -0.27579925 0.26026358
v -0.49496497 -0.28672749 0.29280151
v -0.44358053 -0.28672749 0.43044054
v -0.44358053 0.24453307 0.43042062
v -0.52084900 0.23962326 0.26026358
v -0.46817176 0.23270733 0.39758399
v -0.46817176 -0.27579925 0.39758399
v -0.44903575 -0.28672749 0.42432723
v -0.53219989 0.23270733 0.30472943
v -0.53219989 -0.27579925 0.30472943
v -0.53579409 -0.28672749 0.29919360
v -0.40528012 -0.27579925 0.46315769
v -0.41218443 -0.28672749 0.41102529
v -0.53592195 0.25076269 0.29843690
v -0.45361021 0.25118503 0.41727799
v -0.41820793 0.23270733 0.45240461
v -0.41820793 -0.27579925 0.45240461
v -0.44957560 0.23270733 0.42388913
v -0.44957560 -0.27579925 0.42388913
v -0.43690352 -0.28672749 0.43633480
v -0.43690352 0.24453307 0.43633480
v -0.51215468 0.24453307 0.33368302
v -0.51833446 -0.28672749 0.26026358
v -0.53286757 0.25261047 0.28027621
v -0.51184217 -0.28672749 0.33416090
v -0.49068886 0.25208253 0.36070500
v -0.54838094 0.23270733 0.26502280
v -0.54838094 -0.27579925 0.26502280
v -0.53614925 0.23270733 0.29881525
v -0.53614925 -0.27579925 0.29881525
v -0.53873484 0.23270733 0.29210456
v -0.53873484 -0.27579925 0.29210456
v -0.53211464 -0.28672749 0.30464977
v -0.53211464 0.24453307 0.30462986
v -0.53340742 0.24807024 0.26026358
v -0.40519490 0.24453307 0.46311786
v -0.53857856 0.24453307 0.29210456
v -0.53842229 0.25107947 0.26026358
v -0.50144309 0.25160740 0.34714423
v -0.49813301 0.23270733 0.35417355
v -0.49813301 -0.27579925 0.35417355
v -0.54863668 0.25160740 0.26026358
v -0.52619059 0.24453307 0.31327212
v -0.54992946 -0.28672749 0.26026358
v -0.54992946 0.24453307 0.26026358
v -0.44949038 -0.28672749 0.42380948
v -0.44949038 0.24453307 0.42380948
v -0.43035437 0.25129062 0.44083513
v -0.45409324 0.23270733 0.41797496
v -0.45409324 -0.27579925 0.41797496
v -0.41150251 0.25176575 0.45463487
v -0.51206946 0.25049874 0.33356354
v -0.47408160 0.23270733 0.38902138
v -0.47408160 -0.27579925 0.38902138
v -0.54832413 -0.28672749 0.26488341
v -0.54832413 0.24453307 0.26488341
v -0.54961691 0.24775346 0.26026358
v -0.53609243 -0.28672749 0.29873560
v -0.53609243 0.24453307 0.29873560
v -0.43464472 0.25208253 0.43370628
v -0.53565205 0.25044594 0.26251376
v -0.54154769 0.25176575 0.26026358
v -0.52629005 0.23270733 0.31337169
v -0.52629005 -0.27579925 0.31337169
v -0.44268553 0.25166020 0.42958426
v -0.55002888 0.23788108 0.26026358
v -0.54801158 0.25102667 0.26400722
f 13 15 72
f 13 72 32
f 13 32 52
f 13 52 53
f 13 53 48
f 13 48 17
f 13 17 8
f 13 8 9
f 13 9 14
f 13 14 16
f 13 16 12
f 13 12 11
f 13 11 10
f 13 10 15
f 15 10 30
f 15 30 72
f 72 30 32
f 32 20 28
f 32 28 52
f 32 30 20
f 52 28 29
f 52 29 53
f 53 29 31
f 53 31 48
f 48 31 33
f 48 33 17
f 17 33 8
f 10 11 87
f 10 87 30
f 30 87 84
f 30 84 40
f 30 40 57
f 30 57 20
f 20 57 28
f 28 57 40
f 28 40 6
f 28 6 7
f 28 7 29
f 29 7 39
f 29 39 56
f 29 56 21
f 29 21 19
f 29 19 22
f 29 22 31
f 31 22 19
f 31 19 21
f 31 21 56
f 31 56 39
f 31 39 44
f 31 44 82
f 31 82 25
f 31 25 3
f 31 3 61
f 31 61 27
f 31 27 69
f 31 69 47
f 31 47 94
f 31 94 24
f 31 24 91
f 31 91 80
f 31 80 59
f 31 59 38
f 31 38 2
f 31 2 49
f 31 49 9
f 31 9 8
f 31 8 33
f 11 12 23
f 11 23 96
f 11 96 87
f 87 101 84
f 87 96 101
f 84 101 40
f 40 101 83
f 40 83 6
f 6 83 54
f 6 54 55
f 6 55 7
f 7 55 44
f 7 44 39
f 9 49 14
f 12 71 97
f 12 97 74
f 12 74 98
f 12 98 60
f 12 60 23
f 12 16 41
f 12 41 71
f 23 60 1
f 23 1 96
f 96 1 34
f 96 34 101
f 101 34 5
f 101 5 51
f 101 51 83
f 83 51 4
f 83 4 54
f 54 4 85
f 54 85 86
f 54 86 55
f 55 86 25
f 55 25 82
f 55 82 44
f 49 2 14
f 14 35 16
f 14 2 35
f 71 74 97
f 71 41 35
f 71 35 59
f 71 59 80
f 71 80 37
f 71 37 36
f 71 36 102
f 71 102 81
f 71 81 93
f 71 93 78
f 71 78 98
f 71 98 74
f 98 78 1
f 98 1 60
f 16 35 41
f 1 62 5
f 1 5 34
f 1 78 18
f 1 18 26
f 1 26 62
f 5 62 26
f 5 26 75
f 5 75 51
f 51 75 88
f 51 88 4
f 4 88 58
f 4 58 76
f 4 76 89
f 4 89 42
f 4 42 85
f 85 42 43
f 85 43 86
f 86 43 3
f 86 3 25
f 2 38 35
f 35 38 59
f 78 93 103
f 78 103 18
f 18 103 50
f 18 50 26
f 26 50 75
f 75 50 88
f 88 50 70
f 88 70 79
f 88 79 58
f 58 79 99
f 58 99 76
f 76 99 100
f 76 100 77
f 76 77 90
f 76 90 89
f 89 90 43
f 89 43 42
f 43 90 61
f 43 61 3
f 93 81 103
f 103 81 92
f 103 92 50
f 50 92 73
f 50 73 95
f 50 95 70
f 70 95 45
f 70 45 99
f 70 99 79
f 99 45 46
f 99 46 100
f 77 100 61
f 77 61 90
f 61 100 27
f 80 91 37
f 81 102 92
f 92 102 63
f 92 63 67
f 92 67 73
f 73 67 95
f 95 67 65
f 95 65 45
f 45 65 66
f 45 66 46
f 100 46 69
f 100 69 27
f 91 24 68
f 91 68 64
f 91 64 37
f 37 64 63
f 37 63 36
f 102 36 63
f 63 64 68
f 63 68 67
f 67 68 66
f 67 66 65
f 46 66 47
f 46 47 69
f 24 94 68
f 68 94 66
f 66 94 47
@@ -0,0 +1,231 @@
# https://github.com/mikedh/trimesh
v -0.59644412 -0.28672752 0.05556436
v -0.57353971 0.25249913 0.18563492
v -0.57278963 -0.28672752 0.19619797
v -0.58508272 -0.27579298 0.16197735
v -0.58508272 0.23269014 0.16197735
v -0.59484140 0.25049182 0.07383683
v -0.53843691 0.25107288 0.26024368
v -0.59737578 -0.28672752 0.04375859
v -0.59643622 0.24452271 0.05556436
v -0.55138531 -0.27579298 0.25660759
v -0.55138531 0.23269014 0.25660759
v -0.58535904 0.25265759 0.15017159
v -0.52379102 0.23865925 0.23865730
v -0.59830744 -0.28672752 0.03192981
v -0.59736788 0.24452271 0.04375859
v -0.58901459 0.25102005 0.02514092
v -0.51834320 -0.28672752 0.25713689
v -0.51834320 -0.28672752 0.26024368
v -0.59558351 -0.27579298 0.06739314
v -0.59558351 0.23269014 0.06739314
v -0.56010180 0.25133700 0.22926792
v -0.51861956 -0.28672752 0.24544620
v -0.59829954 0.24452271 0.03192981
v -0.59154111 0.25244630 0.02514092
v -0.56141241 0.25234065 0.22112125
v -0.54864563 0.25160111 0.26024368
v -0.59510193 0.25080875 0.06739314
v -0.58017968 0.25292171 0.13836582
v -0.58590382 0.25292171 0.13836582
v -0.59491245 -0.28672752 0.07468832
v -0.59491245 0.24452271 0.07466531
v -0.52086183 0.23961008 0.26024368
v -0.56055973 -0.28672752 0.23053365
v -0.56055973 0.24452271 0.23051064
v -0.59556772 0.25138982 0.05556436
v -0.56993942 0.23945162 0.02514092
v -0.55004308 0.23791973 0.26024368
v -0.54994835 -0.28672752 0.26024368
v -0.59602569 0.25186523 0.04375859
v -0.59893120 0.23776125 0.02514092
v -0.54496639 0.25249913 0.24477881
v -0.59883646 -0.28672752 0.02514092
v -0.54994045 0.24452271 0.26024368
v -0.57302651 0.24135327 0.02514092
v -0.53341549 0.24806192 0.26024368
v -0.55077737 0.25249913 0.24477881
v -0.58803556 -0.28672752 0.15017159
v -0.59544930 -0.28672752 0.06799148
v -0.58934621 0.24452271 0.13836582
v -0.58427738 0.25175959 0.15983712
v -0.59882067 0.24452271 0.02514092
v -0.59647570 0.25228784 0.03192981
v -0.52073551 0.23723302 0.26024368
v -0.58933832 -0.28672752 0.13836582
v -0.58980415 0.23269014 0.13836582
v -0.54146874 0.25175959 0.25775826
v -0.58961464 -0.27579298 0.13836582
v -0.54963255 0.24774498 0.26024368
v -0.58501167 -0.28672752 0.16186229
v -0.54925357 0.25212936 0.25660759
v -0.59899436 -0.27579298 0.02514092
v -0.59899436 0.23269014 0.02514092
v -0.59749420 -0.27579298 0.04375859
v -0.59749420 0.23269014 0.04375859
v -0.54155558 0.25175959 0.26024368
v -0.52315940 0.23908185 0.24477881
v -0.58801188 0.24452271 0.15017159
v -0.59495193 -0.27579298 0.07519461
v -0.59495193 0.23269014 0.07519461
v -0.58500377 0.24452271 0.16186229
v -0.55009049 -0.27579298 0.26024368
v -0.55009049 0.23269014 0.26024368
v -0.58828823 -0.27579298 0.15017159
v -0.58828823 0.23269014 0.15017159
v -0.59879699 -0.28672752 0.02567022
v -0.59804691 0.24785063 0.02514092
v -0.59672840 0.25244630 0.02514092
v -0.56584962 -0.28672752 0.02514092
f 65 56 41
f 65 41 60
f 65 60 26
f 65 26 58
f 65 58 43
f 65 43 37
f 65 37 72
f 65 72 71
f 65 71 38
f 65 38 18
f 65 18 53
f 65 53 32
f 65 32 45
f 65 45 7
f 65 7 56
f 56 7 41
f 41 24 28
f 41 28 29
f 41 29 46
f 41 46 60
f 41 7 24
f 60 46 25
f 60 25 50
f 60 50 21
f 60 21 26
f 26 21 58
f 7 45 16
f 7 16 24
f 24 77 29
f 24 29 28
f 24 16 44
f 24 44 36
f 24 36 78
f 24 78 42
f 24 42 61
f 24 61 62
f 24 62 40
f 24 40 51
f 24 51 76
f 24 76 77
f 46 2 25
f 46 29 12
f 46 12 2
f 25 2 50
f 50 2 12
f 50 12 67
f 50 67 70
f 50 70 21
f 21 70 58
f 58 70 34
f 58 34 43
f 45 32 66
f 45 66 13
f 45 13 36
f 45 36 44
f 45 44 16
f 77 52 29
f 77 76 52
f 29 52 12
f 12 52 39
f 12 39 35
f 12 35 27
f 12 27 6
f 12 6 67
f 67 6 49
f 67 49 55
f 67 55 74
f 67 74 70
f 70 37 34
f 70 74 5
f 70 5 37
f 34 37 43
f 32 53 13
f 32 13 66
f 13 53 22
f 13 22 78
f 13 78 36
f 52 76 39
f 76 6 27
f 76 27 35
f 76 35 39
f 76 51 6
f 6 51 23
f 6 23 15
f 6 15 9
f 6 9 31
f 6 31 55
f 6 55 49
f 55 31 69
f 55 69 68
f 55 68 57
f 55 57 73
f 55 73 74
f 74 73 4
f 74 4 5
f 37 5 11
f 37 11 72
f 5 4 10
f 5 10 11
f 53 18 17
f 53 17 22
f 22 17 18
f 22 18 38
f 22 38 33
f 22 33 3
f 22 3 59
f 22 59 47
f 22 47 54
f 22 54 30
f 22 30 48
f 22 48 1
f 22 1 8
f 22 8 14
f 22 14 75
f 22 75 42
f 22 42 78
f 51 40 23
f 23 40 15
f 15 40 9
f 9 40 62
f 9 62 31
f 31 62 64
f 31 64 20
f 31 20 69
f 69 20 19
f 69 19 68
f 68 19 30
f 68 30 57
f 57 30 54
f 57 54 47
f 57 47 73
f 73 47 59
f 73 59 4
f 11 10 71
f 11 71 72
f 4 59 3
f 4 3 10
f 42 75 61
f 62 61 63
f 62 63 64
f 64 63 19
f 64 19 20
f 19 63 30
f 30 63 61
f 30 61 48
f 10 3 71
f 71 3 33
f 71 33 38
f 75 14 61
f 61 14 8
f 61 8 1
f 61 1 48
@@ -0,0 +1,267 @@
# https://github.com/mikedh/trimesh
v -0.58372862 -0.28672752 -0.09986197
v -0.57268728 0.24449568 -0.15638410
v -0.55932148 -0.28672752 -0.18686482
v -0.55705584 0.23403707 -0.19185645
v -0.60035312 -0.27579354 0.00825438
v -0.60035312 0.23266369 0.00825438
v -0.55595243 0.24592186 -0.19185645
v -0.59175399 0.25284142 0.00825438
v -0.56781029 0.23266369 -0.16912866
v -0.56159449 -0.28672752 -0.18200066
v -0.57269465 -0.28672752 -0.15640533
v -0.57275351 -0.27579354 -0.15655401
v -0.57275351 0.23266369 -0.15655401
v -0.55688663 -0.28672752 -0.19185645
v -0.58449364 0.25210192 -0.08633150
v -0.56223442 -0.27579354 -0.18095985
v -0.56223442 0.23266369 -0.18095985
v -0.55706317 -0.27579354 -0.19185645
v -0.55706317 0.23266369 -0.19185645
v -0.59176136 0.25289426 -0.00357682
v -0.56154299 0.24449568 -0.18208564
v -0.57043637 0.24449568 -0.16231033
v -0.56107956 0.25199629 -0.17889947
v -0.59804339 0.24782342 0.02514092
v -0.59537317 0.24449568 -0.03628786
v -0.53033890 -0.28672752 -0.18091738
v -0.58543521 0.25273580 -0.07454278
v -0.55916700 0.24840443 -0.18677987
v -0.58845850 -0.27579354 -0.07454278
v -0.58845850 0.23266369 -0.07454278
v -0.57393047 0.25284142 -0.13363505
v -0.59154066 0.25247167 0.02514092
v -0.59921295 0.24449568 0.02006433
v -0.56585357 -0.28672752 0.02514092
v -0.57526924 0.24449568 -0.14546626
v -0.56823692 0.25284142 -0.13363505
v -0.58300039 -0.28303003 -0.10419512
v -0.58300039 0.23995305 -0.10419512
v -0.60061061 -0.27579354 -0.00357682
v -0.60061061 0.23266369 -0.00357682
v -0.60008836 0.24449568 0.00825438
v -0.57544578 -0.27579354 -0.14546626
v -0.57544578 0.23266369 -0.14546626
v -0.57312129 0.25241884 -0.14546626
v -0.59892606 0.23773453 0.02514092
v -0.57213559 0.25152087 -0.15462110
v -0.60032372 0.24449568 -0.00357682
v -0.59922035 -0.28672752 -0.01449466
v -0.59515247 0.25088703 -0.03507713
v -0.54534510 0.25215475 -0.19185645
v -0.57527661 -0.28672752 -0.14546626
v -0.52546924 0.23224114 -0.19185645
v -0.52546924 0.23255806 -0.19185645
v -0.57056875 -0.28672752 -0.16231033
v -0.59585130 0.25162654 -0.02723922
v -0.56301418 0.25236604 -0.16912866
v -0.59701353 0.24449568 -0.02723922
v -0.55197284 0.25220758 -0.19185645
v -0.58364770 0.25125678 -0.09597488
v -0.57074529 -0.28672752 -0.16186425
v -0.52989020 -0.28672752 -0.19185645
v -0.59719004 -0.28672752 -0.02632586
v -0.52814682 0.24085102 -0.19185645
v -0.59899225 -0.27579354 0.02514092
v -0.59899225 0.23266369 0.02514092
v -0.59672664 0.25247167 0.02514092
v -0.59910996 0.24449568 -0.01540802
v -0.59742547 0.25289426 -0.00357682
v -0.59922768 -0.28672752 0.02006433
v -0.56993615 0.23947763 0.02514092
v -0.57290062 -0.28672752 -0.15555570
v -0.59882307 0.24449568 0.02514092
v -0.57087038 0.23266369 -0.16245899
v -0.58383160 0.24412592 -0.09922474
v -0.59551288 -0.28672752 -0.03558691
v -0.59731509 0.25284142 0.00825438
v -0.55936561 -0.28361108 -0.18692855
v -0.55936561 0.24053406 -0.18692855
v -0.54594095 0.25220758 -0.19185645
v -0.60011042 -0.28672752 0.00825438
v -0.58901022 0.25104549 0.02514092
v -0.55681308 0.24449568 -0.19185645
v -0.56105750 -0.28672752 -0.18316892
v -0.59912469 -0.28672752 -0.01540802
v -0.60034578 -0.28672752 -0.00357682
v -0.59685902 0.25252450 -0.01540802
v -0.59691788 0.25257730 0.02006433
v -0.59930120 -0.27579354 -0.01540802
v -0.59930120 0.23266369 -0.01540802
v -0.59883780 -0.28672752 0.02514092
f 32 50 8
f 32 8 76
f 32 76 66
f 32 66 24
f 32 24 72
f 32 72 45
f 32 45 65
f 32 65 64
f 32 64 90
f 32 90 34
f 32 34 70
f 32 70 81
f 32 81 50
f 50 79 8
f 50 81 70
f 50 70 63
f 50 63 53
f 50 53 52
f 50 52 61
f 50 61 14
f 50 14 18
f 50 18 19
f 50 19 4
f 50 4 82
f 50 82 7
f 50 7 58
f 50 58 79
f 8 36 20
f 8 20 68
f 8 68 76
f 8 79 36
f 66 76 87
f 66 87 41
f 66 41 24
f 79 58 31
f 79 31 36
f 70 53 63
f 70 34 53
f 36 31 68
f 36 68 20
f 76 68 47
f 76 47 41
f 76 41 87
f 41 33 24
f 41 47 40
f 41 40 6
f 41 6 33
f 24 33 72
f 58 23 56
f 58 56 31
f 58 7 28
f 58 28 23
f 53 34 52
f 34 90 69
f 34 69 80
f 34 80 85
f 34 85 48
f 34 48 84
f 34 84 62
f 34 62 75
f 34 75 1
f 34 1 51
f 34 51 71
f 34 71 11
f 34 11 60
f 34 60 54
f 34 54 10
f 34 10 83
f 34 83 3
f 34 3 14
f 34 14 61
f 34 61 26
f 34 26 52
f 31 27 68
f 31 56 44
f 31 44 27
f 68 27 86
f 68 86 47
f 47 86 67
f 47 67 40
f 33 6 72
f 40 67 89
f 40 89 88
f 40 88 39
f 40 39 5
f 40 5 6
f 6 65 45
f 6 45 72
f 6 5 64
f 6 64 65
f 23 46 44
f 23 44 56
f 23 28 46
f 7 82 28
f 28 82 78
f 28 78 21
f 28 21 22
f 28 22 46
f 52 26 61
f 90 64 5
f 90 5 69
f 27 44 86
f 44 46 59
f 44 59 15
f 44 15 86
f 86 15 55
f 86 55 67
f 67 55 49
f 67 49 57
f 67 57 89
f 89 57 25
f 89 25 38
f 89 38 30
f 89 30 29
f 89 29 88
f 39 88 84
f 39 84 48
f 39 48 85
f 39 85 80
f 39 80 5
f 5 80 69
f 46 22 2
f 46 2 35
f 46 35 59
f 82 4 78
f 78 4 19
f 78 19 17
f 78 17 9
f 78 9 21
f 21 9 73
f 21 73 22
f 22 73 2
f 59 49 55
f 59 55 15
f 59 35 49
f 49 35 74
f 49 74 25
f 49 25 57
f 25 74 38
f 38 74 35
f 38 35 43
f 38 43 30
f 30 43 42
f 30 42 29
f 88 29 37
f 88 37 75
f 88 75 62
f 88 62 84
f 2 73 13
f 2 13 43
f 2 43 35
f 19 18 16
f 19 16 17
f 17 16 9
f 9 16 73
f 73 16 54
f 73 54 60
f 73 60 12
f 73 12 13
f 14 3 77
f 14 77 18
f 43 13 12
f 43 12 42
f 29 42 37
f 37 42 51
f 37 51 1
f 37 1 75
f 18 77 16
f 16 77 83
f 16 83 10
f 16 10 54
f 60 11 12
f 12 11 42
f 3 83 77
f 42 11 71
f 42 71 51
@@ -0,0 +1,258 @@
# https://github.com/mikedh/trimesh
v -0.42544383 0.24532996 -0.39374228
v -0.54804220 -0.28672752 -0.21064986
v -0.52545785 0.23256141 -0.19185647
v -0.52545785 0.23224484 -0.19185647
v -0.54534136 0.25213632 -0.19185647
v -0.47786999 0.25155592 -0.33034664
v -0.55196918 0.25218908 -0.19185647
v -0.55680751 0.24427469 -0.19185647
v -0.45531880 0.25208356 -0.35530571
v -0.50441447 0.24453852 -0.29922192
v -0.54779366 0.24453852 -0.21116367
v -0.42551012 -0.28672752 -0.39374228
v -0.51858146 -0.28672752 -0.20462255
v -0.50774496 0.25229460 -0.27558692
v -0.52282331 0.23915673 -0.19478120
v -0.52282331 0.23546334 -0.19478120
v -0.55655896 -0.27580568 -0.19290384
v -0.55655896 0.23266693 -0.19290384
v -0.42193109 0.25181973 -0.39374228
v -0.42343893 0.25213632 -0.38230024
v -0.55175380 0.25224184 -0.19280503
v -0.55687380 -0.28672752 -0.19185647
v -0.54905295 0.25181973 -0.20462255
v -0.51321294 -0.28672752 -0.28400542
v -0.52439741 0.25108107 -0.25902657
v -0.41235385 0.25192527 -0.39374228
v -0.42560951 0.23440810 -0.39374228
v -0.49550005 0.24453852 -0.31145446
v -0.42985136 0.24453852 -0.38862400
v -0.50998188 0.24453852 -0.28991417
v -0.50486187 -0.28672752 -0.29851051
v -0.50461333 -0.27580568 -0.29922192
v -0.42991762 -0.27580568 -0.38870305
v -0.42991762 0.23266693 -0.38870305
v -0.55703949 0.23403877 -0.19185647
v -0.55703949 -0.27580568 -0.19185647
v -0.38867592 0.23994817 -0.39374228
v -0.52814213 0.24084513 -0.19185647
v -0.51428995 0.25229460 -0.27558692
v -0.48206211 0.25203080 -0.32222459
v -0.54592128 0.25218908 -0.19185647
v -0.38779773 0.23150617 -0.39374228
v -0.55679094 0.24448574 -0.19185647
v -0.39263606 0.23915673 -0.38646998
v -0.39263606 0.23546334 -0.38646998
v -0.51011440 -0.27580568 -0.29003273
v -0.53602924 0.25087001 -0.23495680
v -0.42549356 0.24453852 -0.39374228
v -0.41616487 0.25150316 -0.38646998
v -0.45684321 -0.27580568 -0.35706450
v -0.45684321 0.23266693 -0.35706450
v -0.50443104 -0.28672752 -0.29922192
v -0.55594591 0.24591033 -0.19185647
v -0.42552669 -0.28598885 -0.39374228
v -0.50053720 -0.28672752 -0.30554568
v -0.50053720 0.24453852 -0.30552594
v -0.51319634 0.24453852 -0.28400542
v -0.50085200 -0.28672752 -0.30505165
v -0.50477901 0.23266693 -0.29922192
v -0.44393548 0.25203080 -0.36783466
v -0.54514251 0.25224184 -0.19280503
v -0.42226246 0.25176697 -0.39374228
v -0.48913731 0.25113383 -0.31785724
v -0.50060346 -0.27580568 -0.30560496
v -0.50060346 0.23266693 -0.30560496
v -0.50211130 0.25176697 -0.29922192
v -0.51326264 -0.27580568 -0.28412398
v -0.51326264 0.23266693 -0.28412398
v -0.53977399 -0.27580568 -0.22827733
v -0.53977399 0.23266693 -0.22827733
v -0.42562611 -0.27580568 -0.39374228
v -0.42562611 0.23266693 -0.39374228
v -0.41268526 0.25197803 -0.39374228
v -0.51028012 0.23266693 -0.29003273
v -0.42986792 -0.28672752 -0.38862400
v -0.46661926 0.25187249 -0.34283608
v -0.50999844 -0.28672752 -0.28991417
v -0.52988192 -0.28672752 -0.19185647
v -0.54766110 0.25060620 -0.21088702
v -0.38862619 -0.28672752 -0.39374228
v -0.50038808 0.25060620 -0.30534806
v -0.52479508 -0.27580568 -0.25983682
v -0.52479508 0.23266693 -0.25983682
v -0.42961938 0.25081725 -0.38832759
v -0.51276554 0.25123936 -0.28309635
v -0.42270985 0.25181973 -0.39289253
v -0.53748738 0.25197803 -0.22827733
f 41 61 21
f 41 21 7
f 41 7 53
f 41 53 43
f 41 43 8
f 41 8 35
f 41 35 36
f 41 36 22
f 41 22 78
f 41 78 4
f 41 4 3
f 41 3 38
f 41 38 5
f 41 5 61
f 61 14 39
f 61 39 21
f 61 5 26
f 61 26 73
f 61 73 20
f 61 20 14
f 7 21 53
f 5 49 26
f 5 38 15
f 5 15 37
f 5 37 49
f 14 20 39
f 21 39 87
f 21 87 23
f 21 23 53
f 26 49 37
f 26 37 42
f 26 42 80
f 26 80 12
f 26 12 54
f 26 54 71
f 26 71 72
f 26 72 27
f 26 27 48
f 26 48 1
f 26 1 62
f 26 62 19
f 26 19 73
f 73 19 20
f 20 19 60
f 20 60 9
f 20 9 39
f 53 23 43
f 38 3 15
f 15 3 4
f 15 4 16
f 15 16 45
f 15 45 44
f 15 44 37
f 37 44 42
f 39 9 40
f 39 40 66
f 39 66 85
f 39 85 87
f 87 85 23
f 23 85 25
f 23 25 47
f 23 47 79
f 23 79 43
f 19 62 86
f 19 86 9
f 19 9 60
f 9 86 62
f 9 62 84
f 9 84 76
f 9 76 66
f 9 66 40
f 43 79 8
f 16 4 78
f 16 78 13
f 16 13 80
f 16 80 45
f 44 45 42
f 42 45 80
f 66 76 6
f 66 6 63
f 66 63 81
f 66 81 85
f 85 81 30
f 85 30 57
f 85 57 25
f 25 57 47
f 47 57 79
f 79 57 11
f 79 11 8
f 62 1 84
f 84 1 81
f 84 81 63
f 84 63 6
f 84 6 76
f 8 11 35
f 78 22 2
f 78 2 24
f 78 24 77
f 78 77 31
f 78 31 52
f 78 52 58
f 78 58 55
f 78 55 75
f 78 75 12
f 78 12 80
f 78 80 13
f 81 1 48
f 81 48 29
f 81 29 28
f 81 28 56
f 81 56 10
f 81 10 30
f 30 10 74
f 30 74 57
f 57 74 68
f 57 68 11
f 11 68 83
f 11 83 70
f 11 70 18
f 11 18 35
f 35 18 17
f 35 17 36
f 22 36 17
f 22 17 2
f 12 75 54
f 48 27 29
f 29 27 51
f 29 51 28
f 28 51 65
f 28 65 56
f 56 65 59
f 56 59 10
f 10 59 74
f 74 59 32
f 74 32 46
f 74 46 67
f 74 67 68
f 68 67 82
f 68 82 83
f 83 82 69
f 83 69 70
f 70 69 17
f 70 17 18
f 2 17 69
f 2 69 82
f 2 82 24
f 75 55 54
f 54 50 33
f 54 33 71
f 54 55 50
f 27 72 34
f 27 34 51
f 51 34 33
f 51 33 50
f 51 50 64
f 51 64 65
f 65 64 59
f 59 64 32
f 46 32 31
f 46 31 77
f 46 77 24
f 46 24 67
f 67 24 82
f 55 58 64
f 55 64 50
f 33 34 72
f 33 72 71
f 64 58 32
f 32 58 52
f 32 52 31
@@ -0,0 +1,594 @@
# https://github.com/mikedh/trimesh
v -0.59487488 -0.28763768 0.07469646
v -0.59487488 -0.28672867 0.07469646
v -0.46682368 -0.29517261 0.39572515
v -0.54801408 -0.29417444 0.26402559
v -0.19142912 -0.28672867 0.59324526
v -0.53699833 -0.29491902 0.29210900
v -0.52947960 -0.29554201 0.30299133
v -0.58887157 -0.29808492 0.02514092
v -0.03306996 -0.28763768 0.62279137
v -0.03306996 -0.28672867 0.62284987
v -0.03306996 -0.29599015 0.61992456
v -0.03306996 -0.29849367 0.61138250
v -0.31347699 -0.28763768 0.53567421
v -0.31347699 -0.28672867 0.53567421
v -0.37613291 -0.29642322 0.48155513
v -0.44304358 -0.28672867 0.43088793
v -0.47061221 -0.29802470 0.37483812
v -0.33504228 -0.28672867 0.52303670
v -0.09222881 -0.29855621 0.59956401
v -0.28142049 -0.29528146 0.54837029
v -0.28142049 -0.29778500 0.54041329
v -0.00853217 -0.28672867 0.62162124
v -0.18595037 -0.28763768 0.59517600
v -0.18595037 -0.28672867 0.59517600
v -0.56007900 -0.29444077 0.22927235
v -0.51823067 -0.29635259 0.31592140
v -0.54830548 -0.28763768 0.26490318
v -0.54830548 -0.28672867 0.26490318
v -0.56584916 -0.28672867 0.02514092
v -0.34734034 -0.29428097 0.51162780
v -0.33480913 -0.29375062 0.52286119
v -0.35235281 -0.29816945 0.49308105
v -0.54154448 -0.29773637 0.25665369
v -0.54154448 -0.29851915 0.24483524
v -0.16316111 -0.29848673 0.58768709
v -0.58589903 -0.29605267 0.13835224
v -0.59668174 -0.29558138 0.02514092
v -0.44356813 -0.28672867 0.43041988
v -0.45359308 -0.29428213 0.41725579
v -0.49445057 -0.29624837 0.35108420
v -0.42328512 -0.29855736 0.42217039
v -0.42328512 -0.29795638 0.43398884
v -0.53880512 -0.29593340 0.28029055
v -0.56136127 -0.29546905 0.22113983
v -0.04490173 -0.28763768 0.62156273
v -0.04490173 -0.28672867 0.62162124
v -0.04490173 -0.29562654 0.61933942
v -0.04490173 -0.29813007 0.61138250
v -0.22231994 -0.29852495 0.56405019
v -0.59644856 -0.29539726 0.03192776
v -0.53857201 -0.28763768 0.29210900
v -0.53857201 -0.28672867 0.29210900
v -0.53606575 -0.28763768 0.29872032
v -0.53606575 -0.28672867 0.29877883
v -0.21631663 -0.29153889 0.58171938
v -0.31254445 -0.29438055 0.53526466
v -0.30502572 -0.29792743 0.52859487
v -0.30502572 -0.29542505 0.53678586
v -0.48244395 -0.29855505 0.35120122
v -0.13337770 -0.29096569 0.60535624
v -0.29325226 -0.29855736 0.52859487
v -0.10406056 -0.29585234 0.60793055
v -0.10406056 -0.29835588 0.59956401
v -0.02036392 -0.28672867 0.62249884
v -0.47067047 -0.29610131 0.38636400
v -0.43459234 -0.29582686 0.43369631
v -0.24038817 -0.29375410 0.57013492
v -0.41780639 -0.29392084 0.45206753
v -0.55337629 -0.29797259 0.22113983
v -0.55337629 -0.29855621 0.20932140
v -0.43033756 -0.29441761 0.44083415
v -0.36418459 -0.29840566 0.48126257
v -0.17499288 -0.28763768 0.59775032
v -0.17499288 -0.28672867 0.59775032
v -0.17499288 -0.29556517 0.59558555
v -0.17499288 -0.29806871 0.58768709
v -0.59347605 -0.29665250 0.02514092
v -0.42357652 -0.28672867 0.44767949
v -0.59598227 -0.29499312 0.04374619
v -0.26445969 -0.29398105 0.55849202
v -0.43686542 -0.28763768 0.43632909
v -0.43686542 -0.28672867 0.43632909
v -0.24015502 -0.28672867 0.57054450
v -0.58496652 -0.28763768 0.16187211
v -0.58496652 -0.28672867 0.16193062
v -0.43511689 -0.29824819 0.42217039
v -0.36395144 -0.29612330 0.49308105
v -0.44263559 -0.29480784 0.42954229
v -0.05673350 -0.29476500 0.61834482
v -0.05673350 -0.28763768 0.61951494
v -0.51205251 -0.29361629 0.33353206
v -0.23415171 -0.29742487 0.56405019
v -0.53210241 -0.28763768 0.30462953
v -0.53210241 -0.28672867 0.30468803
v -0.52534141 -0.29488313 0.31205993
v -0.26498425 -0.28763768 0.55872605
v -0.31936375 -0.28763768 0.53245636
v -0.31936375 -0.28672867 0.53245636
v -0.31685750 -0.29855736 0.51677642
v -0.49427572 -0.29817523 0.33938277
v -0.11589233 -0.29520851 0.60699445
v -0.47748977 -0.29451025 0.38221002
v -0.58799729 -0.28763768 0.15022918
v -0.58799729 -0.28672867 0.15022918
v -0.51181936 -0.28672867 0.33411713
v -0.59551598 -0.29450909 0.05556464
v -0.43639913 -0.28672867 0.43673867
v -0.59877993 -0.28763768 0.02514092
v -0.56520803 -0.29855736 0.17386606
v -0.56520803 -0.29814744 0.18568451
v -0.52586595 -0.28672867 0.31375665
v -0.31662435 -0.29605151 0.52888741
v -0.53589090 -0.29386758 0.29842777
v -0.18682466 -0.29855736 0.57586864
v -0.37601632 -0.29854347 0.46944415
v -0.35171168 -0.29568212 0.50454843
v -0.19183711 -0.28763768 0.59306974
v -0.19183711 -0.28672867 0.59306974
v -0.00340312 -0.29855736 0.02514092
v -0.00340312 -0.29855736 0.59956401
v -0.00340312 -0.28684679 0.02514092
v -0.00340312 -0.29555590 0.61916391
v -0.00340312 -0.28763768 0.62121170
v -0.00340312 -0.29805944 0.61138250
v -0.00340312 -0.28672867 0.59166559
v -0.00340312 -0.28672867 0.62121170
v -0.58426709 -0.29487153 0.15988286
v -0.58927956 -0.28763768 0.13835224
v -0.44694866 -0.29855736 0.39847498
v -0.44694866 -0.29785447 0.41029343
v -0.59504977 -0.29394285 0.06744158
v -0.44945488 -0.28763768 0.42380860
v -0.44945488 -0.28672867 0.42380860
v -0.24598348 -0.29855274 0.55223177
v -0.59831371 -0.28672867 0.03192776
v -0.12871494 -0.28672867 0.60635088
v -0.51788097 -0.29830493 0.30392745
v -0.44671552 -0.29574581 0.42158529
v -0.32868927 -0.29495259 0.52467488
v -0.32868927 -0.29745613 0.51677642
v -0.32868927 -0.28763768 0.52689816
v -0.21066303 -0.28672867 0.58446917
v -0.06582590 -0.28763768 0.61787677
v -0.06582590 -0.28672867 0.61787677
v -0.50610749 -0.29855736 0.31574588
v -0.50610749 -0.29735539 0.32756432
v -0.59481659 -0.29360935 0.07387738
v -0.33947191 -0.29511008 0.51601581
v -0.58380080 -0.29836515 0.02514092
v -0.59883823 -0.28672867 0.02514092
v -0.57703980 -0.29855736 0.12653379
v -0.57703980 -0.29855736 0.02514092
v -0.57703980 -0.29829566 0.15022918
v -0.57703980 -0.29855621 0.13835224
v -0.02123820 -0.29844736 0.61138250
v -0.02123820 -0.28763768 0.62255734
v -0.02123820 -0.28672867 0.62255734
v -0.02123820 -0.29594382 0.61980755
v -0.45400107 -0.28763768 0.41789936
v -0.45400107 -0.28672867 0.41789936
v -0.38784810 -0.29855736 0.45762570
v -0.19865641 -0.29596814 0.58575635
v -0.19865641 -0.29847168 0.57586864
v -0.00946471 -0.28763768 0.62167975
v -0.00946471 -0.29571917 0.61939793
v -0.00946471 -0.29822271 0.61138250
v -0.58531622 -0.29579212 0.15022918
v -0.57278501 -0.28763768 0.19621579
v -0.57278501 -0.28672867 0.19621579
v -0.33498402 -0.28763768 0.52303670
v -0.06460192 -0.29400306 0.61764274
v -0.57354271 -0.29564390 0.18568451
v -0.54923806 -0.29523282 0.25665369
v -0.47807261 -0.28672867 0.38302910
v -0.21270298 -0.28672867 0.58353307
v -0.58933786 -0.28672867 0.13835224
v -0.26958872 -0.29855736 0.54041329
v -0.45878040 -0.29852262 0.38665653
v -0.08039703 -0.29855736 0.59956401
v -0.20844822 -0.29510545 0.58353307
v -0.17411860 -0.28672867 0.59792583
v -0.25781524 -0.29512050 0.55995468
v -0.25781524 -0.29762404 0.55223177
v -0.18414355 -0.29466195 0.59459090
v -0.12550929 -0.29435971 0.60611682
v -0.43097870 -0.28763768 0.44136070
v -0.35981325 -0.29470248 0.50033591
v -0.44350987 -0.28763768 0.43041988
v -0.32798987 -0.28672867 0.52736624
v -0.28864778 -0.28672867 0.54749269
v -0.52971274 -0.29855736 0.26847212
v -0.52971274 -0.29843694 0.28029055
v -0.52971274 -0.29742255 0.29210900
v -0.37234442 -0.29501861 0.48910255
v -0.34052104 -0.29785333 0.50495797
v -0.15132934 -0.29855736 0.58768709
v -0.59738114 -0.28672867 0.04374619
v -0.05585922 -0.28672867 0.61969053
v -0.58484993 -0.28672867 0.16234016
f 126 22 123
f 126 123 122
f 126 122 124
f 126 124 120
f 126 120 119
f 126 119 121
f 126 121 125
f 126 125 29
f 126 29 150
f 126 150 135
f 126 135 197
f 126 197 2
f 126 2 176
f 126 176 104
f 126 104 85
f 126 85 199
f 126 199 169
f 126 169 28
f 126 28 52
f 126 52 54
f 126 54 94
f 126 94 111
f 126 111 105
f 126 105 174
f 126 174 160
f 126 160 133
f 126 133 38
f 126 38 16
f 126 16 82
f 126 82 107
f 126 107 78
f 126 78 18
f 126 18 189
f 126 189 98
f 126 98 14
f 126 14 190
f 126 190 83
f 126 83 175
f 126 175 142
f 126 142 118
f 126 118 5
f 126 5 24
f 126 24 74
f 126 74 181
f 126 181 136
f 126 136 144
f 126 144 198
f 126 198 46
f 126 46 10
f 126 10 157
f 126 157 64
f 126 64 22
f 22 64 156
f 22 156 164
f 22 164 123
f 123 164 122
f 125 121 29
f 64 157 156
f 156 157 10
f 156 10 9
f 156 9 158
f 156 158 165
f 156 165 122
f 156 122 164
f 122 165 124
f 121 119 152
f 121 152 149
f 121 149 8
f 121 8 77
f 121 77 37
f 121 37 108
f 121 108 150
f 121 150 29
f 10 46 45
f 10 45 9
f 9 45 47
f 9 47 11
f 9 11 158
f 158 11 155
f 158 155 166
f 158 166 124
f 158 124 165
f 124 166 120
f 119 120 179
f 119 179 196
f 119 196 114
f 119 114 177
f 119 177 61
f 119 61 99
f 119 99 161
f 119 161 41
f 119 41 129
f 119 129 145
f 119 145 191
f 119 191 109
f 119 109 151
f 119 151 152
f 150 108 147
f 150 147 135
f 46 198 90
f 46 90 45
f 45 90 171
f 45 171 89
f 45 89 47
f 47 89 101
f 47 101 75
f 47 75 62
f 47 62 48
f 47 48 11
f 11 48 12
f 11 12 155
f 155 12 120
f 155 120 166
f 120 12 179
f 152 151 149
f 108 37 50
f 108 50 79
f 108 79 106
f 108 106 147
f 147 128 176
f 147 176 1
f 147 1 197
f 147 197 135
f 147 106 131
f 147 131 167
f 147 167 103
f 147 103 128
f 198 144 143
f 198 143 90
f 90 143 171
f 171 143 60
f 171 60 185
f 171 185 89
f 89 185 101
f 101 185 75
f 75 185 184
f 75 184 162
f 75 162 76
f 75 76 62
f 62 76 48
f 48 63 12
f 48 76 63
f 12 63 35
f 12 35 19
f 12 19 179
f 179 19 196
f 149 151 154
f 149 154 8
f 151 109 154
f 37 77 36
f 37 36 50
f 50 36 167
f 50 167 79
f 79 167 106
f 106 167 131
f 128 103 176
f 176 2 1
f 176 103 104
f 1 2 197
f 167 153 172
f 167 172 127
f 167 127 103
f 167 36 153
f 103 127 84
f 103 84 85
f 103 85 104
f 144 136 143
f 143 136 60
f 60 136 73
f 60 73 184
f 60 184 185
f 184 73 23
f 184 23 117
f 184 117 55
f 184 55 67
f 184 67 180
f 184 180 162
f 162 92 163
f 162 163 76
f 162 180 58
f 162 58 183
f 162 183 92
f 76 163 35
f 76 35 63
f 35 196 19
f 35 163 114
f 35 114 196
f 8 154 153
f 8 153 36
f 8 36 77
f 154 109 153
f 109 191 70
f 109 70 153
f 153 70 34
f 153 34 192
f 153 192 110
f 153 110 172
f 172 110 69
f 172 69 33
f 172 33 43
f 172 43 44
f 172 44 127
f 127 44 173
f 127 173 25
f 127 25 4
f 127 4 84
f 84 168 199
f 84 199 85
f 84 4 113
f 84 113 168
f 136 181 73
f 73 181 74
f 73 74 24
f 73 24 23
f 23 24 5
f 23 5 117
f 117 5 118
f 117 118 142
f 117 142 55
f 55 142 175
f 55 175 83
f 55 83 96
f 55 96 13
f 55 13 67
f 67 80 180
f 67 13 56
f 67 56 80
f 180 80 56
f 180 56 182
f 180 182 20
f 180 20 58
f 92 183 163
f 163 183 21
f 163 21 57
f 163 57 49
f 163 49 114
f 58 56 112
f 58 112 57
f 58 57 21
f 58 21 183
f 58 20 56
f 114 49 134
f 114 134 177
f 191 34 70
f 191 145 192
f 191 192 34
f 192 145 137
f 192 137 193
f 192 193 33
f 192 33 69
f 192 69 110
f 33 193 43
f 43 193 6
f 43 6 173
f 43 173 44
f 173 6 25
f 25 6 4
f 4 6 113
f 168 27 28
f 168 28 169
f 168 169 199
f 168 113 27
f 113 6 7
f 113 7 95
f 113 95 91
f 113 91 93
f 113 93 53
f 113 53 51
f 113 51 27
f 83 190 13
f 83 13 96
f 13 190 14
f 13 14 98
f 13 98 97
f 13 97 56
f 56 97 31
f 56 31 139
f 56 139 112
f 56 20 182
f 57 140 99
f 57 99 61
f 57 61 177
f 57 177 134
f 57 134 49
f 57 112 140
f 112 139 140
f 145 129 59
f 145 59 137
f 137 59 178
f 137 178 100
f 137 100 146
f 137 146 193
f 193 146 26
f 193 26 7
f 193 7 6
f 27 51 52
f 27 52 28
f 7 26 95
f 95 26 40
f 95 40 65
f 95 65 3
f 95 3 102
f 95 102 91
f 91 111 94
f 91 94 93
f 91 102 39
f 91 39 159
f 91 159 111
f 93 94 54
f 93 54 53
f 53 54 51
f 51 54 52
f 97 98 189
f 97 189 141
f 97 141 31
f 31 30 148
f 31 148 139
f 31 141 170
f 31 170 18
f 31 18 186
f 31 186 68
f 31 68 30
f 139 148 140
f 140 148 116
f 140 116 87
f 140 87 15
f 140 15 195
f 140 195 99
f 99 195 32
f 99 32 72
f 99 72 115
f 99 115 161
f 129 86 178
f 129 178 59
f 129 41 86
f 178 86 130
f 178 130 17
f 178 17 100
f 100 17 146
f 146 17 130
f 146 130 40
f 146 40 26
f 40 130 65
f 65 130 138
f 65 138 3
f 3 138 39
f 3 39 102
f 111 159 105
f 39 138 88
f 39 88 132
f 39 132 159
f 159 160 174
f 159 174 105
f 159 132 133
f 159 133 160
f 189 18 170
f 189 170 141
f 30 68 71
f 30 71 187
f 30 187 116
f 30 116 148
f 18 78 186
f 186 78 107
f 186 107 81
f 186 81 68
f 68 81 71
f 116 187 194
f 116 194 87
f 87 194 66
f 87 66 15
f 15 66 42
f 15 42 195
f 195 42 32
f 32 42 86
f 32 86 72
f 72 86 115
f 115 86 161
f 161 86 41
f 86 138 130
f 86 42 66
f 86 66 138
f 138 66 88
f 88 66 194
f 88 194 71
f 88 71 188
f 88 188 132
f 132 188 38
f 132 38 133
f 71 81 188
f 71 194 187
f 107 82 81
f 81 82 16
f 81 16 188
f 188 16 38
@@ -0,0 +1,615 @@
# https://github.com/mikedh/trimesh
v -0.52970495 -0.29762404 -0.22831561
v -0.52970495 -0.29855274 -0.21644574
v -0.26962174 -0.29491902 -0.50754836
v -0.26962174 -0.29742255 -0.50021699
v -0.26962174 -0.28763768 -0.50906120
v -0.43510269 -0.29855736 -0.35830226
v -0.59690237 -0.29571917 0.02007878
v -0.54776060 -0.28672867 -0.21120903
v -0.56581628 -0.28672867 0.02508273
v -0.00387057 -0.28672867 -0.56922514
v -0.58287855 -0.29095411 -0.10391476
v -0.55179246 -0.29602141 -0.19282239
v -0.52438761 -0.29418949 -0.25903761
v -0.20680676 -0.29444077 -0.53058987
v -0.47057122 -0.29612330 -0.33444617
v -0.40705505 -0.29480784 -0.41317131
v -0.37596895 -0.29855736 -0.41747705
v -0.11588574 -0.29605267 -0.55642428
v -0.11588574 -0.29855621 -0.54752191
v -0.11588574 -0.28763768 -0.55979907
v -0.02128348 -0.29499312 -0.56649043
v -0.02128348 -0.28672867 -0.56788683
v -0.52473819 -0.28763768 -0.25973584
v -0.52473819 -0.28672867 -0.25973584
v -0.29340378 -0.29635259 -0.48875444
v -0.60029144 -0.28763768 -0.00360277
v -0.05137623 -0.29360935 -0.56532665
v -0.39536855 -0.28763768 -0.42451748
v -0.39536855 -0.28672867 -0.42451748
v -0.27669207 -0.28672867 -0.50626827
v -0.57522388 -0.28763768 -0.14551747
v -0.57288659 -0.28672867 -0.15558358
v -0.57054930 -0.28763768 -0.16233313
v -0.57054930 -0.28672867 -0.16233313
v -0.17373394 -0.28763768 -0.54327435
v -0.59696081 -0.28763768 -0.02722612
v -0.24595656 -0.29855736 -0.50021699
v -0.46659783 -0.29501744 -0.34282491
v -0.15135429 -0.29855736 -0.53571019
v -0.58293699 -0.28672867 -0.10408933
v -0.12862403 -0.28672867 -0.55828623
v -0.31683522 -0.29817523 -0.46478194
v -0.50037183 -0.29375062 -0.30535335
v -0.59731135 -0.29594382 0.00820891
v -0.53747646 -0.29512050 -0.22831561
v -0.50639037 -0.29605036 -0.28714125
v -0.55921338 -0.29152615 -0.18682926
v -0.17209784 -0.29467353 -0.54269246
v -0.56523192 -0.29855736 -0.12183593
v -0.56523192 -0.29848673 -0.13370580
v -0.56523192 -0.29806871 -0.14551747
v -0.42984375 -0.28763768 -0.38861699
v -0.42984375 -0.28672867 -0.38861699
v -0.59999926 -0.28672867 0.00913988
v -0.47062966 -0.29816945 -0.32286725
v -0.51275952 -0.29438055 -0.28306826
v -0.28142511 -0.29830493 -0.48840531
v -0.50440365 -0.28763768 -0.29918569
v -0.50440365 -0.28672867 -0.29918569
v -0.56324524 -0.29596814 -0.16914083
v -0.18682284 -0.29855621 -0.52389854
v -0.60034987 -0.28672867 -0.00360277
v -0.58363818 -0.29435971 -0.09600152
v -0.57528232 -0.28672867 -0.14551747
v -0.39910823 -0.29574581 -0.41724430
v -0.59701924 -0.28672867 -0.02722612
v -0.35966628 -0.29451025 -0.44802446
v -0.48202401 -0.29568096 -0.32222720
v -0.32858015 -0.29624837 -0.46495651
v -0.40179614 -0.28672867 -0.41951353
v -0.41383325 -0.28763768 -0.40735275
v -0.41383325 -0.28672867 -0.40735275
v -0.50609819 -0.29855736 -0.26375064
v -0.50609819 -0.29792743 -0.27556232
v -0.13937562 -0.28763768 -0.55549332
v -0.13937562 -0.28672867 -0.55549332
v -0.59736986 -0.29599015 -0.00360277
v -0.41149592 -0.29855736 -0.38198382
v -0.41149592 -0.29795638 -0.39379550
v -0.39478423 -0.29428213 -0.42405203
v -0.42955157 -0.29392084 -0.38832604
v -0.41885845 -0.28763768 -0.40147600
v -0.22229139 -0.29851915 -0.51208683
v -0.60005776 -0.28763768 0.00820891
v -0.60005776 -0.28672867 0.00820891
v -0.41418383 -0.28672867 -0.40694542
v -0.12768911 -0.29579212 -0.55584242
v -0.12768911 -0.29829566 -0.54752191
v -0.12768911 -0.28763768 -0.55851898
v -0.12768911 -0.28672867 -0.55851898
v -0.03308684 -0.29450909 -0.56602492
v -0.13738891 -0.29487153 -0.55473690
v -0.59538311 -0.28672867 -0.03630307
v -0.57265285 -0.28763768 -0.15645638
v -0.57265285 -0.28672867 -0.15645638
v -0.56195973 -0.28672867 -0.18118527
v -0.32460676 -0.29471059 -0.47193878
v -0.59906436 -0.28763768 -0.01541444
v -0.54156675 -0.29852379 -0.19282239
v -0.54156675 -0.29742487 -0.20463407
v -0.59672706 -0.29558138 0.02508273
v -0.44696449 -0.29854347 -0.34649058
v -0.35236222 -0.29802470 -0.44110042
v -0.28049019 -0.29554201 -0.49998423
v -0.48909435 -0.29428097 -0.31786326
v -0.41120378 -0.29582686 -0.40508351
v -0.16315766 -0.29564390 -0.54403078
v -0.16315766 -0.29814744 -0.53571019
v -0.51316853 -0.28763768 -0.28394106
v -0.51316853 -0.28672867 -0.28399925
v -0.24239218 -0.28763768 -0.51883637
v -0.24239218 -0.28672867 -0.51883637
v -0.39583600 -0.28672867 -0.42416838
v -0.57703532 -0.29855736 -0.05090768
v -0.57703532 -0.29855736 0.02508273
v -0.57703532 -0.29855621 -0.06271934
v -0.57703532 -0.29835588 -0.07453102
v -0.58539115 -0.29585234 -0.07453102
v -0.27014763 -0.28672867 -0.50888664
v -0.28218474 -0.28763768 -0.50260260
v -0.28218474 -0.28672867 -0.50260260
v -0.53624938 -0.28763768 -0.23547243
v -0.48243302 -0.29785333 -0.31099737
v -0.38783076 -0.29785447 -0.41747705
v -0.05219428 -0.28763768 -0.56538487
v -0.05219428 -0.28672867 -0.56538487
v -0.28954723 -0.29488313 -0.49585305
v -0.59877218 -0.28763768 0.02508273
v -0.52590684 -0.29528146 -0.25193896
v -0.10402394 -0.29855736 -0.54752191
v -0.00340312 -0.29855736 -0.54752191
v -0.00340312 -0.29855736 0.02508273
v -0.00340312 -0.28684679 0.02508273
v -0.00340312 -0.28763768 -0.56922514
v -0.00340312 -0.28672867 -0.56922514
v -0.00340312 -0.28672867 -0.53966684
v -0.00340312 -0.29556053 -0.56718863
v -0.00340312 -0.29806407 -0.55939175
v -0.59912279 -0.28672867 -0.01541444
v -0.00942166 -0.29539726 -0.56695587
v -0.00942166 -0.28672867 -0.56881785
v -0.54764373 -0.29375293 -0.21091811
v -0.45906003 -0.29642322 -0.34666514
v -0.29124178 -0.28672867 -0.49637676
v -0.50218320 -0.29495259 -0.29918569
v -0.31163471 -0.28672867 -0.48235399
v -0.51790159 -0.29855736 -0.24012729
v -0.51790159 -0.29778500 -0.25193896
v -0.56102479 -0.29510545 -0.17891602
v -0.56102479 -0.28672867 -0.18322175
v -0.57072461 -0.28672867 -0.16192582
v -0.25781836 -0.29593340 -0.50935211
v -0.25781836 -0.29843694 -0.50021699
v -0.59345483 -0.29665250 0.02508273
v -0.42329929 -0.29855736 -0.37017213
v -0.32869702 -0.29855621 -0.45291207
v -0.40793155 -0.28763768 -0.41404407
v -0.40793155 -0.28672867 -0.41404407
v -0.11676223 -0.28672867 -0.55974085
v -0.27622462 -0.28763768 -0.50655921
v -0.27622462 -0.28672867 -0.50655921
v -0.04489021 -0.29394285 -0.56555941
v -0.59883068 -0.28672867 0.02508273
v -0.50054714 -0.28672867 -0.30552791
v -0.58445625 -0.29520851 -0.08640090
v -0.36381497 -0.29610131 -0.44121676
v -0.59514937 -0.29400306 -0.03508117
v -0.55337012 -0.29855736 -0.15732915
v -0.55337012 -0.29847168 -0.16914083
v -0.29328691 -0.29855736 -0.47659362
v -0.40127025 -0.28763768 -0.41997901
v -0.40127025 -0.28672867 -0.41997901
v -0.45876785 -0.29840566 -0.33467893
v -0.19868464 -0.29546905 -0.53186996
v -0.19868464 -0.29797259 -0.52389854
v -0.36416559 -0.29852262 -0.42928870
v -0.49353519 -0.29511008 -0.30995000
v -0.41932590 -0.28672867 -0.40095233
v -0.59918123 -0.28763768 0.02007878
v -0.59684394 -0.29562654 -0.01541444
v -0.51427878 -0.29542389 -0.27556232
v -0.41833252 -0.29441761 -0.40083596
v -0.59585060 -0.29476500 -0.02722612
v -0.58381345 -0.28726250 -0.09925991
v -0.58381345 -0.29836515 0.02508273
v -0.57312033 -0.29556517 -0.14551747
v -0.27593246 -0.29386758 -0.50638465
v -0.49423642 -0.29855736 -0.28737401
v -0.49423642 -0.29745497 -0.29918569
v -0.58883865 -0.29844736 0.00820891
v -0.58883865 -0.29808492 0.02508273
v -0.58883865 -0.29822271 0.02007878
v -0.58883865 -0.29849367 -0.00360277
v -0.58883865 -0.29813007 -0.01541444
v -0.57212696 -0.29466078 -0.15465263
v -0.23415319 -0.29523282 -0.51970914
v -0.23415319 -0.29773637 -0.51208683
v -0.37322261 -0.29517261 -0.43731834
v -0.39963412 -0.29824935 -0.40560718
v -0.30503186 -0.29735539 -0.47659362
v -0.50995474 -0.28763768 -0.28987600
v -0.50995474 -0.28672867 -0.28987600
v -0.24151568 -0.29417444 -0.51848728
v -0.31105039 -0.29361745 -0.48252856
v -0.20809228 -0.28672867 -0.53105535
v -0.47787531 -0.29470248 -0.33031499
f 10 135 134
f 10 134 141
f 10 141 22
f 10 22 126
f 10 126 159
f 10 159 90
f 10 90 41
f 10 41 76
f 10 76 205
f 10 205 112
f 10 112 119
f 10 119 161
f 10 161 30
f 10 30 121
f 10 121 144
f 10 144 146
f 10 146 29
f 10 29 113
f 10 113 172
f 10 172 70
f 10 70 158
f 10 158 72
f 10 72 86
f 10 86 178
f 10 178 53
f 10 53 164
f 10 164 59
f 10 59 202
f 10 202 110
f 10 110 24
f 10 24 8
f 10 8 150
f 10 150 96
f 10 96 34
f 10 34 151
f 10 151 95
f 10 95 32
f 10 32 64
f 10 64 40
f 10 40 93
f 10 93 66
f 10 66 139
f 10 139 62
f 10 62 85
f 10 85 54
f 10 54 163
f 10 163 9
f 10 9 136
f 10 136 135
f 135 136 133
f 135 133 132
f 135 132 131
f 135 131 138
f 135 138 137
f 135 137 134
f 134 137 140
f 134 140 21
f 134 21 91
f 134 91 27
f 134 27 141
f 141 27 22
f 136 9 133
f 137 138 18
f 137 18 140
f 140 18 87
f 140 87 21
f 21 87 91
f 91 162 27
f 91 87 162
f 27 125 22
f 27 162 87
f 27 87 89
f 27 89 20
f 27 20 125
f 22 125 126
f 133 9 163
f 133 163 128
f 133 128 101
f 133 101 154
f 133 154 191
f 133 191 185
f 133 185 115
f 133 115 132
f 138 131 130
f 138 130 19
f 138 19 88
f 138 88 18
f 18 88 87
f 87 88 108
f 87 108 107
f 87 107 92
f 87 92 89
f 125 20 159
f 125 159 126
f 89 90 159
f 89 159 20
f 89 92 75
f 89 75 41
f 89 41 90
f 132 115 114
f 132 114 49
f 132 49 168
f 132 168 147
f 132 147 73
f 132 73 188
f 132 188 6
f 132 6 155
f 132 155 78
f 132 78 17
f 132 17 170
f 132 170 37
f 132 37 39
f 132 39 130
f 132 130 131
f 163 54 84
f 163 84 179
f 163 179 128
f 130 39 19
f 19 39 88
f 88 39 61
f 88 61 83
f 88 83 153
f 88 153 108
f 107 108 175
f 107 175 197
f 107 197 152
f 107 152 174
f 107 174 92
f 92 174 196
f 92 196 48
f 92 48 75
f 75 76 41
f 75 48 14
f 75 14 203
f 75 203 187
f 75 187 35
f 75 35 205
f 75 205 76
f 115 185 190
f 115 190 193
f 115 193 114
f 54 85 84
f 84 85 62
f 84 62 26
f 84 26 44
f 84 44 7
f 84 7 101
f 84 101 179
f 179 101 128
f 39 37 61
f 61 37 83
f 83 37 153
f 153 37 170
f 153 170 57
f 153 57 4
f 153 4 197
f 153 197 175
f 153 175 108
f 197 4 152
f 152 4 3
f 152 3 196
f 152 196 174
f 196 3 48
f 48 3 14
f 14 3 203
f 203 3 187
f 187 3 104
f 187 104 127
f 187 127 204
f 187 204 120
f 187 120 160
f 187 160 5
f 187 5 111
f 187 111 35
f 35 111 205
f 185 191 192
f 185 192 190
f 190 192 44
f 190 44 77
f 190 77 193
f 193 77 194
f 193 194 117
f 193 117 50
f 193 50 116
f 193 116 114
f 114 116 49
f 62 139 98
f 62 98 26
f 26 98 180
f 26 180 77
f 26 77 44
f 44 192 191
f 44 191 154
f 44 154 7
f 7 154 101
f 170 17 156
f 170 156 57
f 57 156 176
f 57 176 42
f 57 42 200
f 57 200 4
f 4 104 3
f 4 200 25
f 4 25 104
f 205 111 112
f 104 25 127
f 127 25 69
f 127 69 166
f 127 166 198
f 127 198 97
f 127 97 204
f 204 146 120
f 204 97 67
f 204 67 80
f 204 80 28
f 204 28 146
f 120 146 144
f 120 144 121
f 120 121 30
f 120 30 160
f 160 30 161
f 160 161 119
f 160 119 5
f 5 119 111
f 111 119 112
f 77 180 194
f 194 118 51
f 194 51 117
f 194 180 118
f 117 51 50
f 50 51 169
f 50 169 168
f 50 168 49
f 50 49 116
f 139 66 36
f 139 36 98
f 98 36 167
f 98 167 183
f 98 183 180
f 180 183 165
f 180 165 186
f 180 186 118
f 17 176 156
f 17 78 199
f 17 199 176
f 176 199 124
f 176 124 103
f 176 103 42
f 42 103 200
f 200 103 124
f 200 124 69
f 200 69 25
f 69 124 166
f 166 124 65
f 166 65 198
f 198 67 97
f 198 65 80
f 198 80 67
f 146 28 29
f 80 65 16
f 80 16 171
f 80 171 28
f 28 171 113
f 28 113 29
f 118 186 51
f 51 186 60
f 51 60 169
f 169 60 100
f 169 100 1
f 169 1 148
f 169 148 74
f 169 74 99
f 169 99 168
f 168 99 2
f 168 2 147
f 66 93 167
f 66 167 36
f 167 93 11
f 167 11 63
f 167 63 183
f 183 63 165
f 165 63 186
f 186 63 195
f 186 195 60
f 78 155 199
f 199 155 6
f 199 6 102
f 199 102 173
f 199 173 55
f 199 55 79
f 199 79 106
f 199 106 65
f 199 65 124
f 65 106 16
f 16 106 38
f 16 38 182
f 16 182 157
f 16 157 171
f 171 157 70
f 171 70 172
f 171 172 113
f 60 12 1
f 60 1 100
f 60 195 149
f 60 149 129
f 60 129 181
f 60 181 12
f 1 181 148
f 1 12 181
f 148 181 74
f 74 73 147
f 74 147 2
f 74 2 99
f 74 181 46
f 74 46 189
f 74 189 188
f 74 188 73
f 93 40 184
f 93 184 11
f 11 184 40
f 11 40 64
f 11 64 31
f 11 31 195
f 11 195 63
f 195 31 94
f 195 94 33
f 195 33 47
f 195 47 142
f 195 142 149
f 6 188 102
f 102 188 173
f 173 188 55
f 55 188 123
f 55 123 79
f 79 123 143
f 79 143 106
f 106 143 15
f 106 15 38
f 38 15 68
f 38 68 206
f 38 206 182
f 182 81 157
f 182 206 105
f 182 105 43
f 182 43 81
f 157 158 70
f 157 81 71
f 157 71 72
f 157 72 158
f 149 45 129
f 149 142 13
f 149 13 56
f 149 56 45
f 129 56 181
f 129 45 56
f 181 56 46
f 46 56 145
f 46 145 189
f 189 145 177
f 189 177 68
f 189 68 15
f 189 15 143
f 189 143 123
f 189 123 188
f 64 32 94
f 64 94 31
f 94 32 95
f 94 95 151
f 94 151 33
f 33 151 34
f 33 34 96
f 33 96 47
f 47 96 150
f 47 150 122
f 47 122 23
f 47 23 142
f 142 23 109
f 142 109 13
f 68 177 206
f 206 177 105
f 81 52 82
f 81 82 71
f 81 43 52
f 105 177 43
f 43 177 145
f 43 145 56
f 43 56 201
f 43 201 58
f 43 58 164
f 43 164 52
f 71 82 178
f 71 178 86
f 71 86 72
f 13 109 56
f 56 109 201
f 150 8 122
f 122 8 24
f 122 24 23
f 23 24 110
f 23 110 109
f 109 110 201
f 52 53 178
f 52 178 82
f 52 164 53
f 201 110 202
f 201 202 59
f 201 59 58
f 58 59 164
@@ -0,0 +1,399 @@
# https://github.com/mikedh/trimesh
v -0.03307775 0.25138982 -0.56606608
v -0.38863613 0.23992702 -0.39374231
v -0.29072634 0.24452271 -0.49670665
v -0.38776820 0.23152802 -0.39374231
v -0.28212979 -0.28672752 -0.50262273
v -0.27010289 -0.28672752 -0.50889999
v -0.24232941 0.24452271 -0.51882323
v -0.13983205 -0.28672752 -0.55535175
v -0.27667429 -0.28672752 -0.50630309
v -0.24146148 0.25107288 -0.51851367
v -0.33164260 -0.27579298 -0.46865671
v -0.33164260 0.23269014 -0.46865671
v -0.41264860 0.25197088 -0.39374231
v -0.38859479 -0.28672752 -0.39374231
v -0.05221335 -0.28672752 -0.56541258
v -0.41120209 0.25207653 -0.40514456
v -0.28208847 0.24452271 -0.50260553
v -0.05134543 0.25049182 -0.56534378
v -0.39545550 -0.27579298 -0.42459547
v -0.39545550 0.23269014 -0.42459547
v -0.28952779 0.25175959 -0.49586394
v -0.41835209 0.25128417 -0.40086225
v -0.20678597 0.25133700 -0.53060386
v -0.25774533 0.25260477 -0.50336227
v -0.25774533 0.25260477 -0.50915799
v -0.42550208 -0.28672752 -0.39374231
v -0.13950142 -0.27579298 -0.55557534
v -0.13950142 0.23269014 -0.55557534
v -0.36652477 -0.27579298 -0.44459674
v -0.36652477 0.23269014 -0.44459674
v -0.02125748 -0.27579298 -0.56799228
v -0.02125748 0.23269014 -0.56799228
v -0.02125748 0.24452271 -0.56787188
v -0.02125748 0.25186523 -0.56653047
v -0.33817268 0.25207653 -0.46120999
v -0.05217202 0.24452271 -0.56541258
v -0.40801970 -0.27579298 -0.41417349
v -0.40801970 0.23269014 -0.41417349
v -0.41231794 0.25191806 -0.39374231
v -0.20819118 -0.27579298 -0.53111981
v -0.20819118 0.23269014 -0.53111981
v -0.41888936 0.24452271 -0.40149859
v -0.42546078 0.24452271 -0.39374231
v -0.40140693 -0.27579298 -0.42008961
v -0.40140693 0.23269014 -0.42008961
v -0.05270929 -0.27579298 -0.56544697
v -0.39537282 -0.28672752 -0.42454388
v -0.39537282 0.24452271 -0.42454388
v -0.24249473 -0.27579298 -0.51889203
v -0.24249473 0.23269014 -0.51889203
v -0.17206912 0.25154829 -0.54269405
v -0.39479424 0.25117852 -0.42411392
v -0.42541944 0.24531506 -0.39374231
v -0.16318326 0.25249913 -0.54403550
v -0.12768115 -0.28672752 -0.55853340
v -0.12768115 -0.27579298 -0.55879135
v -0.12768115 0.25265759 -0.55585050
v -0.12768115 0.23269014 -0.55879135
v -0.12768115 0.24452271 -0.55851620
v -0.27626099 -0.27579298 -0.50664708
v -0.27626099 0.23269014 -0.50664708
v -0.00943724 -0.28672752 -0.53634798
v -0.00943724 -0.28672752 -0.56881778
v -0.00943724 -0.27579298 -0.56893818
v -0.00943724 0.23269014 -0.56893818
v -0.00943724 0.24452271 -0.56880058
v -0.00943724 0.25228784 -0.56697758
v -0.29085033 -0.27579298 -0.49679261
v -0.29085033 0.23269014 -0.49679261
v -0.40793701 -0.28672752 -0.41408749
v -0.14541155 -0.27579298 -0.55347718
v -0.14541155 0.23269014 -0.55347718
v -0.40706911 0.25170677 -0.41319323
v -0.42223708 0.25175959 -0.39374231
v -0.32461659 0.25160111 -0.47195873
v -0.41392982 -0.27579298 -0.40748347
v -0.41392982 0.23269014 -0.40748347
v -0.00340310 -0.28672752 -0.56928210
v -0.00340310 -0.28672752 -0.53966719
v -0.00340310 0.25080875 -0.55911811
v -0.00340310 0.24832604 -0.56837067
v -0.00340310 -0.27579298 -0.56941969
v -0.00340310 0.23850079 -0.56935090
v -0.00340310 0.23269014 -0.56941969
v -0.00340310 0.24452271 -0.56926490
v -0.00340310 0.23945162 -0.54042390
v -0.00340310 0.25244630 -0.56720118
v -0.00340310 0.25244630 -0.56202457
v -0.19864404 0.25234065 -0.53191091
v -0.40132432 -0.28672752 -0.42000361
v -0.42479952 -0.28672752 -0.39456782
v -0.42479952 0.24452271 -0.39455062
v -0.13937743 -0.28672752 -0.55550654
v -0.13937743 0.24452271 -0.55550654
v -0.27621965 -0.28672752 -0.50659548
v -0.04489801 0.25080875 -0.56560177
v -0.04489801 -0.27579298 -0.56608328
v -0.04489801 0.23269014 -0.56608328
v -0.04489801 0.24452271 -0.56599729
v -0.37326152 0.25202371 -0.43733917
v -0.40789570 0.24452271 -0.41408749
v -0.20806719 -0.28672752 -0.53106821
v -0.20806719 0.24452271 -0.53105101
v -0.13735228 0.25175959 -0.55476704
v -0.23410482 0.25212936 -0.51975193
v -0.23410482 -0.27579298 -0.52188448
v -0.23410482 0.23269014 -0.52188448
v -0.42190641 0.25181242 -0.39374231
v -0.42562608 -0.27579298 -0.39374231
v -0.42562608 0.23269014 -0.39374231
v -0.03398699 -0.28672752 -0.56687439
v -0.11586089 -0.28672752 -0.55984045
v -0.11586089 -0.27579298 -0.56011560
v -0.11586089 0.25292171 -0.55067392
v -0.11586089 0.25292171 -0.55640084
v -0.11586089 0.23269014 -0.56030476
v -0.11586089 0.24452271 -0.55984045
v -0.27617832 0.24452271 -0.50659548
v -0.27588902 0.25075594 -0.50642349
v -0.40128294 0.24452271 -0.41998641
v -0.39582747 -0.28672752 -0.42419992
v -0.28217112 -0.27579298 -0.50270872
v -0.28217112 0.23269014 -0.50270872
v -0.31709462 0.24452271 -0.47857995
v -0.38780950 0.25202371 -0.42619488
v -0.24237074 -0.28672752 -0.51884043
v -0.26956560 0.25181242 -0.50754138
v -0.26956560 -0.27579298 -0.50922675
v -0.26956560 0.23269014 -0.50922675
v -0.26956560 0.24452271 -0.50907199
v -0.41384714 -0.28672752 -0.40741467
v -0.41384714 0.24452271 -0.40741467
v -0.31163912 -0.28672752 -0.48234631
v -0.31106051 0.25049182 -0.48256990
f 109 76 91
f 109 91 26
f 109 26 14
f 109 14 4
f 109 4 2
f 109 2 39
f 109 39 13
f 109 13 108
f 109 108 74
f 109 74 53
f 109 53 43
f 109 43 110
f 109 110 77
f 109 77 76
f 76 37 131
f 76 131 91
f 76 77 38
f 76 38 37
f 91 131 70
f 91 70 90
f 91 90 121
f 91 121 47
f 91 47 133
f 91 133 5
f 91 5 9
f 91 9 95
f 91 95 6
f 91 6 126
f 91 126 102
f 91 102 8
f 91 8 93
f 91 93 55
f 91 55 112
f 91 112 15
f 91 15 111
f 91 111 63
f 91 63 78
f 91 78 79
f 91 79 62
f 91 62 14
f 91 14 26
f 110 43 92
f 110 92 42
f 110 42 77
f 37 44 90
f 37 90 70
f 37 70 131
f 37 38 45
f 37 45 44
f 77 42 132
f 77 132 38
f 14 62 4
f 43 53 92
f 92 53 42
f 42 53 132
f 44 19 121
f 44 121 90
f 44 45 20
f 44 20 19
f 38 132 101
f 38 101 45
f 132 53 22
f 132 22 101
f 62 79 86
f 62 86 4
f 4 86 2
f 53 74 22
f 19 29 47
f 19 47 121
f 19 20 30
f 19 30 29
f 45 101 120
f 45 120 48
f 45 48 20
f 101 22 73
f 101 73 120
f 22 74 73
f 79 78 82
f 79 82 84
f 79 84 83
f 79 83 85
f 79 85 81
f 79 81 87
f 79 87 88
f 79 88 80
f 79 80 86
f 86 80 39
f 86 39 2
f 74 108 16
f 74 16 73
f 29 11 133
f 29 133 47
f 29 30 12
f 29 12 11
f 20 48 30
f 120 73 52
f 120 52 48
f 48 52 134
f 48 134 124
f 48 124 30
f 73 16 125
f 73 125 100
f 73 100 52
f 78 63 82
f 80 88 39
f 39 88 13
f 108 13 16
f 16 114 24
f 16 24 25
f 16 25 125
f 16 13 114
f 11 68 133
f 11 12 69
f 11 69 68
f 133 68 5
f 30 124 12
f 52 100 75
f 52 75 134
f 134 75 119
f 134 119 17
f 134 17 3
f 134 3 124
f 124 3 69
f 124 69 12
f 125 25 100
f 100 25 35
f 100 35 21
f 100 21 75
f 63 111 82
f 82 111 64
f 82 64 65
f 82 65 84
f 88 87 115
f 88 115 114
f 88 114 13
f 114 115 25
f 114 25 24
f 25 115 57
f 25 57 54
f 25 54 89
f 25 89 105
f 25 105 127
f 25 127 21
f 25 21 35
f 68 122 5
f 68 69 123
f 68 123 122
f 5 122 9
f 75 21 119
f 119 21 127
f 119 127 10
f 119 10 94
f 119 94 103
f 119 103 7
f 119 7 130
f 119 130 118
f 119 118 17
f 17 118 123
f 17 123 69
f 17 69 3
f 111 15 31
f 111 31 64
f 64 31 32
f 64 32 65
f 84 65 99
f 84 99 33
f 84 33 83
f 87 81 67
f 87 67 115
f 115 67 57
f 57 67 34
f 57 34 1
f 57 1 96
f 57 96 18
f 57 18 59
f 57 59 104
f 57 104 54
f 54 104 89
f 89 104 105
f 105 104 51
f 105 51 23
f 105 23 127
f 127 23 10
f 122 60 9
f 122 123 61
f 122 61 60
f 9 60 95
f 10 23 94
f 94 23 51
f 94 51 104
f 94 104 59
f 94 59 58
f 94 58 28
f 94 28 72
f 94 72 103
f 103 72 41
f 103 41 107
f 103 107 50
f 103 50 7
f 7 50 129
f 7 129 130
f 130 129 118
f 118 129 61
f 118 61 123
f 15 112 113
f 15 113 46
f 15 46 97
f 15 97 31
f 31 97 98
f 31 98 32
f 65 32 99
f 99 32 36
f 99 36 18
f 99 18 33
f 33 18 66
f 33 66 83
f 83 66 85
f 81 85 18
f 81 18 96
f 81 96 1
f 81 1 34
f 81 34 67
f 18 85 66
f 18 36 116
f 18 116 117
f 18 117 59
f 59 117 116
f 59 116 58
f 60 128 95
f 60 61 129
f 60 129 128
f 95 128 6
f 58 116 56
f 58 56 27
f 58 27 28
f 28 27 71
f 28 71 72
f 72 71 40
f 72 40 41
f 41 40 106
f 41 106 107
f 107 106 49
f 107 49 50
f 50 49 128
f 50 128 129
f 112 55 113
f 113 55 56
f 113 56 116
f 113 116 46
f 46 116 97
f 97 116 98
f 32 98 36
f 36 98 116
f 128 49 126
f 128 126 6
f 56 55 93
f 56 93 27
f 27 93 8
f 27 8 71
f 71 8 102
f 71 102 40
f 40 102 106
f 106 102 126
f 106 126 49
@@ -0,0 +1,282 @@
# https://github.com/mikedh/trimesh
v 0.38849792 0.23270733 0.47658887
v 0.38849792 -0.27579925 0.47658887
v 0.30421000 -0.28672749 0.53466487
v 0.41819917 -0.28672749 0.44610630
v 0.40684056 -0.28672749 0.45940754
v 0.40684056 0.24453307 0.45940754
v 0.41986844 0.25187135 0.42718032
v 0.23841821 0.25134342 0.55716389
v 0.23841821 -0.28672749 0.56948810
v 0.23841821 -0.28672749 0.54105725
v 0.23841821 0.25160740 0.56468685
v 0.23841821 0.23270733 0.56975329
v 0.23841821 0.23228499 0.54059667
v 0.23841821 0.23983445 0.54100142
v 0.23841821 0.22663610 0.56975329
v 0.23841821 0.24453307 0.56946019
v 0.23841821 0.25166020 0.56449142
v 0.23841821 0.23249617 0.54059667
v 0.23841821 0.25150181 0.55741512
v 0.23841821 -0.27579925 0.56952997
v 0.40102694 0.23270733 0.46616283
v 0.40102694 -0.27579925 0.46616283
v 0.41188670 0.24453307 0.45348966
v 0.27521864 0.23270733 0.55469348
v 0.27521864 -0.27579925 0.55469348
v 0.40421194 0.25208253 0.45714644
v 0.27514188 0.24453307 0.55460974
v 0.39482957 -0.28672749 0.47153635
v 0.42289998 -0.27579925 0.44070487
v 0.43406672 0.24453307 0.42718032
v 0.28254802 0.25176575 0.54785445
v 0.39661394 0.23930652 0.42718032
v 0.43402834 -0.28672749 0.42718032
v 0.33120594 0.25208253 0.51318470
v 0.39646045 0.23492464 0.42718032
v 0.41134946 0.25129062 0.45284764
v 0.43383650 0.24500821 0.42718032
v 0.42259300 0.25081549 0.44035591
v 0.38886245 -0.28672749 0.47618411
v 0.40006758 -0.28672749 0.42718032
v 0.39440748 0.23270733 0.47208067
v 0.39440748 -0.27579925 0.47208067
v 0.31019629 0.23270733 0.53063121
v 0.31019629 -0.27579925 0.53063121
v 0.31764079 0.25160740 0.52393175
v 0.36626034 0.25202974 0.48933182
v 0.26894453 0.25076269 0.55842005
v 0.28387190 0.23270733 0.54878956
v 0.28387190 -0.27579925 0.54878956
v 0.42414711 0.25202974 0.42718032
v 0.40724348 -0.28672749 0.45894692
v 0.41643397 0.25213533 0.43432641
v 0.38840198 -0.28672749 0.47653304
v 0.38840198 0.24453307 0.47653304
v 0.38084233 0.25202974 0.47819395
v 0.30419082 0.24453307 0.53465091
v 0.40139147 -0.28672749 0.46556265
v 0.30407568 0.25049874 0.53458113
v 0.40693650 0.23270733 0.45949128
v 0.40693650 -0.27579925 0.45949128
v 0.42737050 0.25187135 0.42718032
v 0.24402079 0.23883138 0.53426008
v 0.24402079 0.23724756 0.53426008
v 0.27581343 -0.28672749 0.55416308
v 0.41787302 -0.27579925 0.44662271
v 0.26259367 -0.28672749 0.56108586
v 0.26259367 0.23270733 0.56122546
v 0.26259367 0.25181855 0.55955056
v 0.26259367 0.24453307 0.56107190
v 0.26259367 -0.27579925 0.56122546
v 0.40093100 -0.28672749 0.46607909
v 0.40093100 0.24453307 0.46607909
v 0.38778798 0.25118503 0.47611433
v 0.42512565 0.25176575 0.43400540
v 0.43439291 0.23270733 0.42718032
v 0.26969281 -0.28672749 0.55829444
v 0.43416265 -0.27579925 0.42718032
v 0.42284239 -0.28672749 0.44064904
v 0.42284239 0.24453307 0.44063508
v 0.25077457 0.25261047 0.56115564
v 0.25077457 0.25261047 0.55536341
v 0.43404755 -0.28577722 0.42718032
v 0.26930908 0.23270733 0.55864336
v 0.26930908 -0.27579925 0.55864336
v 0.43385567 0.23270733 0.42783630
v 0.26923234 -0.28672749 0.55860149
v 0.26923234 0.24453307 0.55858753
v 0.40008678 0.25166020 0.46518581
v 0.43366380 -0.27579925 0.42778047
v 0.39431154 -0.28672749 0.47199693
v 0.39431154 0.24453307 0.47198297
v 0.36810227 0.23270733 0.49067169
v 0.36810227 -0.27579925 0.49067169
v 0.28377598 -0.28672749 0.54870582
v 0.28377598 0.24453307 0.54869186
f 10 40 33
f 10 33 78
f 10 78 4
f 10 4 51
f 10 51 5
f 10 5 57
f 10 57 71
f 10 71 28
f 10 28 90
f 10 90 39
f 10 39 53
f 10 53 3
f 10 3 94
f 10 94 64
f 10 64 76
f 10 76 86
f 10 86 66
f 10 66 9
f 10 9 20
f 10 20 15
f 10 15 12
f 10 12 16
f 10 16 11
f 10 11 17
f 10 17 19
f 10 19 8
f 10 8 14
f 10 14 18
f 10 18 13
f 10 13 63
f 10 63 40
f 40 63 35
f 40 35 32
f 40 32 7
f 40 7 50
f 40 50 61
f 40 61 37
f 40 37 30
f 40 30 75
f 40 75 77
f 40 77 82
f 40 82 33
f 9 66 70
f 9 70 20
f 13 18 62
f 13 62 63
f 63 62 35
f 33 82 78
f 35 62 32
f 66 86 70
f 70 86 84
f 70 84 83
f 70 83 67
f 70 67 12
f 70 12 15
f 70 15 20
f 18 14 62
f 62 14 8
f 62 8 7
f 62 7 32
f 82 77 78
f 78 77 89
f 78 89 29
f 78 29 65
f 78 65 60
f 78 60 4
f 86 76 84
f 84 76 25
f 84 25 24
f 84 24 83
f 67 83 87
f 67 87 69
f 67 69 12
f 8 19 7
f 7 19 81
f 7 81 52
f 7 52 50
f 77 75 85
f 77 85 89
f 4 60 51
f 89 85 29
f 29 85 65
f 65 85 60
f 60 22 57
f 60 57 5
f 60 5 51
f 60 85 59
f 60 59 21
f 60 21 22
f 76 64 25
f 25 64 49
f 25 49 48
f 25 48 24
f 83 24 87
f 87 27 47
f 87 47 69
f 87 24 27
f 69 47 16
f 69 16 12
f 19 17 81
f 81 80 52
f 81 17 80
f 52 80 26
f 52 26 50
f 50 26 61
f 75 30 85
f 85 30 79
f 85 79 59
f 22 42 28
f 22 28 71
f 22 71 57
f 22 21 41
f 22 41 42
f 59 79 23
f 59 23 6
f 59 6 72
f 59 72 21
f 64 94 49
f 49 94 3
f 49 3 44
f 49 44 43
f 49 43 48
f 24 48 27
f 27 95 58
f 27 58 47
f 27 48 95
f 47 58 45
f 47 45 31
f 47 31 68
f 47 68 16
f 16 68 11
f 17 11 80
f 80 34 46
f 80 46 55
f 80 55 26
f 80 11 68
f 80 68 31
f 80 31 34
f 26 55 88
f 26 88 74
f 26 74 61
f 61 74 37
f 30 37 38
f 30 38 79
f 79 38 23
f 42 2 39
f 42 39 90
f 42 90 28
f 42 41 1
f 42 1 2
f 21 72 41
f 23 38 6
f 6 38 72
f 3 53 93
f 3 93 44
f 44 93 92
f 44 92 43
f 48 43 56
f 48 56 95
f 95 56 58
f 58 73 45
f 58 56 54
f 58 54 73
f 45 46 31
f 45 73 46
f 31 46 34
f 46 88 55
f 46 73 88
f 88 36 74
f 88 73 91
f 88 91 72
f 88 72 36
f 74 36 38
f 74 38 37
f 38 36 72
f 2 93 53
f 2 53 39
f 2 1 92
f 2 92 93
f 41 72 91
f 41 91 54
f 41 54 1
f 43 92 56
f 56 92 54
f 73 54 91
f 54 92 1
@@ -0,0 +1,225 @@
# https://github.com/mikedh/trimesh
v 0.13035022 0.25175959 0.60677565
v 0.23449365 0.25107288 0.57052286
v 0.00241946 -0.28672752 0.58835262
v 0.00241946 0.24452271 0.62080060
v 0.00241946 0.25228784 0.61898120
v 0.02698785 -0.28672752 0.61887046
v 0.19162917 0.25234065 0.58391495
v 0.13248042 -0.27579298 0.60758251
v 0.13248042 0.23269014 0.60758251
v 0.23536940 -0.28672752 0.57083925
v 0.23536940 0.24452271 0.57083925
v 0.20916788 0.23865925 0.54629363
v 0.04521295 -0.28672752 0.61741499
v -0.00295339 -0.28672752 0.62122777
v 0.03789924 -0.27579298 0.61808739
v 0.03789924 0.23269014 0.61808739
v 0.03789924 0.24452271 0.61799244
v 0.16670574 -0.28672752 0.59528995
v 0.22710894 0.25212936 0.57175684
v 0.22710894 -0.28672752 0.54112030
v 0.04436087 0.25049182 0.61734380
v 0.04571000 -0.27579298 0.61745453
v 0.04571000 0.23269014 0.61745453
v 0.12066961 -0.28672752 0.61053306
v 0.12066961 -0.27579298 0.61078619
v 0.12066961 0.25265759 0.60785936
v 0.12066961 0.23269014 0.61078619
v 0.12066961 0.24452271 0.61051724
v 0.13839766 -0.27579298 0.60547836
v 0.13839766 0.23269014 0.60547836
v 0.21527446 0.25249913 0.56746157
v 0.21527446 0.25249913 0.57327561
v 0.23839904 0.23247885 0.54060615
v 0.23839904 -0.28672752 0.54106496
v 0.23839904 -0.28672752 0.56949452
v 0.23839904 0.25138982 0.55717820
v 0.23839904 0.23982137 0.54100956
v 0.23839904 0.25165394 0.56433701
v 0.23839904 0.25165394 0.56449519
v 0.23839904 -0.27579298 0.56954196
v 0.23839904 0.25149546 0.55743133
v 0.23839904 0.23226756 0.54060615
v 0.23839904 0.23269014 0.56977137
v 0.23839904 0.22661539 0.56977137
v 0.23839904 0.24452271 0.56946287
v 0.23839904 0.25160111 0.56470088
v 0.23551143 -0.27579298 0.57089462
v 0.23551143 0.23269014 0.57089462
v 0.19977129 0.25133700 0.58260183
v -0.00340310 -0.28672752 0.62125942
v -0.00340310 -0.28672752 0.59166703
v -0.00340310 -0.27579298 0.62141760
v -0.00340310 0.23269014 0.62141760
v -0.00340310 0.24843169 0.62032600
v -0.00340310 0.24452271 0.62125145
v -0.00340310 0.23945162 0.59242642
v -0.00340310 0.25244630 0.61402148
v -0.00340310 0.25244630 0.61919478
v -0.00340310 0.25070311 0.61102349
v -0.00340310 0.23871208 0.62133851
v 0.00334255 -0.28672752 0.62073730
v 0.03851463 -0.28672752 0.61795290
v 0.02608843 0.25138982 0.61806363
v 0.02608843 0.24452271 0.61893376
v 0.04516561 0.24452271 0.61740710
v 0.15614939 0.25249913 0.59604140
v 0.13236208 -0.28672752 0.60751132
v 0.13236208 0.24452271 0.60750342
v 0.01425394 -0.28672752 0.61988297
v 0.01425394 0.25186523 0.61852245
v 0.10885880 -0.28672752 0.61183825
v 0.10885880 -0.27579298 0.61211509
v 0.10885880 0.25292171 0.60267813
v 0.10885880 0.25292171 0.60840519
v 0.10885880 0.23269014 0.61230496
v 0.10885880 0.24452271 0.61184614
f 51 3 20
f 51 20 34
f 51 34 35
f 51 35 10
f 51 10 18
f 51 18 67
f 51 67 24
f 51 24 71
f 51 71 13
f 51 13 62
f 51 62 6
f 51 6 69
f 51 69 61
f 51 61 14
f 51 14 50
f 51 50 52
f 51 52 53
f 51 53 60
f 51 60 55
f 51 55 54
f 51 54 58
f 51 58 57
f 51 57 59
f 51 59 56
f 51 56 3
f 3 56 12
f 3 12 20
f 50 14 52
f 56 59 36
f 56 36 37
f 56 37 12
f 20 12 33
f 20 33 42
f 20 42 34
f 12 37 33
f 14 61 52
f 52 61 69
f 52 69 6
f 52 6 62
f 52 62 13
f 52 13 15
f 52 15 16
f 52 16 53
f 59 57 36
f 36 57 41
f 36 41 38
f 36 38 39
f 36 39 46
f 36 46 45
f 36 45 43
f 36 43 44
f 36 44 40
f 36 40 35
f 36 35 34
f 36 34 42
f 36 42 33
f 36 33 37
f 13 71 72
f 13 72 22
f 13 22 15
f 15 22 23
f 15 23 16
f 53 16 65
f 53 65 17
f 53 17 64
f 53 64 60
f 57 58 74
f 57 74 73
f 57 73 31
f 57 31 41
f 41 31 38
f 35 40 47
f 35 47 10
f 71 24 72
f 72 24 25
f 72 25 75
f 72 75 22
f 22 75 23
f 16 23 65
f 65 21 17
f 65 23 75
f 65 75 21
f 17 21 64
f 64 21 4
f 64 4 60
f 60 4 55
f 58 5 74
f 58 54 5
f 73 74 32
f 73 32 31
f 31 19 38
f 31 32 19
f 38 19 39
f 10 29 18
f 10 47 29
f 40 44 47
f 47 44 43
f 47 43 48
f 47 48 30
f 47 30 29
f 24 67 25
f 25 67 8
f 25 8 9
f 25 9 27
f 25 27 75
f 75 27 28
f 75 28 76
f 75 76 21
f 21 26 63
f 21 63 54
f 21 54 55
f 21 55 4
f 21 76 28
f 21 28 26
f 5 70 26
f 5 26 74
f 5 54 70
f 74 26 32
f 54 63 70
f 19 32 7
f 19 7 1
f 19 1 49
f 19 49 2
f 19 2 39
f 32 26 66
f 32 66 7
f 39 2 46
f 29 8 67
f 29 67 18
f 29 30 9
f 29 9 8
f 48 43 11
f 48 11 30
f 27 9 68
f 27 68 28
f 28 68 1
f 28 1 26
f 26 70 63
f 26 1 66
f 7 66 1
f 1 2 49
f 1 68 2
f 2 11 45
f 2 45 46
f 2 68 11
f 30 11 68
f 30 68 9
f 43 45 11
@@ -0,0 +1,300 @@
# https://github.com/mikedh/trimesh
v 0.45015553 -0.28672752 0.40838077
v 0.51772929 0.24453875 0.31172451
v 0.42045956 0.25181996 0.42599236
v 0.49360133 -0.27580566 0.35760135
v 0.49360133 0.23266715 0.35760135
v 0.53816072 0.25224205 0.24478543
v 0.44831498 0.25208377 0.40730598
v 0.51774476 -0.28672752 0.31172451
v 0.53966098 0.25123959 0.23729955
v 0.52926740 0.24453875 0.28743787
v 0.50328345 0.23266715 0.34200737
v 0.43385370 0.24501360 0.42716143
v 0.49511706 0.25176720 0.35120915
v 0.54079005 0.24453875 0.26315125
v 0.54672925 0.25166168 0.23454658
v 0.40007455 -0.28672752 0.42716143
v 0.51740448 0.25108130 0.31100798
v 0.50626851 -0.27580566 0.33610543
v 0.50626851 0.23266715 0.33610543
v 0.55231269 -0.28672752 0.23888347
v 0.48214054 0.25113406 0.36985782
v 0.47508775 0.25203101 0.37421358
v 0.54080552 -0.28672752 0.26317011
v 0.51890474 0.25213653 0.30391809
v 0.51779115 -0.27580566 0.31183764
v 0.51779115 0.23266715 0.31183764
v 0.44984619 -0.27580566 0.40905962
v 0.44984619 0.23266715 0.40905962
v 0.39715135 0.23915694 0.42614321
v 0.39715135 0.23546357 0.42614321
v 0.49777730 0.23266715 0.35120915
v 0.50074692 0.25229481 0.32758247
v 0.54085190 -0.27580566 0.26326439
v 0.54085190 0.23266715 0.26326439
v 0.55235910 -0.28361453 0.23894004
v 0.55235910 0.24052877 0.23894004
v 0.46659658 0.24453875 0.38914760
v 0.49742158 0.24453875 0.35120915
v 0.50298958 0.24453875 0.34189424
v 0.54049617 0.25055365 0.23454658
v 0.54606418 0.25155615 0.23454658
v 0.55237458 -0.27580566 0.23897775
v 0.55237458 0.23266715 0.23897775
v 0.49743705 -0.28672752 0.35120915
v 0.50300505 -0.28672752 0.34189424
v 0.48889946 -0.28672752 0.36299418
v 0.48258906 0.24453875 0.37038579
v 0.53048927 0.25197825 0.28027258
v 0.46068832 -0.28672752 0.39608662
v 0.49338478 0.25060641 0.35735622
v 0.43694703 0.25203101 0.41982643
v 0.52903539 0.25087022 0.28694762
v 0.39648628 0.23493596 0.42716143
v 0.48857465 -0.27580566 0.36352219
v 0.48857465 0.23266715 0.36352219
v 0.41988729 0.25187272 0.42716143
v 0.52385406 0.23198125 0.23454658
v 0.45962111 0.25187272 0.39484213
v 0.49787010 -0.28672752 0.35049262
v 0.54205829 0.25181996 0.25662704
v 0.55430789 0.24485531 0.23454658
v 0.43178117 0.25203101 0.41352848
v 0.55319430 0.25034261 0.23454658
v 0.53277831 -0.27580566 0.28027258
v 0.53277831 0.23266715 0.28027258
v 0.46670481 -0.27580566 0.38924188
v 0.46670481 0.23266715 0.38924188
v 0.43403930 -0.28672752 0.42716143
v 0.55433884 0.24411662 0.23454658
v 0.55433884 -0.28672752 0.23454658
v 0.50311329 -0.27580566 0.34200737
v 0.43442593 0.23266715 0.42716143
v 0.43405474 -0.28662200 0.42716143
v 0.42737317 0.25187272 0.42716143
v 0.43407021 0.24453875 0.42716143
v 0.55438522 -0.28356177 0.23454658
v 0.55215803 0.24844316 0.23880805
v 0.44004035 0.25208377 0.41041725
v 0.54066630 0.25060641 0.26288727
v 0.50577356 0.25123959 0.33506835
v 0.49760718 -0.27580566 0.35120915
v 0.55404497 -0.28672752 0.23518769
v 0.39662547 0.23931522 0.42716143
v 0.54476499 0.25224205 0.24478543
v 0.49353944 -0.28672752 0.35754478
v 0.49353944 0.24453875 0.35752592
v 0.41705689 -0.28672752 0.39855678
v 0.54700764 0.25166168 0.23454658
v 0.47089630 0.25155615 0.38235938
v 0.51582688 0.23915694 0.24678416
v 0.47165417 -0.28672752 0.38324561
v 0.47165417 0.24453875 0.38322679
v 0.52326635 -0.28672752 0.23454658
v 0.50730477 0.25229481 0.32758247
v 0.55446255 0.23266715 0.23454658
v 0.55446255 -0.27786339 0.23454658
v 0.52439542 0.23989564 0.23454658
v 0.50620662 -0.28672752 0.33599229
v 0.50620662 0.24453875 0.33597343
v 0.43417848 -0.27580566 0.42716143
v 0.42415610 0.25203101 0.42716143
f 101 51 7
f 101 7 78
f 101 78 32
f 101 32 6
f 101 6 62
f 101 62 56
f 101 56 83
f 101 83 53
f 101 53 16
f 101 16 68
f 101 68 73
f 101 73 100
f 101 100 72
f 101 72 75
f 101 75 12
f 101 12 74
f 101 74 51
f 51 74 12
f 51 12 7
f 7 58 22
f 7 22 94
f 7 94 78
f 7 12 58
f 78 94 32
f 32 94 84
f 32 84 6
f 6 84 88
f 6 88 15
f 6 15 9
f 6 9 3
f 6 3 56
f 6 56 62
f 56 3 83
f 12 75 58
f 58 89 13
f 58 13 22
f 58 75 89
f 22 13 94
f 94 24 84
f 94 13 80
f 94 80 24
f 84 24 48
f 84 48 60
f 84 60 63
f 84 63 88
f 15 88 63
f 15 63 61
f 15 61 69
f 15 69 95
f 15 95 96
f 15 96 76
f 15 76 70
f 15 70 93
f 15 93 57
f 15 57 97
f 15 97 40
f 15 40 41
f 15 41 9
f 9 41 40
f 9 40 97
f 9 97 83
f 9 83 3
f 83 97 29
f 83 29 53
f 75 37 50
f 75 50 21
f 75 21 89
f 75 72 37
f 89 21 13
f 13 21 50
f 13 50 80
f 24 80 48
f 80 17 60
f 80 60 48
f 80 50 39
f 80 39 99
f 80 99 17
f 60 17 52
f 60 52 79
f 60 79 63
f 63 79 77
f 63 77 61
f 97 90 29
f 97 57 90
f 29 90 57
f 29 57 93
f 29 93 30
f 29 30 53
f 53 30 93
f 53 93 87
f 53 87 16
f 37 72 92
f 37 92 50
f 50 92 47
f 50 47 86
f 50 86 38
f 50 38 39
f 72 28 92
f 72 100 27
f 72 27 28
f 17 99 52
f 39 38 11
f 39 11 99
f 99 36 2
f 99 2 79
f 99 79 52
f 99 11 19
f 99 19 36
f 79 2 10
f 79 10 14
f 79 14 77
f 77 14 69
f 77 69 61
f 93 70 82
f 93 82 20
f 93 20 23
f 93 23 8
f 93 8 98
f 93 98 45
f 93 45 59
f 93 59 44
f 93 44 85
f 93 85 46
f 93 46 91
f 93 91 49
f 93 49 1
f 93 1 68
f 93 68 16
f 93 16 87
f 92 28 47
f 47 28 86
f 86 28 67
f 86 67 55
f 86 55 5
f 86 5 31
f 86 31 38
f 38 31 11
f 28 27 66
f 28 66 67
f 100 73 27
f 27 73 1
f 27 1 49
f 27 49 91
f 27 91 46
f 27 46 85
f 27 85 66
f 11 31 81
f 11 81 71
f 11 71 18
f 11 18 19
f 36 69 14
f 36 14 10
f 36 10 2
f 36 19 26
f 36 26 65
f 36 65 34
f 36 34 43
f 36 43 95
f 36 95 69
f 19 18 25
f 19 25 26
f 70 76 82
f 68 1 73
f 67 66 54
f 67 54 55
f 55 54 4
f 55 4 5
f 5 4 31
f 31 4 81
f 85 44 81
f 85 81 4
f 85 4 54
f 85 54 66
f 71 81 59
f 71 59 45
f 71 45 98
f 71 98 18
f 18 98 8
f 18 8 35
f 18 35 25
f 26 25 64
f 26 64 65
f 65 64 33
f 65 33 34
f 34 33 42
f 34 42 43
f 43 42 96
f 43 96 95
f 82 76 35
f 82 35 20
f 76 96 35
f 81 44 59
f 8 23 35
f 35 96 42
f 35 42 33
f 35 33 64
f 35 64 25
f 35 23 20
@@ -0,0 +1,267 @@
# https://github.com/mikedh/trimesh
v 0.59360771 -0.27579354 0.05557847
v 0.59360771 0.23266369 0.05557847
v 0.55447816 -0.27579354 0.23454657
v 0.55447816 0.23266369 0.23454657
v 0.54607112 0.25157371 0.23454657
v 0.54977545 0.25236604 0.22111681
v 0.56570133 -0.28672752 0.20840034
v 0.58992406 0.25257730 0.03191849
v 0.59223062 -0.28672752 0.03191849
v 0.59223062 -0.28672752 0.06648122
v 0.52386583 0.23197702 0.23454657
v 0.58453281 0.25247167 0.02635503
v 0.54050086 0.25057011 0.23454657
v 0.56612134 0.25241884 0.19747722
v 0.55431981 0.24486543 0.23454657
v 0.54702132 0.25162654 0.23454657
v 0.56343604 0.24449568 0.21431024
v 0.58885685 0.25162654 0.07921807
v 0.59216183 -0.28672752 0.03100143
v 0.58175799 0.25088703 0.02635503
v 0.56844858 -0.27579354 0.19747722
v 0.56844858 0.23266369 0.19747722
v 0.55434046 0.24412592 0.23454657
v 0.56576329 -0.27579354 0.20854300
v 0.56576329 0.23266369 0.20854300
v 0.59309130 0.24449568 0.04373829
v 0.56826958 0.24449568 0.19747722
v 0.59240276 -0.27579354 0.03191849
v 0.59240276 0.23266369 0.03191849
v 0.56387670 0.23266369 0.21445291
v 0.55447129 -0.27785356 0.23454657
v 0.59311195 -0.28672752 0.04373829
v 0.57749595 0.25210192 0.13833746
v 0.59211361 0.24449568 0.06739827
v 0.58971746 0.25247167 0.02635503
v 0.56569445 0.24449568 0.20840034
v 0.59031655 0.25284142 0.04373829
v 0.59042665 0.25289426 0.05557847
v 0.55320438 0.25035882 0.23454657
v 0.59093622 0.24814034 0.02635503
v 0.56081270 0.23266369 0.22111681
v 0.52328055 -0.28672752 0.23454657
v 0.59335296 -0.28672752 0.05557847
v 0.59335296 -0.27579354 0.04373829
v 0.59335296 0.23266369 0.04373829
v 0.59195522 -0.27579354 0.02635503
v 0.59195522 0.23266369 0.02635503
v 0.55602051 0.25236604 0.22111681
v 0.56693380 0.25284142 0.18563704
v 0.57664905 0.25125678 0.14797671
v 0.56513674 0.25152087 0.20662737
v 0.52440976 0.23990022 0.23454657
v 0.58146194 -0.27579354 0.12653804
v 0.58146194 0.23266369 0.12653804
v 0.58476691 0.25289426 0.05557847
v 0.58838175 0.24449568 0.08828671
v 0.54674592 0.25162654 0.23454657
v 0.55885729 -0.28672752 0.02635503
v 0.59188642 0.23826275 0.02635503
v 0.59179690 -0.28672752 0.02635503
v 0.52334255 -0.28672752 0.23291625
v 0.56828336 -0.28672752 0.19747722
v 0.59230640 -0.27579354 0.06739827
v 0.59230640 0.23266369 0.06739827
v 0.59221688 0.24449568 0.03191849
v 0.57600185 0.23995305 0.15618943
v 0.57600185 -0.28308286 0.15618943
v 0.59002042 0.24449568 0.07921807
v 0.58851258 -0.28672752 0.08759383
v 0.55408571 0.25199629 0.23089873
v 0.59332540 0.24449568 0.05557847
v 0.59212736 -0.28672752 0.06739827
v 0.55439555 -0.28355824 0.23454657
v 0.56590790 -0.28672752 0.20754444
v 0.57673170 -0.28672752 0.15186909
v 0.56632791 0.24153769 0.02635503
v 0.57684184 0.24412592 0.15121697
v 0.57843928 0.25273580 0.12653804
v 0.58815450 0.25088703 0.08706397
v 0.56293341 0.23947763 0.02635503
v 0.58986210 0.25252450 0.06739827
v 0.58476004 0.25284142 0.04373829
v 0.55523557 -0.27579354 0.23293664
v 0.56124649 0.25284142 0.18563704
v 0.56375278 -0.28672752 0.21386191
v 0.55454703 0.24449568 0.23407785
v 0.55434737 -0.28672752 0.23454657
v 0.59178999 0.24449568 0.02635503
v 0.59019256 -0.28672752 0.07832140
v 0.56357374 -0.28672752 0.21431024
f 16 70 57
f 16 57 5
f 16 5 13
f 16 13 52
f 16 52 11
f 16 11 42
f 16 42 87
f 16 87 73
f 16 73 31
f 16 31 3
f 16 3 4
f 16 4 23
f 16 23 15
f 16 15 39
f 16 39 70
f 70 14 48
f 70 48 6
f 70 6 57
f 70 39 51
f 70 51 14
f 57 6 5
f 39 15 17
f 39 17 51
f 14 51 50
f 14 50 33
f 14 33 81
f 14 81 78
f 14 78 49
f 14 49 48
f 48 49 84
f 48 84 6
f 6 84 82
f 6 82 12
f 6 12 13
f 6 13 5
f 51 17 36
f 51 36 27
f 51 27 50
f 15 23 86
f 15 86 17
f 17 86 30
f 17 30 36
f 50 79 18
f 50 18 33
f 50 27 79
f 33 18 81
f 81 38 78
f 81 18 34
f 81 34 71
f 81 71 38
f 78 38 49
f 49 38 55
f 49 55 84
f 84 55 82
f 82 55 38
f 82 38 37
f 82 37 35
f 82 35 12
f 12 35 40
f 12 40 88
f 12 88 59
f 12 59 47
f 12 47 46
f 12 46 60
f 12 60 58
f 12 58 80
f 12 80 76
f 12 76 20
f 12 20 13
f 13 20 76
f 13 76 80
f 13 80 52
f 36 30 25
f 36 25 22
f 36 22 27
f 27 22 66
f 27 66 77
f 27 77 79
f 23 4 41
f 23 41 86
f 86 41 30
f 30 41 83
f 30 83 90
f 30 90 85
f 30 85 24
f 30 24 25
f 79 77 56
f 79 56 68
f 79 68 34
f 79 34 18
f 38 71 37
f 34 68 64
f 34 64 2
f 34 2 71
f 71 26 37
f 71 2 26
f 37 8 35
f 37 26 8
f 35 8 26
f 35 26 40
f 80 11 52
f 80 58 11
f 25 24 21
f 25 21 22
f 22 54 66
f 22 21 53
f 22 53 54
f 66 56 77
f 66 54 64
f 66 64 56
f 4 3 41
f 41 3 83
f 83 3 31
f 83 31 73
f 83 73 90
f 90 73 87
f 90 87 42
f 90 42 61
f 90 61 58
f 90 58 60
f 90 60 19
f 90 19 9
f 90 9 32
f 90 32 43
f 90 43 10
f 90 10 72
f 90 72 89
f 90 89 69
f 90 69 75
f 90 75 62
f 90 62 74
f 90 74 7
f 90 7 85
f 85 7 24
f 24 7 21
f 56 64 68
f 64 54 53
f 64 53 63
f 64 63 1
f 64 1 2
f 2 45 26
f 2 1 44
f 2 44 45
f 26 65 40
f 26 45 65
f 40 65 88
f 11 58 61
f 11 61 42
f 21 7 74
f 21 74 62
f 21 62 67
f 21 67 53
f 63 53 67
f 63 67 69
f 63 69 89
f 63 89 72
f 63 72 10
f 63 10 1
f 45 29 59
f 45 59 88
f 45 88 65
f 45 44 28
f 45 28 29
f 1 10 43
f 1 43 32
f 1 32 44
f 60 46 28
f 60 28 44
f 60 44 19
f 62 75 67
f 67 75 69
f 29 47 59
f 29 28 46
f 29 46 47
f 44 32 9
f 44 9 19
@@ -0,0 +1,219 @@
# https://github.com/mikedh/trimesh
v 0.57801740 -0.28672752 -0.10987657
v 0.58850321 -0.28672752 -0.01541074
v 0.58175510 0.25086159 0.02635502
v 0.59180317 -0.28672752 0.02635502
v 0.56632607 0.24151175 0.02635502
v 0.58948647 0.25228784 0.02007491
v 0.52317736 -0.28672752 -0.16966970
v 0.57318192 0.25292171 -0.08634140
v 0.54858034 0.25234065 -0.16912095
v 0.58791730 -0.28672752 -0.02270705
v 0.58791730 0.24452271 -0.02266640
v 0.55007542 0.25239348 -0.15729239
v 0.57836086 0.25265759 -0.09816996
v 0.58104122 -0.28672752 -0.09816996
v 0.55363130 -0.27579298 -0.17867320
v 0.55363130 0.23269014 -0.17867320
v 0.52328510 0.23300710 -0.18127469
v 0.58902850 0.25186523 0.00824637
v 0.58859076 -0.27579298 -0.01541074
v 0.58859076 0.23269014 -0.01541074
v 0.52315716 -0.28672752 -0.18127469
v 0.57890634 0.25292171 -0.08634140
v 0.52333899 0.23966291 -0.18127469
v 0.55311947 0.25133700 -0.17727085
v 0.54606160 0.25154829 -0.18127469
v 0.58102103 0.24452271 -0.09816996
v 0.55229785 0.24452271 -0.18127469
v 0.57808475 -0.27579298 -0.10999851
v 0.57808475 0.23269014 -0.10999851
v 0.58857052 0.25138982 -0.00358219
v 0.58944608 -0.28672752 -0.00358219
v 0.59037541 0.24452271 0.00824637
v 0.55235174 -0.28672752 -0.18127469
v 0.57801067 0.24452271 -0.10985624
v 0.58849644 0.24452271 -0.01541074
v 0.59130481 0.24452271 0.02007491
v 0.58262389 -0.27579298 -0.08634140
v 0.58280571 0.23269014 -0.08634140
v 0.55357071 -0.28672752 -0.17853095
v 0.55357071 0.24452271 -0.17853095
v 0.58129040 -0.27579298 -0.09816996
v 0.58129040 0.23269014 -0.09816996
v 0.57598353 -0.27579298 -0.11591278
v 0.57598353 0.23269014 -0.11591278
v 0.58453651 0.25244630 0.02635502
v 0.58234774 -0.28672752 -0.08634140
v 0.58234774 0.24452271 -0.08634140
v 0.58971542 0.25244630 0.02635502
v 0.52346020 -0.28672752 -0.15798340
v 0.58845605 -0.28672752 -0.01600014
v 0.55442600 0.25234065 -0.16912095
v 0.55885739 -0.28672752 0.02635502
v 0.57727659 0.25175959 -0.10784417
v 0.59188396 0.23823666 0.02635502
v 0.54149554 0.25017488 -0.17578722
v 0.59131828 -0.28672752 0.02007491
v 0.58943931 0.24452271 -0.00358219
v 0.59093439 0.24816756 0.02635502
v 0.59049665 -0.27579298 0.00824637
v 0.59049665 0.23269014 0.00824637
v 0.58810586 0.25080875 -0.01541074
v 0.59178971 0.24452271 0.02635502
v 0.58784991 0.25049182 -0.02185344
v 0.56293856 0.23945162 0.02635502
v 0.55263458 0.23269014 -0.18127469
v 0.55263458 0.22603433 -0.18127469
v 0.55237866 -0.27579298 -0.18127469
v 0.53633007 0.24806192 -0.18127469
v 0.56654833 0.25249913 -0.13363529
v 0.58795769 -0.27579298 -0.02319482
v 0.58795769 0.23269014 -0.02319482
v 0.54449917 0.25149546 -0.18127469
v 0.59195134 -0.27579298 0.02635502
v 0.59195134 0.23269014 0.02635502
f 48 6 22
f 48 22 8
f 48 8 45
f 48 45 3
f 48 3 5
f 48 5 64
f 48 64 52
f 48 52 4
f 48 4 73
f 48 73 74
f 48 74 54
f 48 54 62
f 48 62 58
f 48 58 6
f 6 18 13
f 6 13 22
f 6 58 18
f 22 13 69
f 22 69 51
f 22 51 9
f 22 9 8
f 45 8 12
f 45 12 55
f 45 55 68
f 45 68 3
f 58 62 63
f 58 63 61
f 58 61 30
f 58 30 18
f 18 30 13
f 13 30 61
f 13 61 63
f 13 63 26
f 13 26 53
f 13 53 69
f 69 53 51
f 51 53 24
f 51 24 25
f 51 25 9
f 8 9 12
f 12 9 72
f 12 72 55
f 55 72 68
f 68 72 25
f 68 25 27
f 68 27 65
f 68 65 66
f 68 66 67
f 68 67 33
f 68 33 21
f 68 21 17
f 68 17 23
f 68 23 64
f 68 64 5
f 68 5 3
f 62 36 63
f 62 54 36
f 63 36 32
f 63 32 57
f 63 57 35
f 63 35 11
f 63 11 38
f 63 38 47
f 63 47 26
f 26 34 53
f 26 47 38
f 26 38 42
f 26 42 34
f 53 34 24
f 9 25 72
f 24 34 40
f 24 40 27
f 24 27 25
f 23 17 49
f 23 49 64
f 64 49 52
f 36 54 32
f 54 74 32
f 32 74 57
f 57 74 35
f 35 74 11
f 11 74 60
f 11 60 20
f 11 20 71
f 11 71 38
f 38 71 70
f 38 70 37
f 38 37 41
f 38 41 42
f 34 42 29
f 34 29 44
f 34 44 40
f 42 41 28
f 42 28 29
f 40 44 16
f 40 16 65
f 40 65 27
f 17 21 7
f 17 7 49
f 49 7 21
f 49 21 33
f 49 33 39
f 49 39 1
f 49 1 14
f 49 14 46
f 49 46 10
f 49 10 50
f 49 50 2
f 49 2 31
f 49 31 56
f 49 56 4
f 49 4 52
f 74 73 59
f 74 59 60
f 60 59 19
f 60 19 20
f 20 19 70
f 20 70 71
f 70 19 10
f 70 10 37
f 37 10 46
f 37 46 14
f 37 14 41
f 41 14 1
f 41 1 28
f 29 28 43
f 29 43 44
f 44 43 15
f 44 15 16
f 16 15 66
f 16 66 65
f 4 56 73
f 73 56 31
f 73 31 2
f 73 2 50
f 73 50 10
f 73 10 59
f 59 10 19
f 1 39 43
f 1 43 28
f 43 39 15
f 15 39 33
f 15 33 67
f 15 67 66
@@ -0,0 +1,522 @@
# https://github.com/mikedh/trimesh
v 0.40896769 0.24659770 0.43985831
v 0.40896769 0.21931130 0.43985831
v 0.44583937 0.23903504 0.43985831
v 0.44583937 0.22687396 0.43985831
v 0.42336517 0.21885526 0.46522840
v 0.42336517 0.24705374 0.46522840
v 0.01479175 0.23903504 0.63706470
v 0.01479175 0.25336652 0.62819978
v 0.01479175 0.21254248 0.62819978
v 0.01479175 0.22687396 0.63706470
v 0.01479175 0.24826563 0.63566501
v 0.01479175 0.21764337 0.63566501
v 0.39189258 0.25364944 0.48223901
v 0.39189258 0.21225956 0.48223901
v 0.13440527 0.21808675 0.62357290
v 0.13440527 0.24782225 0.62357290
v 0.16078608 0.24929594 0.61264720
v 0.16078608 0.21661306 0.61264720
v 0.33105427 0.25452351 0.51872922
v 0.33105427 0.21138549 0.51872922
v 0.33105427 0.21532095 0.53126846
v 0.33105427 0.25058805 0.53126846
v 0.29089047 0.24784337 0.56297625
v 0.29089047 0.21806563 0.56297625
v 0.27710749 0.23903504 0.57394078
v 0.27710749 0.22687396 0.57394078
v 0.27021599 0.23903504 0.57660416
v 0.27021599 0.24799538 0.57502949
v 0.27021599 0.21791362 0.57502949
v 0.27021599 0.22687396 0.57660416
v 0.27021599 0.25299915 0.56736984
v 0.27021599 0.21290985 0.56736984
v 0.29479712 0.25073162 0.55566652
v 0.29479712 0.21517738 0.55566652
v 0.42999332 0.23903504 0.45871577
v 0.42999332 0.22687396 0.45871577
v 0.41261093 0.23903504 0.47881745
v 0.41261093 0.22687396 0.47881745
v 0.14252582 0.23903504 0.62213427
v 0.14252582 0.22687396 0.62213427
v 0.03910950 0.23903504 0.63510121
v 0.03910950 0.22687396 0.63510121
v 0.03910950 0.24621767 0.63469295
v 0.03910950 0.21969133 0.63469295
v 0.43539241 0.25199840 0.43985831
v 0.41621034 0.25387323 0.45789928
v 0.41621034 0.21203577 0.45789928
v 0.33408302 0.23903504 0.53486500
v 0.33408302 0.22687396 0.53486500
v -0.00254673 0.21182464 0.62819978
v -0.00254673 0.23903504 0.63846447
v -0.00254673 0.25203218 0.63179632
v -0.00254673 0.24916504 0.63636486
v -0.00254673 0.21992780 0.60969224
v -0.00254673 0.21533784 0.61558277
v -0.00254673 0.25057116 0.61558277
v -0.00254673 0.24598120 0.60969224
v -0.00254673 0.21674396 0.63636486
v -0.00254673 0.22687396 0.63846447
v -0.00254673 0.25408436 0.62819978
v -0.00254673 0.25267402 0.62122058
v -0.00254673 0.24473554 0.63737579
v -0.00254673 0.24767446 0.61179181
v 0.41651759 0.25103565 0.43985831
v 0.41651759 0.21487335 0.43985831
v 0.29211953 0.23903504 0.56381220
v 0.29211953 0.22687396 0.56381220
v 0.39913523 0.21910861 0.48914047
v 0.39913523 0.24680039 0.48914047
v 0.35537206 0.25393235 0.50655934
v 0.35537206 0.21197665 0.50655934
v 0.27684411 0.24597276 0.57378527
v 0.27684411 0.21993624 0.57378527
v 0.12426555 0.23903504 0.62759710
v 0.12426555 0.21632592 0.62485599
v 0.12426555 0.21157973 0.61604933
v 0.12426555 0.25432927 0.61604933
v 0.12426555 0.24958308 0.62485599
v 0.12426555 0.22687396 0.62759710
v 0.29453375 0.21149528 0.54304951
v 0.29453375 0.25441372 0.54304951
v 0.37876800 0.23903504 0.50403203
v 0.37876800 0.22687396 0.50403203
v 0.39974976 0.23903504 0.48954873
v 0.39974976 0.22687396 0.48954873
v 0.17013569 0.21840344 0.61113084
v 0.17013569 0.24750556 0.61113084
v 0.43512904 0.23903504 0.45263086
v 0.43512904 0.22687396 0.45263086
v 0.20582222 0.21881303 0.59868880
v 0.20582222 0.24709597 0.59868880
v 0.00258896 0.21695509 0.63617044
v 0.00258896 0.25394502 0.62819978
v 0.00258896 0.21442153 0.61604933
v 0.00258896 0.21196398 0.62819978
v 0.00258896 0.24895391 0.63617044
v 0.24150874 0.21931974 0.58622730
v 0.24150874 0.24658926 0.58622730
v 0.41177693 0.21818386 0.47792319
v 0.41177693 0.24772514 0.47792319
v 0.41599087 0.24989977 0.46960256
v 0.41599087 0.21600923 0.46960256
v 0.23373936 0.21237780 0.57953972
v 0.23373936 0.25353120 0.57953972
v 0.23373936 0.24857810 0.58762703
v 0.23373936 0.21733090 0.58762703
v 0.40580726 0.23903504 0.48490239
v 0.40580726 0.22687396 0.48490239
v 0.32697206 0.21834432 0.53836433
v 0.32697206 0.24756468 0.53836433
v 0.28320887 0.23903504 0.56989714
v 0.28320887 0.22687396 0.56989714
v 0.41871233 0.23903504 0.47195489
v 0.41871233 0.22687396 0.47195489
v 0.31889541 0.21177397 0.53089910
v 0.31889541 0.25413503 0.53089910
v 0.37705610 0.24826563 0.50284615
v 0.37705610 0.21764337 0.50284615
v 0.43490954 0.21982645 0.45235868
v 0.43490954 0.24608255 0.45235868
v 0.20709517 0.23903504 0.59911650
v 0.20709517 0.22687396 0.59911650
v 0.25805712 0.21167685 0.56736984
v 0.25805712 0.24976465 0.57699299
v 0.25805712 0.21614435 0.57699299
v 0.25805712 0.25423215 0.56736984
v 0.02695063 0.24736199 0.63517902
v 0.02695063 0.21854701 0.63517902
v 0.40405144 0.25424904 0.47006916
v 0.40405144 0.21165996 0.47006916
v 0.41155747 0.24847676 0.43985831
v 0.11210667 0.23903504 0.62882189
v 0.11210667 0.22687396 0.62882189
v 0.11210667 0.21598389 0.62547806
v 0.11210667 0.24992511 0.62547806
v 0.17175980 0.23903504 0.61171408
v 0.17175980 0.22687396 0.61171408
v 0.28237487 0.21164307 0.55521939
v 0.28237487 0.25426593 0.55521939
v 0.42836923 0.25353543 0.43985831
v 0.42836923 0.21237357 0.43985831
v 0.42836923 0.25318073 0.44572940
v 0.42836923 0.21272827 0.44572940
v 0.04648384 0.24542804 0.63440136
v 0.04648384 0.22048096 0.63440136
v 0.31296961 0.24544071 0.54927056
v 0.31296961 0.22046829 0.54927056
v 0.19726273 0.21687064 0.60020517
v 0.19726273 0.24903836 0.60020517
v 0.19726273 0.25391546 0.59170960
v 0.19726273 0.21199354 0.59170960
v 0.28149698 0.21660884 0.56717543
v 0.28149698 0.24930016 0.56717543
v 0.36753092 0.25450240 0.49440889
v 0.36753092 0.21140660 0.49440889
v 0.42209224 0.25353543 0.43985831
v 0.13642443 0.23903504 0.62429222
v 0.13642443 0.22687396 0.62429222
v 0.43978188 0.21620769 0.43985831
v 0.43978188 0.24970131 0.43985831
v 0.42779858 0.21701421 0.45700499
v 0.42779858 0.24889479 0.45700499
v 0.36305364 0.24722265 0.51375238
v 0.36305364 0.21868635 0.51375238
v 0.40352469 0.24974354 0.48208350
v 0.40352469 0.21616546 0.48208350
v 0.36726755 0.21558275 0.50677318
v 0.36726755 0.25032625 0.50677318
v 0.43771881 0.21760959 0.44572940
v 0.43771881 0.24829941 0.44572940
v 0.04714226 0.23903504 0.63444023
v 0.04714226 0.22687396 0.63444023
v 0.30673652 0.25270357 0.54304951
v 0.30673652 0.21320543 0.54304951
v 0.44553209 0.22608856 0.43985831
f 2 1 131
f 2 131 64
f 2 64 156
f 2 156 140
f 2 140 45
f 2 45 160
f 2 160 3
f 2 3 4
f 2 4 175
f 2 175 159
f 2 159 141
f 2 141 65
f 2 65 54
f 2 54 57
f 2 57 1
f 1 57 131
f 65 141 55
f 65 55 54
f 54 55 50
f 54 50 58
f 54 58 59
f 54 59 51
f 54 51 62
f 54 62 53
f 54 53 52
f 54 52 60
f 54 60 61
f 54 61 56
f 54 56 63
f 54 63 57
f 131 57 64
f 57 63 156
f 57 156 64
f 141 159 143
f 141 143 47
f 141 47 130
f 141 130 50
f 141 50 94
f 141 94 55
f 55 94 50
f 63 56 156
f 156 129 140
f 156 56 61
f 156 61 60
f 156 60 129
f 159 175 169
f 159 169 161
f 159 161 102
f 159 102 143
f 143 102 47
f 47 102 130
f 130 102 166
f 130 166 14
f 130 14 71
f 130 71 155
f 130 155 50
f 50 76 95
f 50 95 58
f 50 155 20
f 50 20 76
f 129 165 101
f 129 101 46
f 129 46 140
f 129 60 154
f 129 154 70
f 129 70 13
f 129 13 165
f 140 46 142
f 140 142 45
f 60 52 93
f 60 93 77
f 60 77 19
f 60 19 154
f 175 4 119
f 175 119 169
f 169 119 5
f 169 5 161
f 161 5 102
f 102 99 166
f 102 5 99
f 166 99 68
f 166 68 118
f 166 118 167
f 166 167 14
f 14 167 21
f 14 21 174
f 14 174 32
f 14 32 71
f 71 32 115
f 71 115 155
f 155 115 138
f 155 138 20
f 76 151 75
f 76 75 134
f 76 134 9
f 76 9 95
f 76 20 80
f 76 80 123
f 76 123 151
f 95 9 58
f 58 92 59
f 58 9 134
f 58 134 75
f 58 75 92
f 20 138 80
f 165 100 101
f 165 13 168
f 165 168 117
f 165 117 69
f 165 69 100
f 101 100 6
f 101 6 162
f 101 162 160
f 101 160 45
f 101 45 142
f 101 142 46
f 154 19 139
f 154 139 116
f 154 116 70
f 70 116 31
f 70 31 13
f 13 31 173
f 13 173 22
f 13 22 168
f 52 53 135
f 52 135 8
f 52 8 93
f 93 8 77
f 77 8 135
f 77 135 78
f 77 78 150
f 77 150 126
f 77 126 81
f 77 81 19
f 19 81 139
f 4 89 119
f 4 3 88
f 4 88 89
f 119 89 36
f 119 36 114
f 119 114 5
f 5 114 38
f 5 38 99
f 99 38 108
f 99 108 68
f 68 164 118
f 68 108 85
f 68 85 147
f 68 147 164
f 118 164 109
f 118 109 24
f 118 24 167
f 167 24 21
f 21 24 152
f 21 152 34
f 21 34 32
f 21 32 174
f 32 123 138
f 32 138 115
f 32 34 152
f 32 152 29
f 32 29 125
f 32 125 148
f 32 148 103
f 32 103 123
f 138 123 80
f 151 103 18
f 151 18 75
f 151 123 103
f 75 18 15
f 75 15 79
f 75 79 145
f 75 145 44
f 75 44 128
f 75 128 12
f 75 12 92
f 92 12 59
f 59 12 128
f 59 128 44
f 59 44 145
f 59 145 10
f 59 10 7
f 59 7 51
f 100 37 6
f 100 69 107
f 100 107 37
f 168 22 23
f 168 23 117
f 117 163 69
f 117 23 110
f 117 110 163
f 69 84 107
f 69 163 146
f 69 146 84
f 6 113 120
f 6 120 170
f 6 170 162
f 6 37 113
f 162 170 160
f 160 170 3
f 139 81 126
f 139 126 31
f 139 31 116
f 31 124 28
f 31 28 153
f 31 153 33
f 31 33 22
f 31 22 173
f 31 126 104
f 31 104 149
f 31 149 124
f 22 33 153
f 22 153 23
f 53 62 96
f 53 96 78
f 53 78 135
f 78 74 16
f 78 16 17
f 78 17 150
f 78 96 11
f 78 11 127
f 78 127 43
f 78 43 144
f 78 144 74
f 150 17 104
f 150 104 126
f 89 88 35
f 89 35 36
f 3 170 120
f 3 120 88
f 36 35 113
f 36 113 114
f 114 113 37
f 114 37 38
f 38 37 107
f 38 107 108
f 108 107 84
f 108 84 85
f 164 147 109
f 85 84 82
f 85 82 83
f 85 83 147
f 147 49 67
f 147 67 112
f 147 112 73
f 147 73 109
f 147 83 49
f 109 73 24
f 24 73 152
f 152 73 29
f 29 73 97
f 29 97 90
f 29 90 106
f 29 106 125
f 125 106 148
f 148 106 15
f 148 15 18
f 148 18 103
f 15 158 79
f 15 106 86
f 15 86 158
f 79 74 132
f 79 132 133
f 79 133 145
f 79 158 157
f 79 157 74
f 145 172 42
f 145 42 10
f 145 133 172
f 51 7 144
f 51 144 43
f 51 43 127
f 51 127 62
f 10 42 41
f 10 41 7
f 23 153 72
f 23 72 110
f 163 110 146
f 110 72 146
f 84 146 82
f 146 72 111
f 146 111 66
f 146 66 48
f 146 48 82
f 113 35 120
f 120 35 88
f 124 149 105
f 124 105 28
f 28 72 153
f 28 105 91
f 28 91 98
f 28 98 72
f 104 17 149
f 149 17 16
f 149 16 105
f 62 127 11
f 62 11 96
f 74 144 132
f 74 157 16
f 16 157 87
f 16 87 105
f 144 7 41
f 144 41 171
f 144 171 132
f 83 82 48
f 83 48 49
f 49 48 66
f 49 66 67
f 67 66 111
f 67 111 112
f 112 26 73
f 112 111 25
f 112 25 26
f 73 26 30
f 73 30 122
f 73 122 137
f 73 137 40
f 73 40 97
f 97 40 158
f 97 158 90
f 90 158 86
f 90 86 106
f 158 40 39
f 158 39 157
f 133 132 171
f 133 171 172
f 172 171 41
f 172 41 42
f 72 27 25
f 72 25 111
f 72 98 39
f 72 39 136
f 72 136 121
f 72 121 27
f 105 87 91
f 91 87 157
f 91 157 98
f 98 157 39
f 26 25 27
f 26 27 30
f 30 27 121
f 30 121 122
f 122 121 136
f 122 136 137
f 137 136 39
f 137 39 40
@@ -0,0 +1,537 @@
# https://github.com/mikedh/trimesh
v 0.52047872 0.24698563 0.34411301
v 0.52047872 0.21892337 0.34411301
v 0.56833285 0.22070477 0.24504662
v 0.56833285 0.24520423 0.24504662
v 0.58488330 0.23903494 0.20243916
v 0.58488330 0.22687406 0.20243916
v 0.58654231 0.21154391 0.12941516
v 0.58654231 0.25436509 0.12941516
v 0.58654231 0.25362883 0.14160608
v 0.58654231 0.21228017 0.14160608
v 0.55004441 0.25436932 0.25104082
v 0.55004441 0.25291797 0.26323175
v 0.55004441 0.21299103 0.26323175
v 0.55004441 0.21153968 0.25104082
v 0.51354651 0.25373462 0.33621526
v 0.51354651 0.21217438 0.33621526
v 0.60953126 0.23903494 0.03209031
v 0.60953126 0.22687406 0.03209031
v 0.48923431 0.21220400 0.37270699
v 0.48923431 0.25370500 0.37270699
v 0.61049897 0.23903494 0.04428124
v 0.61049897 0.22687406 0.04428124
v 0.45273641 0.21134081 0.40919876
v 0.45273641 0.25456819 0.40919876
v 0.53244719 0.21928727 0.31932617
v 0.53244719 0.24662173 0.31932617
v 0.60599599 0.24781074 0.08077299
v 0.60599599 0.21809826 0.08077299
v 0.41159728 0.24847929 0.43985831
v 0.60710199 0.24929594 0.06858206
v 0.60710199 0.21661306 0.06858206
v 0.60765500 0.21612222 0.04428124
v 0.60765500 0.24978678 0.04428124
v 0.40902976 0.24660058 0.43985831
v 0.40902976 0.21930842 0.43985831
v 0.47710786 0.25039186 0.39688631
v 0.47710786 0.21551714 0.39688631
v 0.46152516 0.24831427 0.41847354
v 0.46152516 0.21759473 0.41847354
v 0.60903750 0.23903494 0.02613661
v 0.60903750 0.22687406 0.02613661
v 0.55792461 0.24794191 0.26323175
v 0.55792461 0.21796709 0.26323175
v 0.60522573 0.24624937 0.08919728
v 0.60522573 0.21965963 0.08919728
v 0.48465232 0.24755263 0.39271469
v 0.48465232 0.21835637 0.39271469
v 0.58022231 0.22002775 0.02613661
v 0.58022231 0.24588125 0.02613661
v 0.60716124 0.21645650 0.03209031
v 0.60716124 0.24945250 0.03209031
v 0.54441566 0.21970617 0.29457981
v 0.54441566 0.24620283 0.29457981
v 0.53416544 0.21724353 0.31187390
v 0.53416544 0.24866547 0.31187390
v 0.44558694 0.22609126 0.43985831
v 0.51394151 0.21573717 0.34824417
v 0.51394151 0.25017183 0.34824417
v 0.54607467 0.24835658 0.28753258
v 0.54607467 0.21755242 0.28753258
v 0.59870828 0.25427200 0.03209031
v 0.59870828 0.21149737 0.04428124
v 0.59870828 0.25411121 0.02613661
v 0.59870828 0.25417044 0.06858206
v 0.59870828 0.21173856 0.06858206
v 0.59870828 0.21179779 0.02613661
v 0.59870828 0.25441163 0.04428124
v 0.59870828 0.21163700 0.03209031
v 0.59870828 0.25445818 0.05643165
v 0.59870828 0.21145082 0.05643165
v 0.56221038 0.21343532 0.23889041
v 0.56221038 0.25431854 0.22673998
v 0.56221038 0.21159046 0.22673998
v 0.56221038 0.25247368 0.23889041
v 0.47307887 0.24803923 0.40559413
v 0.47307887 0.21786977 0.40559413
v 0.52571248 0.25356113 0.31187390
v 0.52571248 0.21234787 0.31187390
v 0.50070902 0.24850891 0.37169446
v 0.50070902 0.21740009 0.37169446
v 0.45340790 0.21493745 0.42207820
v 0.59544951 0.21623224 0.12941516
v 0.59544951 0.24967676 0.12941516
v 0.61075575 0.23903494 0.05643165
v 0.61075575 0.22687406 0.05643165
v 0.42210424 0.25353574 0.43985831
v 0.57986680 0.23903494 0.21989526
v 0.57986680 0.22687406 0.21989526
v 0.52217721 0.24889396 0.33621526
v 0.52217721 0.21701504 0.33621526
v 0.50140027 0.21159469 0.34836567
v 0.50140027 0.25431431 0.34836567
v 0.50140027 0.25282488 0.36055658
v 0.50140027 0.21308412 0.36055658
v 0.51192699 0.23903494 0.36055658
v 0.51192699 0.22687406 0.36055658
v 0.49620604 0.24679945 0.37983525
v 0.49620604 0.21910955 0.37983525
v 0.46490237 0.21152276 0.39704831
v 0.46490237 0.25438624 0.39704831
v 0.42840448 0.25391656 0.43354008
v 0.42840448 0.21237326 0.43985831
v 0.42840448 0.25353574 0.43985831
v 0.42840448 0.21199244 0.43354008
v 0.46531713 0.25084884 0.40948226
v 0.46531713 0.21506016 0.40948226
v 0.60777349 0.21605452 0.05643165
v 0.60777349 0.24985448 0.05643165
v 0.57127559 0.23903494 0.23889041
v 0.57127559 0.22687406 0.23889041
v 0.60299400 0.21424774 0.02613661
v 0.51759523 0.23903494 0.35107926
v 0.51759523 0.22687406 0.35107926
v 0.44979367 0.24828465 0.43131252
v 0.44979367 0.21762435 0.43131252
v 0.50775976 0.22018008 0.36695580
v 0.50775976 0.24572892 0.36695580
v 0.50789801 0.23903494 0.36711780
v 0.50789801 0.22687406 0.36711780
v 0.43981995 0.21620685 0.43985831
v 0.43981995 0.24970215 0.43985831
v 0.60810923 0.24391790 0.02613661
v 0.59266478 0.23903494 0.16003420
v 0.59266478 0.22687406 0.16003420
v 0.44584368 0.23903494 0.43985831
v 0.44584368 0.22687406 0.43985831
v 0.59321778 0.21937189 0.15375649
v 0.59321778 0.24653711 0.15375649
v 0.50969526 0.21798401 0.36055658
v 0.50969526 0.24792499 0.36055658
v 0.48891832 0.24963868 0.38429040
v 0.48891832 0.21627032 0.38429040
v 0.59432378 0.21729854 0.14160608
v 0.59432378 0.24861046 0.14160608
v 0.52091324 0.23903494 0.34500404
v 0.52091324 0.22687406 0.34500404
v 0.56835261 0.23903494 0.24508712
v 0.56835261 0.22687406 0.24508712
v 0.57437634 0.25411121 0.20243916
v 0.57437634 0.25426776 0.19024825
v 0.57437634 0.21164124 0.19024825
v 0.57437634 0.21179779 0.20243916
v 0.48538309 0.23903494 0.39360572
v 0.48538309 0.22687406 0.39360572
v 0.53787845 0.21261867 0.28753258
v 0.53787845 0.25329033 0.28753258
v 0.53787845 0.21151430 0.27538216
v 0.53787845 0.25439470 0.27538216
v 0.58600903 0.25039186 0.02613661
v 0.58600903 0.21551714 0.02613661
v 0.60692426 0.21670192 0.02613661
v 0.60692426 0.24920708 0.02613661
v 0.60720076 0.23903494 0.08077299
v 0.60720076 0.22687406 0.08077299
v 0.59272402 0.21300796 0.02613661
v 0.47706834 0.25414929 0.38485740
v 0.47706834 0.21175971 0.38485740
v 0.44057044 0.25434816 0.42138967
v 0.44057044 0.21156084 0.42138967
v 0.58275030 0.21800940 0.02613661
v 0.57263833 0.21599952 0.22673998
v 0.57263833 0.24990948 0.22673998
v 0.60941277 0.23903494 0.06858206
v 0.60941277 0.22687406 0.06858206
v 0.44167645 0.21496284 0.43463361
v 0.46286814 0.23903494 0.42005314
v 0.46286814 0.22687406 0.42005314
v 0.41653477 0.25103925 0.43985831
v 0.41653477 0.21486975 0.43985831
v 0.56979436 0.24746800 0.23889041
v 0.56979436 0.21844100 0.23889041
v 0.58156529 0.24748493 0.21203799
v 0.58156529 0.21842407 0.21203799
v 0.58211830 0.23903494 0.21382004
v 0.58211830 0.22687406 0.21382004
v 0.59264502 0.22073015 0.15995320
v 0.59264502 0.24517885 0.15995320
v 0.43543545 0.25199554 0.43985831
v 0.58267130 0.24919862 0.20243916
v 0.58267130 0.21671038 0.20243916
f 84 85 22
f 84 22 21
f 84 21 33
f 84 33 108
f 84 108 30
f 84 30 163
f 84 163 164
f 84 164 85
f 85 107 32
f 85 32 22
f 85 164 31
f 85 31 107
f 21 22 18
f 21 18 17
f 21 17 122
f 21 122 152
f 21 152 51
f 21 51 33
f 33 51 63
f 33 63 61
f 33 61 67
f 33 67 108
f 108 69 64
f 108 64 30
f 108 67 69
f 30 83 179
f 30 179 134
f 30 134 27
f 30 27 163
f 30 64 9
f 30 9 83
f 163 27 44
f 163 44 177
f 163 177 153
f 163 153 154
f 163 154 164
f 107 70 62
f 107 62 32
f 107 31 65
f 107 65 70
f 32 62 68
f 32 68 66
f 32 66 111
f 32 111 50
f 32 50 22
f 22 50 151
f 22 151 18
f 164 154 176
f 164 176 45
f 164 45 28
f 164 28 31
f 31 28 133
f 31 133 180
f 31 180 82
f 31 82 10
f 31 10 65
f 17 18 41
f 17 41 40
f 17 40 122
f 122 40 41
f 122 41 151
f 122 151 111
f 122 111 66
f 122 66 155
f 122 155 150
f 122 150 160
f 122 160 48
f 122 48 49
f 122 49 149
f 122 149 63
f 122 63 152
f 152 63 51
f 63 149 86
f 63 86 101
f 63 101 61
f 61 101 158
f 61 158 24
f 61 24 67
f 67 24 69
f 69 24 148
f 69 148 11
f 69 11 8
f 69 8 64
f 64 8 139
f 64 139 9
f 83 9 179
f 179 139 162
f 179 162 172
f 179 172 177
f 179 177 128
f 179 128 134
f 179 9 139
f 134 128 27
f 27 128 44
f 44 128 177
f 177 172 5
f 177 5 123
f 177 123 153
f 153 123 124
f 153 124 154
f 70 65 7
f 70 7 14
f 70 14 147
f 70 147 23
f 70 23 62
f 62 23 68
f 65 10 142
f 65 142 7
f 68 23 159
f 68 159 104
f 68 104 66
f 66 104 155
f 111 151 50
f 151 41 18
f 154 124 176
f 176 124 6
f 176 6 173
f 176 173 180
f 176 180 127
f 176 127 45
f 45 127 28
f 28 127 133
f 133 127 180
f 180 173 161
f 180 161 142
f 180 142 10
f 180 10 82
f 149 49 34
f 149 34 29
f 149 29 168
f 149 168 86
f 86 168 29
f 86 29 34
f 86 34 35
f 86 35 169
f 86 169 102
f 86 102 120
f 86 120 56
f 86 56 126
f 86 126 125
f 86 125 121
f 86 121 178
f 86 178 103
f 86 103 101
f 101 103 158
f 158 103 24
f 24 103 178
f 24 178 100
f 24 100 92
f 24 92 148
f 148 92 15
f 148 15 11
f 11 72 8
f 11 15 72
f 8 72 140
f 8 140 139
f 139 72 77
f 139 77 146
f 139 146 12
f 139 12 74
f 139 74 162
f 139 140 72
f 162 170 172
f 162 74 12
f 162 12 146
f 162 146 89
f 162 89 55
f 162 55 59
f 162 59 42
f 162 42 170
f 172 87 174
f 172 174 5
f 172 170 4
f 172 4 87
f 5 174 175
f 5 175 6
f 5 6 124
f 5 124 123
f 7 142 141
f 7 141 73
f 7 73 14
f 14 73 16
f 14 16 147
f 147 16 91
f 147 91 23
f 23 99 102
f 23 102 159
f 23 91 99
f 142 161 71
f 142 71 13
f 142 13 145
f 142 145 78
f 142 78 73
f 142 73 141
f 159 102 104
f 104 102 169
f 104 169 155
f 155 169 150
f 6 175 173
f 173 175 88
f 173 88 3
f 173 3 171
f 173 171 161
f 161 171 43
f 161 43 60
f 161 60 54
f 161 54 90
f 161 90 145
f 161 145 13
f 161 13 71
f 49 48 35
f 49 35 34
f 178 121 105
f 178 105 20
f 178 20 156
f 178 156 100
f 100 156 92
f 92 156 20
f 92 20 15
f 15 20 93
f 15 93 58
f 15 58 89
f 15 89 77
f 15 77 72
f 77 89 146
f 170 42 1
f 170 1 26
f 170 26 53
f 170 53 4
f 89 58 1
f 89 1 55
f 55 1 59
f 59 1 42
f 87 88 175
f 87 175 174
f 87 4 109
f 87 109 110
f 87 110 88
f 4 137 109
f 4 53 135
f 4 135 137
f 73 78 16
f 16 78 90
f 16 90 57
f 16 57 94
f 16 94 19
f 16 19 91
f 91 19 157
f 91 157 99
f 99 157 102
f 102 157 81
f 102 81 165
f 102 165 120
f 145 90 78
f 169 35 150
f 150 35 160
f 88 110 3
f 3 110 138
f 3 138 136
f 3 136 52
f 3 52 171
f 171 52 25
f 171 25 2
f 171 2 43
f 43 2 60
f 60 2 54
f 54 2 90
f 90 2 57
f 48 160 35
f 121 125 114
f 121 114 38
f 121 38 105
f 105 36 20
f 105 38 36
f 20 36 93
f 93 130 58
f 93 36 131
f 93 131 79
f 93 79 130
f 58 130 1
f 1 112 135
f 1 135 53
f 1 53 26
f 1 130 117
f 1 117 112
f 109 137 138
f 109 138 110
f 137 135 136
f 137 136 138
f 135 112 113
f 135 113 136
f 57 2 129
f 57 129 94
f 94 129 80
f 94 80 132
f 94 132 37
f 94 37 19
f 19 37 106
f 19 106 157
f 157 106 81
f 120 165 81
f 120 81 106
f 120 106 39
f 120 39 115
f 120 115 56
f 136 113 2
f 136 2 52
f 52 2 25
f 2 113 116
f 2 116 129
f 125 126 167
f 125 167 166
f 125 166 117
f 125 117 97
f 125 97 46
f 125 46 75
f 125 75 38
f 125 38 114
f 38 75 36
f 36 75 131
f 130 79 117
f 131 75 46
f 131 46 97
f 131 97 79
f 79 97 117
f 112 117 95
f 112 95 96
f 112 96 113
f 117 166 143
f 117 143 118
f 117 118 95
f 129 116 80
f 80 116 98
f 80 98 132
f 132 98 47
f 132 47 76
f 132 76 37
f 37 76 39
f 37 39 106
f 56 115 39
f 56 39 76
f 56 76 47
f 56 47 126
f 113 96 116
f 116 119 144
f 116 144 167
f 116 167 126
f 116 126 98
f 116 96 119
f 126 47 98
f 166 167 144
f 166 144 143
f 95 118 119
f 95 119 96
f 143 144 119
f 143 119 118
@@ -0,0 +1,543 @@
# https://github.com/mikedh/trimesh
v -0.28939516 0.25356113 0.55521823
v -0.28939516 0.21234787 0.55521823
v -0.28939516 0.21724353 0.56364458
v -0.28939516 0.24866547 0.56364458
v -0.39597820 0.24831427 0.49102380
v -0.39597820 0.21759473 0.49102380
v -0.37455609 0.21152276 0.49439830
v -0.37455609 0.25438624 0.49439830
v -0.00259062 0.23903494 0.63845584
v -0.00259062 0.24598280 0.60968383
v -0.00259062 0.24767534 0.61179537
v -0.00259062 0.25267255 0.62120843
v -0.00259062 0.25408582 0.62821396
v -0.00259062 0.21182318 0.62821396
v -0.00259062 0.24473455 0.63737050
v -0.00259062 0.25203362 0.63180553
v -0.00259062 0.21992620 0.60968383
v -0.00259062 0.22687406 0.63845584
v -0.00259062 0.21674423 0.63636406
v -0.00259062 0.25056957 0.61558425
v -0.00259062 0.21533943 0.61558425
v -0.00259062 0.24916477 0.63636406
v -0.26505188 0.21261867 0.56737430
v -0.26505188 0.24835658 0.57556389
v -0.26505188 0.21755242 0.57556389
v -0.26505188 0.25329033 0.56737430
v -0.35021281 0.21220400 0.51873020
v -0.35021281 0.25370500 0.51873020
v -0.03395290 0.23903494 0.64027140
v -0.03395290 0.21605452 0.63727181
v -0.03395290 0.24985448 0.63727181
v -0.03395290 0.22687406 0.64027140
v -0.03395290 0.25445818 0.62821396
v -0.03395290 0.21145082 0.62821396
v -0.11911384 0.23903494 0.62553016
v -0.11911384 0.21729854 0.62383305
v -0.11911384 0.24861046 0.62383305
v -0.11911384 0.22687406 0.62553016
v -0.11911384 0.25362883 0.61603816
v -0.11911384 0.21228017 0.61603816
v -0.20427479 0.25431854 0.59170623
v -0.20427479 0.24990525 0.60212574
v -0.20427479 0.21600375 0.60212574
v -0.20427479 0.21159046 0.59170623
v -0.18954709 0.24748493 0.61106521
v -0.18954709 0.21842407 0.61106521
v -0.22865866 0.23903494 0.59496232
v -0.22865866 0.22687406 0.59496232
v -0.34461386 0.23903494 0.53739850
v -0.34461386 0.22687406 0.53739850
v -0.24070858 0.25291797 0.57955013
v -0.24070858 0.24794191 0.58742399
v -0.24070858 0.21796709 0.58742399
v -0.24070858 0.21299103 0.57955013
v -0.32586953 0.21159469 0.53090603
v -0.32586953 0.25431431 0.53090603
v -0.41103049 0.25391656 0.45791027
v -0.41103049 0.21199244 0.45791027
v -0.00960962 0.25427200 0.62821396
v -0.00960962 0.21645650 0.63666007
v -0.00960962 0.24945250 0.63666007
v -0.00960962 0.21163700 0.62821396
v -0.17993151 0.23903494 0.61438050
v -0.17993151 0.25411121 0.60388206
v -0.17993151 0.24919862 0.61217031
v -0.17993151 0.21671038 0.61217031
v -0.17993151 0.21179779 0.60388206
v -0.17993151 0.22687406 0.61438050
v -0.36177588 0.24963868 0.51841447
v -0.36177588 0.21627032 0.51841447
v -0.32160947 0.24698563 0.54998872
v -0.32160947 0.21892337 0.54998872
v -0.21636530 0.23903494 0.60078384
v -0.21636530 0.21343532 0.59170623
v -0.21636530 0.24746800 0.59928405
v -0.21636530 0.21844100 0.59928405
v -0.21636530 0.25247368 0.59170623
v -0.21636530 0.22687406 0.60078384
v -0.41212591 0.25094616 0.47117147
v -0.27207085 0.21970617 0.57390623
v -0.27207085 0.24620283 0.57390623
v -0.34919850 0.24850891 0.53021535
v -0.34919850 0.21740009 0.53021535
v -0.22253226 0.22070477 0.59782373
v -0.22253226 0.24520423 0.59782373
v -0.39954856 0.25097155 0.48289342
v -0.32858787 0.23903494 0.54708785
v -0.32858787 0.22687406 0.54708785
v -0.38697122 0.25084884 0.49481269
v -0.38697122 0.21506016 0.49481269
v -0.06669463 0.24624937 0.63472616
v -0.06669463 0.21965963 0.63472616
v -0.37439380 0.25039186 0.50661358
v -0.37439380 0.21551714 0.50661358
v -0.04608396 0.23903494 0.63890978
v -0.04608396 0.24929594 0.63660090
v -0.04608396 0.25417044 0.62821396
v -0.04608396 0.21173856 0.62821396
v -0.04608396 0.21661306 0.63660090
v -0.04608396 0.22687406 0.63890978
v -0.13124492 0.21937189 0.62270820
v -0.13124492 0.24653711 0.62270820
v -0.38672778 0.21134081 0.48224220
v -0.38672778 0.25456819 0.48224220
v -0.38433398 0.23903494 0.50363378
v -0.38433398 0.22687406 0.50363378
v -0.25365110 0.23903494 0.58310226
v -0.25365110 0.22687406 0.58310226
v -0.19741810 0.23903494 0.60936806
v -0.19741810 0.22687406 0.60936806
v -0.36238447 0.25414929 0.50657413
v -0.36238447 0.21175971 0.50657413
v -0.34445157 0.22018008 0.53726036
v -0.34445157 0.24572892 0.53726036
v -0.35731296 0.24679945 0.52569627
v -0.35731296 0.21910955 0.52569627
v -0.13745246 0.22073015 0.62213590
v -0.13745246 0.24517885 0.62213590
v -0.32250206 0.23903494 0.55040314
v -0.32250206 0.22687406 0.55040314
v -0.25288022 0.21151430 0.56737430
v -0.25288022 0.25439470 0.56737430
v -0.33804118 0.21798401 0.53919427
v -0.33804118 0.23903494 0.54142423
v -0.33804118 0.22687406 0.54142423
v -0.33804118 0.24792499 0.53919427
v -0.33804118 0.25282488 0.53090603
v -0.33804118 0.21308412 0.53090603
v -0.02178126 0.23903494 0.63999512
v -0.02178126 0.21149737 0.62821396
v -0.02178126 0.25441163 0.62821396
v -0.02178126 0.22687406 0.63999512
v -0.02178126 0.21612222 0.63715346
v -0.02178126 0.24978678 0.63715346
v -0.10694220 0.21154391 0.61603816
v -0.10694220 0.25436509 0.61603816
v -0.10694220 0.21623224 0.62493815
v -0.10694220 0.24967676 0.62493815
v -0.29681986 0.21928727 0.56194747
v -0.29681986 0.24662173 0.56194747
v -0.24728128 0.22017585 0.58586498
v -0.24728128 0.24573315 0.58586498
v -0.22853694 0.25436932 0.57955013
v -0.22853694 0.21153968 0.57955013
v -0.31369790 0.25373462 0.54304241
v -0.31369790 0.24889396 0.55168583
v -0.31369790 0.21701504 0.55168583
v -0.31369790 0.21217438 0.54304241
v -0.32574781 0.21573717 0.54343707
v -0.32574781 0.25017183 0.54343707
v -0.39885883 0.25434816 0.47006637
v -0.39885883 0.21156084 0.47006637
v -0.41707573 0.25355267 0.45791027
v -0.41707573 0.23903494 0.47559189
v -0.41707573 0.24655403 0.43868943
v -0.41707573 0.24976985 0.46941515
v -0.41707573 0.21613915 0.46941515
v -0.41707573 0.21396847 0.46527104
v -0.41707573 0.21935497 0.43868943
v -0.41707573 0.21740432 0.44135354
v -0.41707573 0.22649747 0.47545375
v -0.41707573 0.22687406 0.47559189
v -0.41707573 0.21235633 0.45189142
v -0.41707573 0.21235633 0.45791027
v -0.41707573 0.21497553 0.44605021
v -0.41707573 0.25093347 0.44605021
v -0.16775985 0.25426776 0.60388206
v -0.16775985 0.21164124 0.60388206
v -0.37021489 0.24755263 0.51413222
v -0.37021489 0.21835637 0.51413222
v -0.19133227 0.23903494 0.61161774
v -0.19133227 0.22687406 0.61161774
v -0.38307627 0.24803923 0.50258786
v -0.38307627 0.21786977 0.50258786
v -0.40879901 0.24828465 0.47928212
v -0.40879901 0.21762435 0.47928212
v -0.05825561 0.24781074 0.63549576
v -0.05825561 0.21809826 0.63549576
v -0.39756052 0.23903494 0.49236570
v -0.39756052 0.22687406 0.49236570
v -0.35069967 0.23903494 0.53222820
v -0.35069967 0.22687406 0.53222820
f 159 160 165
f 159 165 163
f 159 163 164
f 159 164 158
f 159 158 157
f 159 157 161
f 159 161 162
f 159 162 154
f 159 154 156
f 159 156 153
f 159 153 166
f 159 166 155
f 159 155 10
f 159 10 17
f 159 17 21
f 159 21 160
f 160 21 165
f 155 166 20
f 155 20 11
f 155 11 10
f 17 10 11
f 17 11 20
f 17 20 12
f 17 12 13
f 17 13 16
f 17 16 22
f 17 22 15
f 17 15 9
f 17 9 18
f 17 18 19
f 17 19 14
f 17 14 21
f 21 14 163
f 21 163 165
f 166 153 57
f 166 57 12
f 166 12 20
f 14 19 60
f 14 60 133
f 14 133 62
f 14 62 58
f 14 58 163
f 163 58 164
f 153 156 79
f 153 79 86
f 153 86 111
f 153 111 8
f 153 8 104
f 153 104 151
f 153 151 57
f 57 151 59
f 57 59 13
f 57 13 12
f 19 18 132
f 19 132 60
f 60 132 133
f 133 130 62
f 133 132 32
f 133 32 30
f 133 30 130
f 62 130 103
f 62 103 152
f 62 152 58
f 58 152 164
f 164 152 103
f 164 103 158
f 156 154 175
f 156 175 5
f 156 5 89
f 156 89 86
f 156 86 79
f 86 89 111
f 111 89 28
f 111 28 56
f 111 56 8
f 8 56 104
f 104 56 122
f 104 122 33
f 104 33 131
f 104 131 59
f 104 59 151
f 59 131 134
f 59 134 13
f 13 134 16
f 18 9 129
f 18 129 132
f 132 129 29
f 132 29 32
f 130 30 34
f 130 34 103
f 32 29 95
f 32 95 100
f 32 100 99
f 32 99 30
f 30 99 98
f 30 98 34
f 103 7 158
f 103 34 121
f 103 121 55
f 103 55 7
f 158 7 112
f 158 112 27
f 158 27 90
f 158 90 157
f 154 162 180
f 154 180 179
f 154 179 114
f 154 114 115
f 154 115 169
f 154 169 173
f 154 173 5
f 154 5 175
f 5 173 93
f 5 93 89
f 89 93 28
f 28 93 127
f 28 127 145
f 28 145 56
f 56 145 122
f 122 145 143
f 122 143 33
f 33 31 131
f 33 143 136
f 33 136 97
f 33 97 31
f 131 31 134
f 134 31 29
f 134 29 129
f 134 129 61
f 134 61 16
f 16 61 22
f 9 15 129
f 129 15 22
f 129 22 61
f 34 98 135
f 34 135 144
f 34 144 121
f 29 31 96
f 29 96 95
f 100 38 117
f 100 117 92
f 100 92 178
f 100 178 99
f 100 95 35
f 100 35 38
f 99 178 36
f 99 36 66
f 99 66 137
f 99 137 40
f 99 40 98
f 98 40 67
f 98 67 135
f 7 55 112
f 121 148 55
f 121 144 148
f 55 148 27
f 55 27 112
f 157 6 176
f 157 176 161
f 157 90 6
f 27 94 90
f 27 148 128
f 27 128 94
f 90 94 6
f 162 161 6
f 162 6 174
f 162 174 170
f 162 170 116
f 162 116 113
f 162 113 180
f 179 180 106
f 179 106 105
f 179 105 114
f 114 82 115
f 114 105 181
f 114 181 49
f 114 49 124
f 114 124 87
f 114 87 71
f 114 71 126
f 114 126 82
f 115 82 169
f 169 82 69
f 169 69 173
f 173 69 93
f 93 69 127
f 127 126 150
f 127 150 145
f 127 69 82
f 127 82 126
f 145 150 146
f 145 146 1
f 145 1 41
f 145 41 143
f 143 41 136
f 31 97 96
f 136 41 167
f 136 167 64
f 136 64 97
f 97 64 39
f 97 39 96
f 135 67 168
f 135 168 44
f 135 44 144
f 144 44 148
f 96 138 65
f 96 65 37
f 96 37 177
f 96 177 95
f 96 39 138
f 95 177 91
f 95 91 118
f 95 118 35
f 38 35 63
f 38 63 68
f 38 68 117
f 117 101 92
f 117 68 46
f 117 46 66
f 117 66 101
f 92 101 178
f 178 101 36
f 36 101 66
f 66 46 43
f 66 43 67
f 66 67 40
f 66 40 137
f 67 43 74
f 67 74 54
f 67 54 23
f 67 23 2
f 67 2 44
f 67 44 168
f 148 147 149
f 148 149 128
f 148 44 2
f 148 2 147
f 6 161 176
f 6 94 174
f 94 128 70
f 94 70 174
f 128 149 123
f 128 123 83
f 128 83 70
f 174 70 170
f 170 70 83
f 170 83 116
f 116 83 113
f 113 50 182
f 113 182 106
f 113 106 180
f 113 83 123
f 113 123 72
f 113 72 88
f 113 88 125
f 113 125 50
f 105 106 182
f 105 182 181
f 181 182 50
f 181 50 49
f 49 50 125
f 49 125 124
f 124 125 88
f 124 88 87
f 87 88 120
f 87 120 119
f 87 119 71
f 71 119 81
f 71 81 140
f 71 140 75
f 71 75 52
f 71 52 24
f 71 24 4
f 71 4 146
f 71 146 150
f 71 150 126
f 146 4 42
f 146 42 26
f 146 26 1
f 1 26 64
f 1 64 41
f 41 64 167
f 64 26 51
f 64 51 77
f 64 77 42
f 64 42 65
f 64 65 39
f 39 65 138
f 65 118 102
f 65 102 37
f 65 42 45
f 65 45 118
f 37 102 177
f 177 102 91
f 91 102 118
f 118 45 63
f 118 63 35
f 68 172 46
f 68 63 171
f 68 171 172
f 46 172 110
f 46 110 84
f 46 84 76
f 46 76 43
f 43 76 53
f 43 53 25
f 43 25 3
f 43 3 147
f 43 147 23
f 43 23 54
f 43 54 74
f 23 147 2
f 147 72 149
f 147 3 72
f 149 72 123
f 72 3 25
f 72 25 53
f 72 53 76
f 72 76 139
f 72 139 80
f 72 80 120
f 72 120 88
f 119 120 108
f 119 108 107
f 119 107 85
f 119 85 81
f 81 85 142
f 81 142 75
f 81 75 140
f 75 85 45
f 75 45 42
f 75 42 52
f 75 142 85
f 52 42 24
f 24 42 4
f 42 77 51
f 42 51 26
f 45 85 109
f 45 109 171
f 45 171 63
f 172 171 109
f 172 109 110
f 110 78 84
f 110 109 73
f 110 73 78
f 84 78 48
f 84 48 108
f 84 108 120
f 84 120 80
f 84 80 141
f 84 141 76
f 76 141 80
f 76 80 139
f 107 108 48
f 107 48 47
f 107 47 85
f 85 47 73
f 85 73 109
f 78 73 47
f 78 47 48
@@ -0,0 +1,516 @@
# https://github.com/mikedh/trimesh
v -0.60235771 0.21632592 0.15377620
v -0.60235771 0.24958308 0.15377620
v -0.59963128 0.22078920 0.17203508
v -0.59963128 0.24511980 0.17203508
v -0.45542135 0.21818386 0.44129839
v -0.45542135 0.24772514 0.44129839
v -0.59953389 0.21305341 0.02614012
v -0.45958892 0.24974354 0.43302693
v -0.45958892 0.21616546 0.43302693
v -0.45631717 0.23903504 0.44213434
v -0.45631717 0.22687396 0.44213434
v -0.59353571 0.25148747 0.03212374
v -0.59353571 0.21371213 0.16591945
v -0.59353571 0.21157972 0.15377620
v -0.59353571 0.25432928 0.15377620
v -0.59353571 0.25219687 0.16591945
v -0.60633057 0.23903504 0.14158896
v -0.60633057 0.22687396 0.14158896
v -0.61267932 0.24736200 0.05645424
v -0.61267932 0.21854700 0.05645424
v -0.49624026 0.21138970 0.36056340
v -0.49624026 0.25451930 0.36056340
v -0.58862810 0.21840344 0.19962136
v -0.58862810 0.24750556 0.19962136
v -0.56512215 0.24857810 0.26319742
v -0.56512215 0.21733090 0.26319742
v -0.55704017 0.21237779 0.26319742
v -0.55704017 0.25353121 0.26319742
v -0.61367249 0.21695509 0.03212374
v -0.61367249 0.24895391 0.03212374
v -0.48761297 0.23903504 0.39945698
v -0.48761297 0.22687396 0.39945698
v -0.50839244 0.21177396 0.34837615
v -0.50839244 0.25413504 0.34837615
v -0.60985547 0.21417662 0.02614012
v -0.57618378 0.21881303 0.23534715
v -0.57618378 0.24709597 0.23534715
v -0.57663171 0.23903504 0.23657908
v -0.57663171 0.22687396 0.23657908
v -0.61193923 0.23903504 0.07664897
v -0.61193923 0.22687396 0.07664897
v -0.46663875 0.21910861 0.42862717
v -0.46663875 0.24680039 0.42862717
v -0.52054463 0.25270358 0.33618890
v -0.52054463 0.21149527 0.32404567
v -0.52054463 0.25441373 0.32404567
v -0.52054463 0.21320542 0.33618890
v -0.47189694 0.25450240 0.39703715
v -0.47189694 0.21140660 0.39703715
v -0.56373946 0.21931552 0.27098494
v -0.56373946 0.24659348 0.27098494
v -0.43450554 0.21701420 0.45731339
v -0.43450554 0.24889480 0.45731339
v -0.61219245 0.24621767 0.06859749
v -0.61219245 0.21969133 0.06859749
v -0.43540140 0.25387324 0.44569811
v -0.43540140 0.21203576 0.44569811
v -0.44710566 0.24989978 0.44547813
v -0.44710566 0.21600922 0.44547813
v -0.44274336 0.21885525 0.45286966
v -0.44274336 0.24705375 0.45286966
v -0.54738074 0.23903504 0.31269435
v -0.54738074 0.22687396 0.31269435
v -0.42985111 0.21982645 0.46439698
v -0.42985111 0.24608255 0.46439698
v -0.61507472 0.24407682 0.02614012
v -0.61190029 0.24542805 0.07598903
v -0.61190029 0.22048095 0.07598903
v -0.55254154 0.24799539 0.29971517
v -0.55254154 0.21791361 0.29971517
v -0.44944265 0.23903504 0.44820598
v -0.44944265 0.22687396 0.44820598
v -0.55145095 0.23903504 0.30662274
v -0.55145095 0.22687396 0.30662274
v -0.46704773 0.23903504 0.42924315
v -0.46704773 0.22687396 0.42924315
v -0.58720643 0.24590098 0.02614012
v -0.58720643 0.22000802 0.02614012
v -0.59300991 0.25042760 0.02614012
v -0.59300991 0.21548140 0.02614012
v -0.52675706 0.24544072 0.34248051
v -0.52675706 0.22046828 0.34248051
v -0.60570737 0.25394502 0.03212374
v -0.60570737 0.25336653 0.04426699
v -0.60570737 0.21254247 0.04426699
v -0.60570737 0.21196398 0.03212374
v -0.60570737 0.21180352 0.02614012
v -0.60570737 0.25410548 0.02614012
v -0.61260144 0.23903504 0.06859749
v -0.61260144 0.22687396 0.06859749
v -0.60298091 0.21598389 0.14158896
v -0.60298091 0.24992511 0.14158896
v -0.49125476 0.24722265 0.39254939
v -0.49125476 0.21868635 0.39254939
v -0.46239330 0.23903504 0.43531479
v -0.46239330 0.22687396 0.43531479
v -0.60070240 0.21876236 0.16591945
v -0.60070240 0.24714664 0.16591945
v -0.60179296 0.23903504 0.16591945
v -0.60179296 0.22687396 0.16591945
v -0.56921183 0.25391546 0.22676768
v -0.56921183 0.21199354 0.22676768
v -0.48426334 0.21558274 0.39677315
v -0.48426334 0.25032626 0.39677315
v -0.50876245 0.21532094 0.36051938
v -0.50876245 0.25058806 0.36051938
v -0.53271633 0.21164306 0.31185842
v -0.53271633 0.25426594 0.31185842
v -0.61602895 0.23903504 0.02614012
v -0.61602895 0.22687396 0.02614012
v -0.48034893 0.24826563 0.40654057
v -0.48034893 0.21764337 0.40654057
v -0.48406860 0.25393235 0.38489388
v -0.48406860 0.21197665 0.38489388
v -0.53316422 0.25073163 0.32426564
v -0.53316422 0.21517737 0.32426564
v -0.54486851 0.21167684 0.28752792
v -0.54486851 0.25423216 0.28752792
v -0.54486851 0.25299916 0.29971517
v -0.54486851 0.21290984 0.29971517
v -0.55448898 0.24976465 0.28752792
v -0.55448898 0.21614435 0.28752792
v -0.44757306 0.25424905 0.43355488
v -0.44757306 0.21165995 0.43355488
v -0.59014711 0.24929594 0.19024995
v -0.59014711 0.21661306 0.19024995
v -0.50628917 0.23903504 0.37239866
v -0.50628917 0.22687396 0.37239866
v -0.41707573 0.23903504 0.47557224
v -0.41707573 0.24655126 0.43865854
v -0.41707573 0.25093431 0.44600608
v -0.41707573 0.21497469 0.44600608
v -0.41707573 0.21935774 0.43865854
v -0.41707573 0.22687396 0.47557224
v -0.41707573 0.21614012 0.46936863
v -0.41707573 0.21235668 0.45788536
v -0.41707573 0.21235668 0.45185774
v -0.41707573 0.22649815 0.47544026
v -0.41707573 0.25355232 0.45788536
v -0.41707573 0.21396971 0.46523290
v -0.41707573 0.21740268 0.44129839
v -0.41707573 0.24976888 0.46936863
v -0.54467378 0.21660461 0.31097846
v -0.54467378 0.24930439 0.31097846
v -0.45972525 0.25364944 0.42136763
v -0.45972525 0.21225956 0.42136763
v -0.57770279 0.21687063 0.22676768
v -0.57770279 0.24903837 0.22676768
v -0.54130464 0.23903504 0.32158181
v -0.54130464 0.22687396 0.32158181
v -0.42322974 0.25318073 0.45788536
v -0.42322974 0.21760959 0.46721278
v -0.42322974 0.24829941 0.46721278
v -0.42322974 0.21272827 0.45788536
v -0.55409950 0.23903504 0.29971517
v -0.55409950 0.22687396 0.29971517
v -0.61390621 0.24919882 0.02614012
v -0.61390621 0.21671018 0.02614012
v -0.43012377 0.23903504 0.46466093
v -0.43012377 0.22687396 0.46466093
v -0.55127568 0.24597276 0.30635875
v -0.55127568 0.21993624 0.30635875
v -0.44336652 0.23903504 0.45339764
v -0.44336652 0.22687396 0.45339764
v -0.61316619 0.21763915 0.04426699
v -0.61316619 0.24826985 0.04426699
v -0.58966024 0.21805296 0.02614012
v -0.54046723 0.24784337 0.32039388
v -0.54046723 0.21806563 0.32039388
v -0.60508418 0.23903504 0.15377620
v -0.60508418 0.22687396 0.15377620
v -0.51587073 0.21834432 0.35647165
v -0.51587073 0.24756468 0.35647165
f 129 134 138
f 129 138 135
f 129 135 140
f 129 140 136
f 129 136 137
f 129 137 132
f 129 132 141
f 129 141 133
f 129 133 130
f 129 130 131
f 129 131 139
f 129 139 142
f 129 142 153
f 129 153 65
f 129 65 159
f 129 159 160
f 129 160 134
f 134 160 64
f 134 64 138
f 142 139 151
f 142 151 58
f 142 58 53
f 142 53 153
f 153 53 61
f 153 61 65
f 65 61 71
f 65 71 163
f 65 163 159
f 159 163 164
f 159 164 160
f 138 64 152
f 138 152 135
f 160 164 64
f 64 164 72
f 64 72 60
f 64 60 152
f 139 123 56
f 139 56 151
f 139 131 79
f 139 79 12
f 139 12 88
f 139 88 123
f 151 56 58
f 58 56 123
f 58 123 8
f 58 8 6
f 58 6 61
f 58 61 53
f 61 6 10
f 61 10 71
f 71 72 164
f 71 164 163
f 71 10 11
f 71 11 72
f 135 152 52
f 135 52 140
f 152 60 52
f 72 11 60
f 60 11 5
f 60 5 59
f 60 59 52
f 123 88 48
f 123 48 113
f 123 113 145
f 123 145 8
f 131 130 77
f 131 77 79
f 79 77 78
f 79 78 167
f 79 167 80
f 79 80 7
f 79 7 87
f 79 87 35
f 79 35 158
f 79 158 110
f 79 110 109
f 79 109 66
f 79 66 157
f 79 157 88
f 79 88 12
f 88 157 83
f 88 83 15
f 88 15 22
f 88 22 48
f 8 145 104
f 8 104 111
f 8 111 43
f 8 43 6
f 6 43 95
f 6 95 10
f 10 95 96
f 10 96 11
f 52 59 140
f 140 59 154
f 140 154 136
f 11 96 5
f 5 96 42
f 5 42 9
f 5 9 59
f 59 9 124
f 59 124 57
f 59 57 154
f 48 22 108
f 48 108 34
f 48 34 113
f 113 34 119
f 113 119 145
f 145 119 44
f 145 44 106
f 145 106 104
f 130 133 78
f 130 78 77
f 157 66 30
f 157 30 2
f 157 2 92
f 157 92 84
f 157 84 83
f 83 84 15
f 15 84 92
f 15 92 2
f 15 2 16
f 15 16 101
f 15 101 118
f 15 118 46
f 15 46 22
f 22 46 108
f 104 106 168
f 104 168 111
f 111 93 43
f 111 168 173
f 111 173 93
f 43 75 95
f 43 93 81
f 43 81 75
f 95 75 76
f 95 76 96
f 154 57 136
f 136 57 124
f 136 124 137
f 96 76 42
f 42 94 112
f 42 112 9
f 42 76 82
f 42 82 94
f 9 112 103
f 9 103 146
f 9 146 124
f 124 146 114
f 124 114 49
f 124 49 87
f 124 87 137
f 108 46 118
f 108 118 119
f 108 119 34
f 119 121 69
f 119 69 144
f 119 144 115
f 119 115 106
f 119 106 44
f 119 118 28
f 119 28 148
f 119 148 121
f 106 115 144
f 106 144 168
f 133 141 78
f 78 141 132
f 78 132 137
f 78 137 167
f 66 109 54
f 66 54 19
f 66 19 166
f 66 166 30
f 30 166 2
f 2 170 98
f 2 98 125
f 2 125 16
f 2 166 19
f 2 19 54
f 2 54 67
f 2 67 170
f 16 125 101
f 101 125 28
f 101 28 118
f 168 144 161
f 168 161 173
f 93 173 81
f 173 161 81
f 75 81 31
f 75 31 32
f 75 32 76
f 81 161 62
f 81 62 149
f 81 149 127
f 81 127 31
f 137 87 7
f 137 7 80
f 137 80 167
f 76 32 82
f 94 82 172
f 94 172 112
f 112 172 169
f 112 169 103
f 82 128 150
f 82 150 63
f 82 63 162
f 82 162 172
f 82 32 128
f 103 169 105
f 103 105 146
f 146 105 47
f 146 47 120
f 146 120 114
f 114 120 33
f 114 33 49
f 49 33 107
f 49 107 21
f 49 21 87
f 87 14 86
f 87 86 35
f 87 21 14
f 121 148 25
f 121 25 69
f 69 25 24
f 69 24 37
f 69 37 51
f 69 51 161
f 69 161 144
f 28 125 148
f 148 125 98
f 148 98 24
f 148 24 25
f 109 110 90
f 109 90 89
f 109 89 67
f 109 67 54
f 170 171 100
f 170 100 99
f 170 99 4
f 170 4 98
f 170 67 17
f 170 17 18
f 170 18 171
f 98 4 24
f 67 89 40
f 67 40 17
f 161 155 73
f 161 73 62
f 161 51 4
f 161 4 155
f 31 127 128
f 31 128 32
f 62 73 74
f 62 74 63
f 62 63 150
f 62 150 149
f 149 150 128
f 149 128 127
f 172 162 169
f 169 162 143
f 169 143 105
f 63 74 162
f 162 70 143
f 162 74 156
f 162 156 3
f 162 3 50
f 162 50 70
f 105 143 116
f 105 116 120
f 105 120 47
f 120 117 107
f 120 107 33
f 120 116 143
f 120 143 70
f 120 70 122
f 120 122 147
f 120 147 27
f 120 27 117
f 107 117 45
f 107 45 21
f 21 45 14
f 14 102 13
f 14 13 1
f 14 1 91
f 14 91 85
f 14 85 86
f 14 45 117
f 14 117 102
f 86 85 35
f 35 85 91
f 35 91 158
f 24 4 37
f 37 4 51
f 110 158 29
f 110 29 165
f 110 165 20
f 110 20 55
f 110 55 68
f 110 68 90
f 89 90 41
f 89 41 40
f 171 1 97
f 171 97 3
f 171 3 100
f 171 18 68
f 171 68 1
f 99 100 3
f 99 3 4
f 4 3 39
f 4 39 38
f 4 38 155
f 17 40 41
f 17 41 18
f 155 156 74
f 155 74 73
f 155 38 39
f 155 39 156
f 70 50 36
f 70 36 23
f 70 23 26
f 70 26 122
f 156 39 3
f 3 97 23
f 3 23 36
f 3 36 50
f 117 27 102
f 122 26 147
f 147 26 23
f 147 23 97
f 147 97 126
f 147 126 27
f 27 126 102
f 102 126 13
f 13 126 1
f 1 126 97
f 1 68 55
f 1 55 20
f 1 20 165
f 1 165 29
f 1 29 158
f 1 158 91
f 68 18 41
f 68 41 90
@@ -0,0 +1,387 @@
# https://github.com/mikedh/trimesh
v 0.45273862 0.21594588 -0.34538927
v 0.60519180 0.24621767 -0.01659416
v 0.60519180 0.21969133 -0.01659416
v 0.53347347 0.24784337 -0.26840860
v 0.53347347 0.21806563 -0.26840860
v 0.50177043 0.21532094 -0.30855345
v 0.50177043 0.25058806 -0.30855345
v 0.54553621 0.24799539 -0.24771800
v 0.54553621 0.21791361 -0.24771800
v 0.59536405 0.21632592 -0.10175654
v 0.59536405 0.24958308 -0.10175654
v 0.60667669 0.21695508 0.01991437
v 0.60667669 0.24895392 0.01991437
v 0.55005210 0.21237779 -0.21120944
v 0.55005210 0.25353121 -0.21120944
v 0.45266208 0.21599233 -0.34538927
v 0.45266208 0.24991667 -0.34538927
v 0.58022434 0.24587987 0.02609611
v 0.58022434 0.22002913 0.02609611
v 0.48205359 0.23903504 -0.34538927
v 0.48205359 0.22687396 -0.34538927
v 0.47677233 0.21555318 -0.34538927
v 0.60811569 0.24391636 0.02609611
v 0.51978802 0.22046406 -0.29048101
v 0.51978802 0.24544494 -0.29048101
v 0.53788218 0.21167684 -0.23553636
v 0.53788218 0.25423216 -0.23553636
v 0.53788218 0.25299916 -0.24771800
v 0.53788218 0.21290984 -0.24771800
v 0.55674174 0.21931551 -0.21902752
v 0.55674174 0.24659349 -0.21902752
v 0.58314819 0.24929595 -0.13826508
v 0.58314819 0.21661305 -0.13826508
v 0.59597637 0.21598389 -0.08961126
v 0.59597637 0.24992511 -0.08961126
v 0.58163270 0.21840343 -0.14761040
v 0.58163270 0.24750557 -0.14761040
v 0.48425798 0.24722265 -0.34055297
v 0.48425798 0.21868635 -0.34055297
v 0.52572756 0.21164306 -0.25989963
v 0.52572756 0.25426594 -0.25989963
v 0.46458708 0.21142348 -0.34538927
v 0.60494691 0.23903504 -0.02463041
v 0.60494691 0.22687396 -0.02463041
v 0.55813476 0.24857811 -0.21120944
v 0.55813476 0.21733089 -0.21120944
v 0.60569701 0.24736200 -0.00444890
v 0.60569701 0.21854700 -0.00444890
v 0.51357295 0.25270358 -0.28422656
v 0.51357295 0.21149527 -0.27204491
v 0.51357295 0.25441373 -0.27204491
v 0.51357295 0.21320542 -0.28422656
v 0.60490101 0.24542805 -0.02397588
v 0.60490101 0.22048095 -0.02397588
v 0.58601081 0.25039382 0.02609611
v 0.58601081 0.21551518 0.02609611
v 0.59808889 0.23903504 -0.10175654
v 0.59808889 0.22687396 -0.10175654
v 0.54751098 0.24976466 -0.23553636
v 0.54751098 0.21614434 -0.23553636
v 0.60560513 0.23903504 -0.01659416
v 0.60560513 0.22687396 -0.01659416
v 0.53766786 0.21660461 -0.25899056
v 0.53766786 0.24930439 -0.25899056
v 0.54444935 0.23903504 -0.25462699
v 0.54444935 0.22687396 -0.25462699
v 0.47726217 0.21558274 -0.34480744
v 0.47726217 0.25032626 -0.34480744
v 0.50140303 0.21177396 -0.29637182
v 0.50140303 0.25413504 -0.29637182
v 0.59273106 0.21300695 0.02609611
v 0.48171683 0.22439952 -0.34538927
v 0.59871651 0.21179929 0.02609611
v 0.59871651 0.25394503 0.01991437
v 0.59871651 0.25336653 0.00773275
v 0.59871651 0.21254247 0.00773275
v 0.59871651 0.21196397 0.01991437
v 0.59871651 0.25410971 0.02609611
v 0.50887337 0.21834432 -0.30448081
v 0.50887337 0.24756468 -0.30448081
v 0.48923307 0.21138970 -0.30855345
v 0.48923307 0.25451930 -0.30855345
v 0.52618680 0.25073163 -0.27229946
v 0.52618680 0.21517737 -0.27229946
v 0.50957753 0.23903504 -0.30549896
v 0.50957753 0.22687396 -0.30549896
v 0.57071802 0.21687063 -0.17473727
v 0.57071802 0.24903837 -0.17473727
v 0.54429627 0.24597276 -0.25433608
v 0.54429627 0.21993624 -0.25433608
v 0.60618685 0.24826563 0.00773275
v 0.60618685 0.21764337 0.00773275
v 0.56918722 0.21881303 -0.18328260
v 0.56918722 0.24709597 -0.18328260
v 0.58654659 0.25148748 0.01991437
v 0.58654659 0.21157972 -0.10175654
v 0.58654659 0.25432928 -0.10175654
v 0.58654659 0.21442152 0.01991437
v 0.60692165 0.21670173 0.02609611
v 0.60692165 0.24920727 0.02609611
v 0.59407817 0.21808674 -0.11190184
v 0.59407817 0.24782226 -0.11190184
v 0.58275019 0.21800651 0.02609611
v 0.47706316 0.25393236 -0.33288034
v 0.47706316 0.21197664 -0.33288034
v 0.59934413 0.23903504 -0.08961126
v 0.59934413 0.22687396 -0.08961126
v 0.59479763 0.23903504 -0.11393817
v 0.59479763 0.22687396 -0.11393817
v 0.55704790 0.23903504 -0.21986386
v 0.55704790 0.22687396 -0.21986386
v 0.47703255 0.21570519 -0.34538927
v 0.47703255 0.25020381 -0.34538927
v 0.46492384 0.21149527 -0.34538927
v 0.46492384 0.25441373 -0.34538927
v 0.46490854 0.25450241 -0.34506201
v 0.46490854 0.21140659 -0.34506201
v 0.54039270 0.23903504 -0.26069962
v 0.54039270 0.22687396 -0.26069962
v 0.45281516 0.25000534 -0.34538927
v 0.45281516 0.21590366 -0.34538927
v 0.60904947 0.23903504 0.02609611
v 0.60904947 0.22687396 0.02609611
v 0.53431541 0.23903504 -0.26960858
v 0.53431541 0.22687396 -0.26960858
v 0.60300278 0.21424840 0.02609611
v 0.56222205 0.25391547 -0.17473727
v 0.56222205 0.21199353 -0.17473727
v 0.54711294 0.23903504 -0.24771800
v 0.54711294 0.22687396 -0.24771800
f 122 23 100
f 122 100 78
f 122 78 55
f 122 55 18
f 122 18 19
f 122 19 103
f 122 103 56
f 122 56 71
f 122 71 73
f 122 73 126
f 122 126 99
f 122 99 123
f 122 123 62
f 122 62 61
f 122 61 53
f 122 53 2
f 122 2 47
f 122 47 23
f 23 47 91
f 23 91 13
f 23 13 100
f 123 99 12
f 123 12 92
f 123 92 48
f 123 48 3
f 123 3 54
f 123 54 62
f 61 62 44
f 61 44 43
f 61 43 53
f 53 43 106
f 53 106 57
f 53 57 11
f 53 11 2
f 2 11 47
f 47 11 91
f 100 75 74
f 100 74 78
f 100 13 11
f 100 11 35
f 100 35 75
f 91 11 13
f 99 126 34
f 99 34 10
f 99 10 12
f 12 10 92
f 92 10 48
f 48 10 3
f 3 10 54
f 54 44 62
f 54 10 58
f 54 58 107
f 54 107 44
f 43 44 107
f 43 107 106
f 106 107 58
f 106 58 57
f 57 58 109
f 57 109 108
f 57 108 102
f 57 102 11
f 11 102 32
f 11 32 127
f 11 127 97
f 11 97 35
f 75 35 97
f 75 97 74
f 74 97 78
f 78 95 55
f 78 97 82
f 78 82 116
f 78 116 95
f 126 73 77
f 126 77 76
f 126 76 34
f 34 96 10
f 34 76 96
f 10 96 128
f 10 128 33
f 10 33 101
f 10 101 58
f 58 101 109
f 108 37 102
f 108 109 111
f 108 111 110
f 108 110 89
f 108 89 31
f 108 31 37
f 102 37 45
f 102 45 88
f 102 88 32
f 32 88 15
f 32 15 127
f 127 15 27
f 127 27 97
f 97 27 51
f 97 51 82
f 95 116 120
f 95 120 55
f 55 120 17
f 55 17 18
f 82 51 41
f 82 41 116
f 116 41 70
f 116 70 104
f 116 104 115
f 116 115 120
f 73 96 77
f 73 71 42
f 73 42 117
f 73 117 81
f 73 81 96
f 77 96 76
f 96 81 50
f 96 50 26
f 96 26 128
f 128 26 14
f 128 14 33
f 33 14 87
f 33 87 101
f 101 87 46
f 101 46 36
f 101 36 109
f 109 36 30
f 109 30 90
f 109 90 111
f 37 31 94
f 37 94 8
f 37 8 45
f 110 111 130
f 110 130 129
f 110 129 89
f 89 129 65
f 89 65 118
f 89 118 25
f 89 25 80
f 89 80 4
f 89 4 64
f 89 64 8
f 89 8 31
f 31 8 94
f 45 8 59
f 45 59 88
f 88 59 28
f 88 28 15
f 15 28 27
f 27 28 41
f 27 41 51
f 120 115 113
f 120 113 20
f 120 20 21
f 120 21 72
f 120 72 112
f 120 112 22
f 120 22 114
f 120 114 42
f 120 42 121
f 120 121 1
f 120 1 16
f 120 16 17
f 18 17 16
f 18 16 19
f 41 28 70
f 70 28 104
f 104 68 115
f 104 28 49
f 104 49 7
f 104 7 68
f 115 68 113
f 71 56 98
f 71 98 42
f 42 114 117
f 42 98 121
f 117 114 105
f 117 105 69
f 117 69 40
f 117 40 81
f 81 40 50
f 50 40 26
f 26 40 29
f 26 29 14
f 14 29 87
f 87 29 60
f 87 60 46
f 46 60 9
f 46 9 36
f 36 9 93
f 36 93 30
f 30 93 9
f 30 9 90
f 90 9 63
f 90 63 5
f 90 5 79
f 90 79 24
f 90 24 119
f 90 119 66
f 90 66 130
f 90 130 111
f 8 64 28
f 8 28 59
f 129 130 66
f 129 66 65
f 65 66 119
f 65 119 118
f 118 119 125
f 118 125 124
f 118 124 25
f 25 85 20
f 25 20 38
f 25 38 80
f 25 124 85
f 80 38 113
f 80 113 4
f 4 113 68
f 4 68 7
f 4 7 64
f 64 7 83
f 64 83 28
f 28 83 7
f 28 7 49
f 19 16 103
f 16 1 56
f 16 56 103
f 113 38 20
f 56 1 121
f 56 121 98
f 114 22 105
f 105 22 67
f 105 67 6
f 105 6 52
f 105 52 29
f 105 29 69
f 69 29 40
f 29 9 60
f 29 52 6
f 29 6 84
f 29 84 63
f 29 63 9
f 63 84 6
f 63 6 5
f 5 6 67
f 5 67 112
f 5 112 79
f 79 112 39
f 79 39 24
f 24 39 72
f 24 72 21
f 24 21 86
f 24 86 125
f 24 125 119
f 124 125 86
f 124 86 85
f 85 86 21
f 85 21 20
f 22 112 67
f 112 72 39
@@ -0,0 +1,522 @@
# https://github.com/mikedh/trimesh
v 0.08833792 0.22635783 -0.57706629
v 0.08833792 0.23903495 -0.57720244
v 0.08833792 0.21177661 -0.56404026
v 0.08833792 0.21201779 -0.56345024
v 0.08833792 0.25413239 -0.56404026
v 0.08833792 0.21575830 -0.57332189
v 0.08833792 0.22687405 -0.57720244
v 0.08833792 0.21660880 -0.55403246
v 0.08833792 0.21598680 -0.57375307
v 0.08833792 0.24992220 -0.57375307
v 0.08833792 0.24930020 -0.55403246
v 0.38342145 0.23903495 -0.44646571
v 0.38342145 0.22687405 -0.44646571
v 0.24591876 0.21151426 -0.51538560
v 0.24591876 0.25439474 -0.51538560
v 0.23374085 0.25291800 -0.52754929
v 0.23374085 0.21299100 -0.52754929
v 0.23374085 0.21796284 -0.53542387
v 0.23374085 0.24794616 -0.53542387
v 0.25809669 0.23903495 -0.52568840
v 0.25809669 0.25329459 -0.51538560
v 0.25809669 0.24835661 -0.52357791
v 0.25809669 0.21755239 -0.52357791
v 0.25809669 0.21261441 -0.51538560
v 0.25809669 0.22687405 -0.52568840
v 0.43571717 0.24705335 -0.40089735
v 0.43571717 0.21885565 -0.40089735
v 0.35478791 0.24963870 -0.46639053
v 0.35478791 0.21627030 -0.46639053
v 0.18433546 0.23903495 -0.55961505
v 0.18433546 0.22687405 -0.55961505
v 0.42284556 0.24608437 -0.41244827
v 0.42284556 0.21982463 -0.41244827
v 0.19724560 0.25431857 -0.53971293
v 0.19724560 0.21159043 -0.53971293
v 0.19724560 0.21599949 -0.55012921
v 0.19724560 0.24990951 -0.55012921
v 0.20942353 0.23903495 -0.54876763
v 0.20942353 0.21343529 -0.53971293
v 0.20942353 0.25247371 -0.53971293
v 0.20942353 0.22687405 -0.54876763
v 0.20942353 0.24747225 -0.54729252
v 0.20942353 0.21843675 -0.54729252
v 0.22160146 0.25436935 -0.52754929
v 0.22160146 0.21153965 -0.52754929
v 0.33763862 0.23903495 -0.48538490
v 0.33763862 0.22687405 -0.48538490
v 0.16075035 0.21164120 -0.55187661
v 0.16075035 0.25426780 -0.55187661
v 0.17292828 0.23903495 -0.56238365
v 0.17292828 0.25411124 -0.55187661
v 0.17292828 0.24919864 -0.56015971
v 0.17292828 0.21671036 -0.56015971
v 0.17292828 0.21179776 -0.55187661
v 0.17292828 0.22687405 -0.56238365
v 0.44007197 0.21600795 -0.39352200
v 0.44007197 0.24990105 -0.39352200
v 0.12425509 0.21937187 -0.57071214
v 0.12425509 0.24653713 -0.57071214
v 0.09993777 0.23903495 -0.57577276
v 0.09993777 0.21154388 -0.56404026
v 0.09993777 0.25436512 -0.56404026
v 0.09993777 0.22687405 -0.57577276
v 0.09993777 0.21623221 -0.57293611
v 0.09993777 0.24967679 -0.57293611
v 0.31551794 0.23903495 -0.49841093
v 0.31551794 0.22687405 -0.49841093
v 0.11211571 0.21729851 -0.57182412
v 0.11211571 0.24861049 -0.57182412
v 0.11211571 0.25362886 -0.56404026
v 0.11211571 0.21228014 -0.56404026
v 0.48169271 0.22440295 -0.34541197
v 0.37999159 0.25084887 -0.44281207
v 0.37999159 0.21506013 -0.44281207
v 0.24033080 0.22017583 -0.53385804
v 0.24033080 0.24573317 -0.53385804
v 0.46454342 0.21142117 -0.34541197
v 0.47675986 0.21555520 -0.34541197
v 0.28985180 0.21928725 -0.50993920
v 0.28985180 0.24662175 -0.50993920
v 0.45961057 0.24679947 -0.37668347
v 0.45961057 0.21910953 -0.37668347
v 0.44242277 0.23903495 -0.39624520
v 0.44242277 0.22687405 -0.39624520
v 0.34218606 0.21739584 -0.47819109
v 0.34218606 0.24851316 -0.47819109
v 0.45537143 0.23903495 -0.38335535
v 0.45537143 0.22687405 -0.38335535
v 0.45255817 0.21616451 -0.38106329
v 0.45255817 0.24974449 -0.38106329
v 0.47333003 0.21764548 -0.35458011
v 0.47333003 0.24826352 -0.35458011
v 0.19042443 0.23903495 -0.55736841
v 0.19042443 0.22687405 -0.55736841
v 0.18256271 0.24748495 -0.55907042
v 0.18256271 0.21842405 -0.55907042
v 0.34372759 0.23903495 -0.48021082
v 0.34372759 0.22687405 -0.48021082
v 0.24060056 0.23903495 -0.53399419
v 0.24060056 0.22687405 -0.53399419
v 0.36738973 0.25039188 -0.45461266
v 0.36738973 0.21551712 -0.45461266
v 0.32156836 0.23903495 -0.49509771
v 0.32156836 0.22687405 -0.49509771
v 0.45263525 0.24991797 -0.34541197
v 0.45263525 0.21599103 -0.34541197
v 0.47699111 0.21570753 -0.34541197
v 0.47699111 0.25020147 -0.34541197
v 0.21558956 0.22070052 -0.54581745
v 0.21558956 0.24520848 -0.54581745
v 0.48203956 0.23903495 -0.34541197
v 0.48203956 0.22687405 -0.34541197
v 0.44839608 0.24772613 -0.38932372
v 0.44839608 0.21818287 -0.38932372
v 0.31875513 0.21573715 -0.49142136
v 0.31875513 0.25017185 -0.49142136
v 0.21562810 0.23903495 -0.54584015
v 0.21562810 0.22687405 -0.54584015
v 0.44053440 0.25425087 -0.38158525
v 0.44053440 0.21165813 -0.38158525
v 0.45271233 0.25365002 -0.36939891
v 0.45271233 0.21594448 -0.34541197
v 0.45271233 0.21225898 -0.36939891
v 0.46489026 0.21149734 -0.34541197
v 0.46489026 0.25441166 -0.34541197
v 0.37609929 0.21786551 -0.45057323
v 0.37609929 0.24804349 -0.45057323
v 0.42839501 0.21203472 -0.39374893
v 0.42839501 0.25387428 -0.39374893
v 0.33744591 0.22018006 -0.48524875
v 0.33744591 0.24572894 -0.48524875
v 0.36322768 0.24755265 -0.46212416
v 0.36322768 0.21835635 -0.46212416
v 0.13045969 0.22073014 -0.57014478
v 0.13045969 0.24517886 -0.57014478
v 0.26511057 0.21970192 -0.52189860
v 0.26511057 0.24620708 -0.52189860
v 0.35536597 0.25414932 -0.45456727
v 0.35536597 0.21175968 -0.45456727
v 0.36754390 0.21152273 -0.44240359
v 0.36754390 0.25438627 -0.44240359
v 0.37972183 0.25456822 -0.43023994
v 0.37972183 0.21134078 -0.43023994
v 0.35035607 0.24679947 -0.47367512
v 0.35035607 0.21910953 -0.47367512
v 0.45278942 0.25000260 -0.34541197
v 0.45278942 0.21590640 -0.34541197
v 0.31887072 0.21159466 -0.47887190
v 0.31887072 0.25431434 -0.47887190
v 0.33104865 0.23903495 -0.48942433
v 0.33104865 0.22687405 -0.48942433
v 0.33104865 0.24792501 -0.48717769
v 0.33104865 0.25282491 -0.47887190
v 0.33104865 0.21308409 -0.47887190
v 0.33104865 0.21798399 -0.48717769
v 0.34322658 0.21220397 -0.46670825
v 0.34322658 0.25370503 -0.46670825
v 0.31459304 0.24698565 -0.49797975
v 0.31459304 0.21892335 -0.49797975
v 0.13053675 0.23903495 -0.57016748
v 0.13053675 0.22687405 -0.57016748
v 0.30673133 0.25373465 -0.49105828
v 0.30673133 0.24889399 -0.49968176
v 0.30673133 0.21701501 -0.49968176
v 0.30673133 0.21217435 -0.49105828
v 0.42920432 0.23903495 -0.40750113
v 0.42920432 0.22687405 -0.40750113
v 0.44928247 0.23903495 -0.39016338
v 0.44928247 0.22687405 -0.39016338
v 0.28241401 0.25356116 -0.50322192
v 0.28241401 0.21234784 -0.50322192
v 0.28241401 0.21724351 -0.51166386
v 0.28241401 0.24866549 -0.51166386
v 0.46003449 0.23903495 -0.37727349
v 0.46003449 0.22687405 -0.37727349
f 7 2 60
f 7 60 63
f 7 63 68
f 7 68 1
f 7 1 9
f 7 9 6
f 7 6 3
f 7 3 4
f 7 4 8
f 7 8 11
f 7 11 5
f 7 5 10
f 7 10 2
f 2 10 65
f 2 65 69
f 2 69 60
f 63 60 160
f 63 160 161
f 63 161 134
f 63 134 58
f 63 58 68
f 68 64 1
f 68 58 53
f 68 53 64
f 1 64 9
f 10 5 62
f 10 62 65
f 65 62 70
f 65 70 52
f 65 52 69
f 69 59 60
f 69 52 59
f 60 59 135
f 60 135 160
f 161 160 50
f 161 50 55
f 161 55 134
f 134 55 96
f 134 96 53
f 134 53 58
f 64 61 6
f 64 6 9
f 64 53 71
f 64 71 61
f 53 96 36
f 53 36 54
f 53 54 71
f 5 11 125
f 5 125 62
f 62 15 44
f 62 44 34
f 62 34 49
f 62 49 51
f 62 51 70
f 62 125 142
f 62 142 15
f 70 51 52
f 52 51 37
f 52 37 95
f 52 95 135
f 52 135 59
f 135 95 50
f 135 50 160
f 55 50 30
f 55 30 31
f 55 31 96
f 96 31 94
f 96 94 109
f 96 109 43
f 96 43 36
f 61 3 6
f 61 71 54
f 61 54 48
f 61 48 35
f 61 35 45
f 61 45 14
f 61 14 143
f 61 143 77
f 61 77 3
f 36 43 18
f 36 18 23
f 36 23 172
f 36 172 24
f 36 24 17
f 36 17 39
f 36 39 54
f 54 39 17
f 54 17 24
f 54 24 171
f 54 171 35
f 54 35 48
f 11 8 106
f 11 106 105
f 11 105 146
f 11 146 125
f 125 146 105
f 125 105 106
f 125 106 122
f 125 122 147
f 125 147 77
f 125 77 124
f 125 124 78
f 125 78 107
f 125 107 72
f 125 72 112
f 125 112 111
f 125 111 108
f 125 108 121
f 125 121 119
f 125 119 142
f 15 142 149
f 15 149 162
f 15 162 44
f 44 162 34
f 34 51 49
f 34 162 170
f 34 170 51
f 51 170 21
f 51 21 16
f 51 16 40
f 51 40 37
f 142 141 149
f 142 119 141
f 37 40 16
f 37 16 21
f 37 21 173
f 37 173 22
f 37 22 19
f 37 19 42
f 37 42 95
f 95 93 30
f 95 30 50
f 95 42 110
f 95 110 93
f 31 30 93
f 31 93 94
f 94 93 38
f 94 38 41
f 94 41 109
f 109 136 75
f 109 75 43
f 109 41 118
f 109 118 100
f 109 100 25
f 109 25 67
f 109 67 136
f 43 75 136
f 43 136 79
f 43 79 159
f 43 159 18
f 3 77 4
f 35 171 165
f 35 165 45
f 45 165 14
f 14 165 148
f 14 148 143
f 143 148 140
f 143 140 120
f 143 120 77
f 77 120 123
f 77 123 124
f 77 147 8
f 77 8 4
f 18 159 23
f 23 159 172
f 172 164 24
f 172 159 164
f 24 164 171
f 171 164 165
f 8 147 122
f 8 122 106
f 108 111 92
f 108 92 90
f 108 90 121
f 121 90 119
f 119 90 57
f 119 57 129
f 119 129 138
f 119 138 141
f 149 141 138
f 149 138 157
f 149 157 162
f 162 157 153
f 162 153 116
f 162 116 163
f 162 163 170
f 170 163 21
f 21 163 173
f 173 163 158
f 173 158 22
f 22 158 19
f 19 158 42
f 42 158 80
f 42 80 137
f 42 137 76
f 42 76 110
f 93 110 38
f 110 20 99
f 110 99 117
f 110 117 38
f 110 76 137
f 110 137 66
f 110 66 20
f 41 38 117
f 41 117 118
f 136 67 79
f 118 117 99
f 118 99 100
f 100 99 20
f 100 20 25
f 25 20 66
f 25 66 67
f 67 159 79
f 67 66 103
f 67 103 104
f 67 104 159
f 159 104 130
f 159 130 155
f 159 155 115
f 159 115 164
f 165 115 154
f 165 154 156
f 165 156 148
f 165 164 115
f 148 156 139
f 148 139 140
f 140 139 120
f 120 128 56
f 120 56 89
f 120 89 123
f 120 139 128
f 123 89 78
f 123 78 124
f 111 112 175
f 111 175 174
f 111 174 81
f 111 81 92
f 92 81 90
f 90 113 57
f 90 81 113
f 57 113 127
f 57 127 101
f 57 101 73
f 57 73 129
f 129 73 157
f 129 157 138
f 157 73 101
f 157 101 153
f 153 152 116
f 153 101 28
f 153 28 86
f 153 86 152
f 116 158 163
f 116 152 158
f 158 152 131
f 158 131 103
f 158 103 66
f 158 66 80
f 80 66 137
f 104 103 150
f 104 150 151
f 104 151 130
f 130 145 85
f 130 85 155
f 130 151 47
f 130 47 98
f 130 98 13
f 130 13 167
f 130 167 84
f 130 84 33
f 130 33 145
f 155 154 115
f 155 85 154
f 154 85 29
f 154 29 102
f 154 102 156
f 156 102 74
f 156 74 128
f 156 128 139
f 128 74 56
f 56 114 89
f 56 74 102
f 56 102 126
f 56 126 114
f 89 114 82
f 89 82 91
f 89 91 107
f 89 107 78
f 112 72 82
f 112 82 175
f 174 175 88
f 174 88 87
f 174 87 81
f 81 87 113
f 113 87 168
f 113 168 26
f 113 26 132
f 113 132 127
f 127 132 28
f 127 28 101
f 152 86 131
f 28 132 144
f 28 144 86
f 86 144 131
f 131 12 97
f 131 97 46
f 131 46 150
f 131 150 103
f 131 144 32
f 131 32 83
f 131 83 166
f 131 166 12
f 151 150 46
f 151 46 47
f 145 133 29
f 145 29 85
f 145 33 27
f 145 27 133
f 47 46 97
f 47 97 98
f 98 97 12
f 98 12 13
f 13 12 166
f 13 166 167
f 167 166 83
f 167 83 84
f 84 83 168
f 84 168 169
f 84 169 27
f 84 27 33
f 29 133 126
f 29 126 102
f 114 169 88
f 114 88 82
f 114 126 133
f 114 133 27
f 114 27 169
f 82 72 91
f 82 88 175
f 91 72 107
f 87 88 169
f 87 169 168
f 168 83 26
f 26 83 32
f 26 32 144
f 26 144 132

Some files were not shown because too many files have changed in this diff Show More