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.
- Parameter
- 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.
- Parameter
- 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
- 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)
- Parameter
- class Karana.Collision.FrameCollider(proxy_scene: Karana.Scene.ProxyScene, collision_scene: Karana.Scene.CollisionScene)#
- 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.
- Parameter
- 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.
- Parameter
- 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.
- Parameter
- property params: HuntCrossleyParams#
Parameters used for the contact model.
- class Karana.Collision.HuntCrossleyParams#
- property kc: float#
Normal penetration restituion/damping coefficient
- property kp: float#
Normal penetration siffness 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