Documentation

Overview

Package equation implements SPOOK equations based on the 2007 PhD thesis of Claude Lacoursière titled "Ghosts and Machines: Regularized Variational Methods for Interactive Simulations of Multibodies with Dry Frictional Contacts"

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Cone

type Cone struct {
	Equation
	// contains filtered or unexported fields
}

Cone is a cone constraint equation. Works to keep the given body world vectors aligned, or tilted within a given angle from each other.

func NewCone

func NewCone(bodyA, bodyB IBody, axisA, axisB *math32.Vector3, angle, maxForce float32) *Cone

NewCone creates and returns a pointer to a new Cone equation object.

func (*Cone) Angle

func (ce *Cone) Angle() float32

MaxAngle returns the cone angle.

func (*Cone) AxisA

func (ce *Cone) AxisA() math32.Vector3

AxisA returns the axis of body A.

func (*Cone) AxisB

func (ce *Cone) AxisB() math32.Vector3

AxisB returns the axis of body B.

func (*Cone) ComputeB

func (ce *Cone) ComputeB(h float32) float32

ComputeB

func (*Cone) SetAngle

func (ce *Cone) SetAngle(angle float32)

SetAngle sets the cone angle.

func (*Cone) SetAxisA

func (ce *Cone) SetAxisA(axisA *math32.Vector3)

SetAxisA sets the axis of body A.

func (*Cone) SetAxisB

func (ce *Cone) SetAxisB(axisB *math32.Vector3)

SetAxisB sets the axis of body B.

type Contact

type Contact struct {
	Equation
	// contains filtered or unexported fields
}

Contact is a contact/non-penetration constraint equation.

func NewContact

func NewContact(bodyA, bodyB IBody, minForce, maxForce float32) *Contact

NewContact creates and returns a pointer to a new Contact equation object.

func (*Contact) ComputeB

func (ce *Contact) ComputeB(h float32) float32

ComputeB

func (*Contact) Normal

func (ce *Contact) Normal() math32.Vector3

func (*Contact) RA

func (ce *Contact) RA() math32.Vector3

func (*Contact) RB

func (ce *Contact) RB() math32.Vector3

func (*Contact) Restitution

func (ce *Contact) Restitution() float32

func (*Contact) SetNormal

func (ce *Contact) SetNormal(newNormal *math32.Vector3)

func (*Contact) SetRA

func (ce *Contact) SetRA(newRa *math32.Vector3)

func (*Contact) SetRB

func (ce *Contact) SetRB(newRb *math32.Vector3)

func (*Contact) SetRestitution

func (ce *Contact) SetRestitution(r float32)

type Equation

type Equation struct {
	// contains filtered or unexported fields
}

Equation is a SPOOK constraint equation.

func NewEquation

func NewEquation(bi, bj IBody, minForce, maxForce float32) *Equation

NewEquation creates and returns a pointer to a new Equation object.

func (*Equation) BodyA

func (e *Equation) BodyA() IBody

func (*Equation) BodyB

func (e *Equation) BodyB() IBody

func (*Equation) ComputeB

func (e *Equation) ComputeB(h float32) float32

ComputeB computes the RHS of the SPOOK equation.

func (*Equation) ComputeC

func (e *Equation) ComputeC() float32

ComputeC computes the denominator part of the SPOOK equation: C = G*inv(M)*G' + eps.

func (*Equation) ComputeGW

func (e *Equation) ComputeGW() float32

ComputeGW computes G*W, where W are the body velocities.

func (*Equation) ComputeGiMGt

func (e *Equation) ComputeGiMGt() float32

ComputeGiMGt computes G*inv(M)*G'.

func (*Equation) ComputeGiMf

func (e *Equation) ComputeGiMf() float32

ComputeGiMf computes G*inv(M)*f, where M is the mass matrix with diagonal blocks for each body, and f are the forces on the bodies.

func (*Equation) ComputeGq

func (e *Equation) ComputeGq() float32

ComputeGq computes G*q, where q are the generalized body coordinates.

func (*Equation) Enabled

func (e *Equation) Enabled() bool

Enabled returns the enabled flag of the equation.

func (*Equation) Eps

func (e *Equation) Eps() float32

Returns epsilon - the regularization constant which is multiplied by the identity matrix.

func (*Equation) JeA

func (e *Equation) JeA() JacobianElement

func (*Equation) JeB

func (e *Equation) JeB() JacobianElement

func (*Equation) MaxForce

func (e *Equation) MaxForce() float32

MaxForce returns the maximum force to be applied by the constraint.

func (*Equation) MinForce

func (e *Equation) MinForce() float32

MinForce returns the minimum force to be applied by the constraint.

func (*Equation) Multiplier

func (e *Equation) Multiplier() float32

MaxForce returns the multiplier.

func (*Equation) SetBodyA

func (e *Equation) SetBodyA(ibody IBody)

func (*Equation) SetBodyB

func (e *Equation) SetBodyB(ibody IBody)

func (*Equation) SetEnabled

func (e *Equation) SetEnabled(state bool)

SetEnable sets the enabled flag of the equation.

func (*Equation) SetMaxForce

func (e *Equation) SetMaxForce(maxForce float32)

SetMaxForce sets the maximum force to be applied by the constraint.

func (*Equation) SetMinForce

func (e *Equation) SetMinForce(minForce float32)

SetMinForce sets the minimum force to be applied by the constraint.

func (*Equation) SetMultiplier

func (e *Equation) SetMultiplier(multiplier float32)

SetMultiplier sets the multiplier.

func (*Equation) SetSpookParams

func (e *Equation) SetSpookParams(stiffness, relaxation float32, timeStep float32)

SetSpookParams recalculates a, b, eps.

type Friction

type Friction struct {
	Equation
	// contains filtered or unexported fields
}

