Source code for ars.model.collision.ode_objects_factories
"""ODE objects factories i.e. functions that create ODE objects.
"""
import ode
#==============================================================================
# Environment
#==============================================================================
[docs]def create_ode_simple_space():
"""Create an ODE geoms container (i.e. "space") of the simplest type.
.. note::
``ode.SimpleSpace()`` equals ``ode.Space(space_type=0)``.
:return: ODE simple space
:rtype: :class:`ode.SimpleSpace`
"""
return ode.SimpleSpace()
[docs]def create_ode_hash_space():
"""Create a more sophisticated ODE geoms container (i.e. "space").
.. note::
``ode.HashSpace()`` equals ``ode.Space(space_type=1)``.
:return: ODE hash space
:rtype: :class:`ode.HashSpace`
"""
return ode.HashSpace()
[docs]def create_ode_joint_group():
"""Create an ODE joint group.
:return: ODE joint group
:rtype: :class:`ode.JointGroup`
"""
return ode.JointGroup()
#==============================================================================
# Other shapes
#==============================================================================
[docs]def create_ode_plane(space, normal, dist):
r"""Create an ODE plane (infinite) geom.
The plane equation is
.. math::
n_0 \cdot x + n_1 \cdot y + n_2 \cdot z = dist
where ``normal = (n0, n1, n2)``.
.. warning::
This object can't be attached to a body.
:param space:
:type space: :class:`ode.Space`
:param normal: vector normal to the plane
:type normal: 3-sequence of floats
:param dist: constant of the plane equation
:type dist: float
:return: ODE plane geom
:rtype: :class:`ode.GeomPlane`
"""
return ode.GeomPlane(space, normal, dist)
[docs]def create_ode_ray(space, length):
"""Create an ODE ray geom.
:param space:
:type space: :class:`ode.Space`
:param length:
:type length: float
:return: ODE ray geom
:rtype: :class:`ode.GeomRay`
"""
return ode.GeomRay(space, length)
[docs]def create_ode_trimesh(space, vertices, faces):
"""Create an ODE trimesh geom.
:param space:
:type space: :class:`ode.Space`
:param vertices:
:type vertices: sequence of 3-sequences of floats
:param faces:
:type faces: sequence of 3-sequences of ints
:return: ODE trimesh geom
:rtype: :class:`ode.GeomTriMesh`
"""
tm_data = ode.TriMeshData()
tm_data.build(vertices, faces)
return ode.GeomTriMesh(tm_data, space)
#==============================================================================
# Basic Shapes
#==============================================================================
[docs]def create_ode_box(space, size):
"""Create an ODE box geom.
:param space:
:type space: :class:`ode.Space`
:param size:
:type size: 3-sequence of floats
:return: ODE box geom
:rtype: :class:`ode.GeomBox`
"""
return ode.GeomBox(space, lengths=size)
[docs]def create_ode_sphere(space, radius):
"""Create an ODE sphere geom.
:param space:
:type space: :class:`ode.Space`
:param radius:
:type radius: float
:return: ODE sphere geom
:rtype: :class:`ode.GeomSphere`
"""
return ode.GeomSphere(space, radius)
[docs]def create_ode_capsule(space, length, radius):
"""Create an ODE capsule geom.
.. note::
In ``GeomCCylinder`` (same as ``GeomCapsule``)
*CCylinder* means Capped Cylinder.
.. warning::
ODE's constructor parameter order is different:
``radius`` first and then ``length``.
:param space:
:type space: :class:`ode.Space`
:param length: of the cylindrical section i.e. caps are not included
:type length: float
:param radius:
:type radius: float
:return: ODE capsule geom
:rtype: :class:`ode.GeomCCylinder`
"""
# FIXME: replace with GeomCapsule (in docstring too)
return ode.GeomCCylinder(space, radius, length)
[docs]def create_ode_cylinder(space, length, radius):
"""Create an ODE cylinder geom.
.. warning::
ODE's constructor parameter order is different:
``radius`` first and then ``length``.
:param space:
:type space: :class:`ode.Space`
:param length:
:type length: float
:param radius:
:type radius: float
:return: ODE cylinder geom
:rtype: :class:`ode.GeomCylinder`
"""
return ode.GeomCylinder(space, radius, length)