| Copyright | (c) 2008-2010 Felipe A. Lessa |
|---|---|
| License | MIT (see LICENSE) |
| Maintainer | felipe.lessa@gmail.com |
| Stability | provisional |
| Portability | portable (needs FFI) |
| Safe Haskell | None |
| Language | Haskell98 |
Physics.Hipmunk.Body
Contents
Description
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 Body Source
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 Position Source
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 CpFloat Source
Maximum linear velocity after integrating, defaults to infinity.
Force
Angular components of motion
Angle
Angular velocity
maxAngVel :: Body -> StateVar CpFloat Source
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.