Safe Haskell | None |
---|---|
Language | Haskell2010 |
Types for describing the motion of physical objects. Functions for solving constraints.
- data InvMass2 = InvMass2 {}
- data PhysicalObj = PhysicalObj {
- _physObjVel :: !V2
- _physObjRotVel :: !Double
- _physObjPos :: !V2
- _physObjRotPos :: !Double
- _physObjInvMass :: !InvMass2
- physObjVel :: Lens' PhysicalObj V2
- physObjRotVel :: Lens' PhysicalObj Double
- physObjRotPos :: Lens' PhysicalObj Double
- physObjPos :: Lens' PhysicalObj V2
- physObjInvMass :: Lens' PhysicalObj InvMass2
- _physObjVel3 :: PhysicalObj -> V3
- physObjVel3 :: Functor f => (V3 -> f V3) -> PhysicalObj -> f PhysicalObj
- toInvMass2 :: (Double, Double) -> InvMass2
- data Constraint = Constraint {
- _constraintJ :: !V6
- _constraintB :: !Double
- type Constraint' p = (p, p) -> Constraint
- type PhysObjChanged = PhysicalObj -> PhysicalObj -> Bool
- _constrainedVel6 :: (PhysicalObj, PhysicalObj) -> V6
- constrainedVel6 :: Functor f => (V6 -> f V6) -> (PhysicalObj, PhysicalObj) -> f (PhysicalObj, PhysicalObj)
- invMassM2 :: InvMass2 -> InvMass2 -> Diag6
- isStatic :: InvMass2 -> Bool
- isStaticLin :: InvMass2 -> Bool
- isStaticRot :: InvMass2 -> Bool
- _constrainedInvMassM2 :: (PhysicalObj, PhysicalObj) -> Diag6
- _physObjTransform :: PhysicalObj -> WorldTransform
- velocity2 :: PhysicalObj -> PhysicalObj -> V6
- lagrangian2 :: (PhysicalObj, PhysicalObj) -> Constraint -> Lagrangian
- effMassM2 :: V6 -> PhysicalObj -> PhysicalObj -> Double
- constraintImpulse2 :: V6 -> Lagrangian -> V6
- updateVelocity2_ :: V6 -> Diag6 -> V6 -> V6
- applyLagrangian2 :: Diag6 -> V6 -> Lagrangian -> (PhysicalObj, PhysicalObj) -> (PhysicalObj, PhysicalObj)
- solveConstraint :: Constraint -> (PhysicalObj, PhysicalObj) -> (PhysicalObj, PhysicalObj)
- applyLagrangian :: Lagrangian -> Constraint -> (PhysicalObj, PhysicalObj) -> (PhysicalObj, PhysicalObj)
- advanceObj :: PhysicalObj -> Double -> PhysicalObj
- module Physics.Constraint.Types
Documentation
Multiplicative inverse of linear and rotational mass
data PhysicalObj Source #
The state of motion for a physical body. Rotation is measured in the Z direction (right-handed coordinates).
PhysicalObj | |
|
_physObjVel3 :: PhysicalObj -> V3 Source #
physObjVel3 :: Functor f => (V3 -> f V3) -> PhysicalObj -> f PhysicalObj Source #
Lens for 3D velocity vector: (v_x, v_y, v_rot)
toInvMass2 :: (Double, Double) -> InvMass2 Source #
Convert (linear mass, rotational inertia) into InvMass2
.
Use 0 for infinite mass (non-translating/non-rotating objects).
data Constraint Source #
A constraint equation between two objects to be solved using the objects' state of motion
Constraint | |
|
type Constraint' p = (p, p) -> Constraint Source #
Generates a constraint equation from a pair of objects
type PhysObjChanged = PhysicalObj -> PhysicalObj -> Bool Source #
Are these two different motion states? Used to determine whether the constraint solver has converged.
_constrainedVel6 :: (PhysicalObj, PhysicalObj) -> V6 Source #
Get a 6D velocity vector for a pair of objects. (a_vx, a_vy, a_vr, b_vx, b_vy, b_vr)
Called "constrained" because it's used with objects constrained together.
constrainedVel6 :: Functor f => (V6 -> f V6) -> (PhysicalObj, PhysicalObj) -> f (PhysicalObj, PhysicalObj) Source #
Lens for 6D velocity vector (_constrainedVel6
)
invMassM2 :: InvMass2 -> InvMass2 -> Diag6 Source #
6x6 diagonal matrix of inverse mass
invMassM2 (InvMass2 ma ia) (InvMass2 mb ib) = Diag6 (V6 ma ma ia mb mb ib)
isStaticLin :: InvMass2 -> Bool Source #
Is this object non-translating (no center-of-mass movement)?
isStaticRot :: InvMass2 -> Bool Source #
Is this object non-rotating?
_constrainedInvMassM2 :: (PhysicalObj, PhysicalObj) -> Diag6 Source #
see invMassM2
_physObjTransform :: PhysicalObj -> WorldTransform Source #
Get WorldTransform
from origin to the current position
(translation & rotation) of an object.
velocity2 :: PhysicalObj -> PhysicalObj -> V6 Source #
Get a 6D velocity vector for a pair of objects.
Same as _constrainedVel6
lagrangian2 :: (PhysicalObj, PhysicalObj) -> Constraint -> Lagrangian Source #
Use objects' current state of motion to solve their constraint equation.
The Lagrangian
multiplier is the (signed) magnitude
of the constraint impulse along the constraint axis.
:: V6 | Jacobian |
-> PhysicalObj | |
-> PhysicalObj | |
-> Double | Inverse of effective mass |
The inverse effective mass of a pair of objects along the constraint axis
:: V6 | Jacobian |
-> Lagrangian | |
-> V6 | 6D constraint impulse vector |
Get the impulse that solves a constraint equation.
:: V6 | 6D velocity for two objects |
-> Diag6 | Inverse mass for two objects |
-> V6 | 6D constraint impulse |
-> V6 | New 6D velocity |
Apply a constraint impulse to two objects.
:: Diag6 | Inverse mass |
-> V6 | Jacobian |
-> Lagrangian | |
-> (PhysicalObj, PhysicalObj) | |
-> (PhysicalObj, PhysicalObj) |
Use a Lagrangian multiplier to update a pair of objects.
:: Constraint | Constraint equation |
-> (PhysicalObj, PhysicalObj) | |
-> (PhysicalObj, PhysicalObj) | Updated state of motion |
Solve a constraint between two objects.
:: Lagrangian | Lagrangian multiplier from solving the constraint |
-> Constraint | The constraint equation |
-> (PhysicalObj, PhysicalObj) | |
-> (PhysicalObj, PhysicalObj) | Updated state of motion |
Use a Lagrangian multiplier to update a pair of objects.
advanceObj :: PhysicalObj -> Double -> PhysicalObj Source #
Advance the position (translation & rotation) of an object by applying its velocity over a time delta.
module Physics.Constraint.Types