Friction is a friction constraint equation.

func NewFriction

func NewFriction(bodyA, bodyB IBody, slipForce float32) *Friction

NewFriction creates and returns a pointer to a new Friction equation object. slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g

func (*Friction) ComputeB

func (fe *Friction) ComputeB(h float32) float32

ComputeB

func (*Friction) RA

func (fe *Friction) RA() math32.Vector3

func (*Friction) RB

func (fe *Friction) RB() math32.Vector3

func (*Friction) SetRA

func (fe *Friction) SetRA(newRa *math32.Vector3)

func (*Friction) SetRB

func (fe *Friction) SetRB(newRb *math32.Vector3)

func (*Friction) SetTangent

func (fe *Friction) SetTangent(newTangent *math32.Vector3)

func (*Friction) Tangent

func (fe *Friction) Tangent() math32.Vector3

type IBody

type IBody interface {
	Index() int
	Position() math32.Vector3
	Velocity() math32.Vector3
	AngularVelocity() math32.Vector3
	Force() math32.Vector3
	Torque() math32.Vector3
	InvMassEff() float32
	InvRotInertiaWorldEff() *math32.Matrix3
}

IBody is the interface of all body types.

type IEquation

type IEquation interface {
	SetBodyA(IBody)
	BodyA() IBody
	SetBodyB(IBody)
	BodyB() IBody
	JeA() JacobianElement
	JeB() JacobianElement
	SetEnabled(state bool)
	Enabled() bool
	MinForce() float32
	MaxForce() float32
	Eps() float32
	SetMultiplier(multiplier float32)
	ComputeB(h float32) float32
	ComputeC() float32
}

IEquation is the interface type for all equations types.

type JacobianElement

type JacobianElement struct {
	// contains filtered or unexported fields
}

JacobianElement contains 6 entries, 3 spatial and 3 rotational degrees of freedom.

func (*JacobianElement) MultiplyElement

func (je *JacobianElement) MultiplyElement(je2 *JacobianElement) float32

MultiplyElement multiplies the JacobianElement with another JacobianElement. None of the elements are changed.

func (*JacobianElement) MultiplyVectors

func (je *JacobianElement) MultiplyVectors(spatial *math32.Vector3, rotational *math32.Vector3) float32

MultiplyElement multiplies the JacobianElement with two vectors. None of the elements are changed.

func (*JacobianElement) Rotational

func (je *JacobianElement) Rotational() math32.Vector3

Rotational returns the rotational component of the JacobianElement.

func (*JacobianElement) SetRotational

func (je *JacobianElement) SetRotational(rotational *math32.Vector3)

Rotational sets the rotational component of the JacobianElement.

func (*JacobianElement) SetSpatial

func (je *JacobianElement) SetSpatial(spatial *math32.Vector3)

SetSpatial sets the spatial component of the JacobianElement.

func (*JacobianElement) Spatial

func (je *JacobianElement) Spatial() math32.Vector3

Spatial returns the spatial component of the JacobianElement.

type Rotational

type Rotational struct {
	Equation
	// contains filtered or unexported fields
}

Rotational is a rotational constraint equation. Works to keep the local vectors orthogonal to each other in world space.

func NewRotational

func NewRotational(bodyA, bodyB IBody, maxForce float32) *Rotational

NewRotational creates and returns a pointer to a new Rotational equation object.

func (*Rotational) AxisA

func (re *Rotational) AxisA() math32.Vector3

AxisA returns the axis of body A.

func (*Rotational) AxisB

func (re *Rotational) AxisB() math32.Vector3

AxisB returns the axis of body B.

func (*Rotational) ComputeB

func (re *Rotational) ComputeB(h float32) float32

ComputeB

func (*Rotational) MaxAngle

func (re *Rotational) MaxAngle() float32

MaxAngle returns the maximum angle.

func (*Rotational) SetAxisA

func (re *Rotational) SetAxisA(axisA *math32.Vector3)

SetAxisA sets the axis of body A.

func (*Rotational) SetAxisB

func (re *Rotational) SetAxisB(axisB *math32.Vector3)

SetAxisB sets the axis of body B.

func (*Rotational) SetMaxAngle

func (re *Rotational) SetMaxAngle(angle float32)

SetAngle sets the maximum angle.

type RotationalMotor

type RotationalMotor struct {
	Equation // TODO maybe this should embed Rotational instead ?
	// contains filtered or unexported fields
}

RotationalMotor is a rotational motor constraint equation. Tries to keep the relative angular velocity of the bodies to a given value.

func NewRotationalMotor

func NewRotationalMotor(bodyA, bodyB IBody, maxForce float32) *RotationalMotor

NewRotationalMotor creates and returns a pointer to a new RotationalMotor equation object.

func (*RotationalMotor) AxisA

func (ce *RotationalMotor) AxisA() math32.Vector3

AxisA returns the axis of body A.

func (*RotationalMotor) AxisB

func (ce *RotationalMotor) AxisB() math32.Vector3

AxisB returns the axis of body B.

func (*RotationalMotor) ComputeB

func (re *RotationalMotor) ComputeB(h float32) float32

ComputeB

func (*RotationalMotor) SetAxisA

func (ce *RotationalMotor) SetAxisA(axisA *math32.Vector3)

SetAxisA sets the axis of body A.

func (*RotationalMotor) SetAxisB

func (ce *RotationalMotor) SetAxisB(axisB *math32.Vector3)

SetAxisB sets the axis of body B.

func (*RotationalMotor) SetTargetSpeed

func (ce *RotationalMotor) SetTargetSpeed(speed float32)

SetTargetSpeed sets the target speed.

func (*RotationalMotor) TargetSpeed

func (ce *RotationalMotor) TargetSpeed() float32

TargetSpeed returns the target speed.