Portability | portable (needs FFI) |
---|---|
Stability | provisional |
Maintainer | felipe.lessa@gmail.com |
Safe Haskell | None |
Rigid bodies and their properties.
- data Body
- newBody :: Mass -> Moment -> IO Body
- type Mass = CpFloat
- mass :: Body -> StateVar Mass
- type Moment = CpFloat
- moment :: Body -> StateVar Moment
- position :: Body -> StateVar Position
- type Velocity = Vector
- velocity :: Body -> StateVar Velocity
- maxVelocity :: Body -> StateVar CpFloat
- type Force = Vector
- force :: Body -> StateVar Force
- angle :: Body -> StateVar Angle
- type AngVel = CpFloat
- angVel :: Body -> StateVar AngVel
- maxAngVel :: Body -> StateVar CpFloat
- type Torque = CpFloat
- torque :: Body -> StateVar Torque
- slew :: Body -> Position -> Time -> IO ()
- updateVelocity :: Body -> Vector -> Damping -> Time -> IO ()
- updatePosition :: Body -> Time -> IO ()
- resetForces :: Body -> IO ()
- applyForce :: Body -> Vector -> Position -> IO ()
- applyOnlyForce :: Body -> Vector -> Position -> IO ()
- applyImpulse :: Body -> Vector -> Position -> IO ()
- applyDampedSpring :: (Body, Position) -> (Body, Position) -> Distance -> CpFloat -> Damping -> Time -> IO ()
- localToWorld :: Body -> Position -> IO Position
- worldToLocal :: Body -> Position -> IO Position
Creating
A rigid body representing the physical properties of an object, but without a shape. It may help to think of it as a particle that is able to rotate.
newBody :: Mass -> Moment -> IO BodySource
newBody mass inertia
creates a new Body
with
the given mass and moment of inertia.
It is recommended to call setPosition
afterwards.
Static properties
Basic
Mass
Moment of inertia
Linear components of motion
Position
position :: Body -> StateVar PositionSource
Note that using this function to change the position on every step is not recommended as it may leave the velocity out of sync.
Velocity
maxVelocity :: Body -> StateVar CpFloatSource
Maximum linear velocity after integrating, defaults to infinity.
Force
Angular components of motion
Angle
Angular velocity
maxAngVel :: Body -> StateVar CpFloatSource
Maximum angular velocity after integrating, defaults to infinity.
Torque
Dynamic properties
slew :: Body -> Position -> Time -> IO ()Source
slew b newpos dt
changes the body b
's velocity
so that it reaches newpos
in dt
time.
It is usually used to change the position of a static body in the world. In that case, remember to reset the velocity to zero afterwards!
updateVelocity :: Body -> Vector -> Damping -> Time -> IO ()Source
updateVelocity b gravity damping dt
redefines body b
's
linear and angular velocity to account for the force/torque
being applied to it, the gravity and a damping factor
during dt
time using Euler integration.
Note that this function only needs to be called if you are not adding the body to a space.
updatePosition :: Body -> Time -> IO ()Source
updatePosition b dt
redefines the body position like
updateVelocity
(and it also shouldn't be called if you
are adding this body to a space).
resetForces :: Body -> IO ()Source
resetForces b
redefines as zero all forces and torque
acting on body b
.
applyForce :: Body -> Vector -> Position -> IO ()Source
applyForce b f r
applies to the body b
the force
f
with offset r
, both vectors in world coordinates.
This is the most stable way to change a body's velocity.
Note that the force is accumulated in the body, so you
may need to call applyOnlyForce
.
applyOnlyForce :: Body -> Vector -> Position -> IO ()Source
applyOnlyForce b f r
applies a force like applyForce
,
but calling resetForces
before. Note that using this
function is preferable as it is optimized over this common
case.
applyImpulse :: Body -> Vector -> Position -> IO ()Source
applyImpulse b j r
applies to the body b
the impulse
j
with offset r
, both vectors in world coordinates.
applyDampedSpring :: (Body, Position) -> (Body, Position) -> Distance -> CpFloat -> Damping -> Time -> IO ()Source
dampedSpring (b1,a1) (b2,a2) rlen k dmp dt
applies a damped
spring force between bodies b1
and b2
at anchors
a1
and a2
, respectively. k
is the spring constant
(force/distance), rlen
is the rest length of the spring,
dmp
is the damping constant (force/velocity), and dt
is the time step to apply the force over. Both anchors are
in body coordinates.
Note: large damping values can be unstable, you should use the damped spring constraint instead.