Karana.Collision#

Models and classes for collision detection and contact force calculation.

Classes#

Package Contents#

class Karana.Collision.ContactForceBase#

Bases: Karana.Core.Base

applyForce(arg0: FrameContact, arg1: Karana.Dynamics.SubTree) None#

Apply the contact force for the associated contact.

This first calls computeForce to get the contact force. Then, it applies it to frames if those frames belong to a body.

Parameter contact:

The contact to apply the force for.

Parameter st:

The SubTree we are computing forces for.

getLastNodePair() tuple[Karana.Dynamics.Node, Karana.Dynamics.Node]#

Get the pair of nodes from the most recent contact.

Returns:

The node pair (may be null)

resetLastNodePair() None#

Reset the most recent contact node pair to nullptr

class Karana.Collision.ContactForceManager(name: str)#

Bases: ContactForceBase

static create(name: str) ContactForceManager#

Create an instance of ContactForceManager.

Parameter name:

The name for the ContactForceManager instance.

Returns:

A ks_ptr to the newly created ContactForceManager.

clearDelegates() None#

Clear out all registered ContactForceBase instances

getDelegate(contact: FrameContact) ContactForceBase#
getDelegate() ContactForceBase
getDelegate(frame1: Karana.Frame.Frame, frame2: Karana.Frame.Frame, strict: bool = False) ContactForceBase

Get the most specific matching ContactForceBase

Parameter contact:

The contact to get the delegate for.

Returns:

The ContactForceBase (may be nullptr)

setDelegate(force: ContactForceBase = None) None#
setDelegate(frame1: Karana.Frame.Frame, frame2: Karana.Frame.Frame, force: ContactForceBase = None) None

Set the ContactForceBase used by default

Parameter force:

The ContactForceBase (may be nullptr)

class Karana.Collision.FrameCollider(proxy_scene: Karana.Scene.ProxyScene, collision_scene: Karana.Scene.CollisionScene)#
clearIgnoredFramePairs() None#

Stop ignoring any frame-pair collisions

collide(col_func: collections.abc.Callable[[FrameContact], None], filter_func: collections.abc.Callable[[Karana.Scene.CollisionScenePart, Karana.Scene.CollisionScenePart], bool] = None) None#

Process all collisions

Sweeps through all contacts between geometries attached to Frames, calling the collision handler for each unfiltered contact.

Parameter collision_handler:
  • Callback to handle a contact

Parameter filter:
  • Callback to skip potential collisions in the broadphase.

ignoreAllCurrentlyTouchingPairs() None#

Call ignoreFramePair for each pair with a collision

ignoreFramePair(frame1: Karana.Frame.Frame, frame2: Karana.Frame.Frame) None#

Ignore collisions between a pair of frames

Parameter frame1:

The first frame in the pair

Parameter frame2:

The second frame in the pair

lookupPartFrame(part: Karana.Scene.CollisionScenePart) Karana.Frame.Frame#
lookupPartFrame(id: SupportsInt) Karana.Frame.Frame

Get the Frame that a CollisionScenePart is attached to

Parameter part:
  • A CollisionScenePart managed by ProxyScene

Returns:

The ancestor Frame for the part.

unignoreFramePair(frame1: Karana.Frame.Frame, frame2: Karana.Frame.Frame) None#

Stop ignoring collisions between a pair of frames

Parameter frame1:

The first frame in the pair

Parameter frame2:

The second frame in the pair

class Karana.Collision.FrameContact#
property frame_1: Karana.Frame.Frame#

The first Frame involved in the contact

property frame_2: Karana.Frame.Frame#

The second Frame involved in the contact

property location_1: Annotated[numpy.typing.NDArray[numpy.float64], [3, 1]]#

Contact location on the first Frame relative to the first Frame and expressed in the first frame

property location_2: Annotated[numpy.typing.NDArray[numpy.float64], [3, 1]]#

Contact location on the second Frame relative to the second Frame and expressed in the second frame

property normal_1: Annotated[numpy.typing.NDArray[numpy.float64], [3, 1]]#

Contact normal expressed first Frame

property normal_2: Annotated[numpy.typing.NDArray[numpy.float64], [3, 1]]#

Contact normal expressed second Frame

property penetration: float#

Maximum penetration distance

class Karana.Collision.HuntCrossley(name: str)#

Bases: ContactForceBase

static create(name: str) HuntCrossley#

Create an instance of the HuntCrossley contact force model.

Parameter name:

The name for the HuntCrossley instance.

Returns:

A ks_ptr to the newly created HuntCrossley contact force model.

property params: HuntCrossleyParams#

Parameters used for the contact model.

class Karana.Collision.HuntCrossleyParams#
property kc: float#

Normal penetration restitution/damping coefficient

property kp: float#

Normal penetration stiffness coefficient

property linear_region_tol: float#

Tolerance at which friction is linearly interpolated between the real value and 0.

To avoid jittering for cases like rolling without friction, near zero, the friction force uses a linear interpolation between the full friction force and zero. This avoids rapid, large changes in the friction force as the velocity changes sign, and instead, smoothly, linearly interpolates between these large forces over a region of linear_region_tol * 2.

property mu: float#

Friction coefficient

property n: float#

Exponent