2013-11-12 12:33:52 +01:00
/////////////////////////////////////////////////////////////////////
// Created by Dan Andersson 2013
/////////////////////////////////////////////////////////////////////
# ifndef OYSTER_PHYSICS_3D_RIGIDBODY_H
# define OYSTER_PHYSICS_3D_RIGIDBODY_H
# include "OysterMath.h"
# include "OysterCollision3D.h"
# include "OysterPhysics3D.h"
2014-01-23 19:13:02 +01:00
# include "Inertia.h"
2013-11-12 12:33:52 +01:00
namespace Oyster { namespace Physics3D
{
struct RigidBody
2013-12-19 21:39:20 +01:00
{ //! A struct of a simple rigid body.
2013-11-12 12:33:52 +01:00
public :
2014-01-28 09:23:58 +01:00
: : Oyster : : Math : : Float3 centerPos , //!< Location of the body's center in the world.
2013-12-19 21:39:20 +01:00
axis , //!< Euler rotationAxis of the body.
boundingReach , //!<
momentum_Linear , //!< The linear momentum G (kg*m/s).
momentum_Angular , //!< The angular momentum H (Nm*s) around an parallell axis.
impulse_Linear , //!< The linear impulse sum Jl (kg*m/s) that will be consumed each update.
2014-01-21 14:56:34 +01:00
impulse_Angular , //!< The angular impulse sum Ja (kg*m^2/s) that will be consumed each update.
gravityNormal ;
2013-12-19 21:39:20 +01:00
: : Oyster : : Math : : Float restitutionCoeff , //!<
frictionCoeff_Static , //!<
frictionCoeff_Kinetic ; //!<
RigidBody ( ) ;
2013-11-12 12:33:52 +01:00
RigidBody & operator = ( const RigidBody & body ) ;
2013-12-19 21:39:20 +01:00
void Update_LeapFrog ( : : Oyster : : Math : : Float updateFrameLength ) ;
2014-01-28 09:23:58 +01:00
void Predict_LeapFrog ( : : Oyster : : Math : : Float3 & outDeltaPos , : : Oyster : : Math : : Float3 & outDeltaAxis , const : : Oyster : : Math : : Float3 & actingLinearImpulse , const : : Oyster : : Math : : Float3 & actingAngularImpulse , : : Oyster : : Math : : Float deltaTime ) ;
2013-11-12 12:33:52 +01:00
2014-01-28 09:23:58 +01:00
void Move ( const : : Oyster : : Math : : Float3 & deltaPos , const : : Oyster : : Math : : Float3 & deltaAxis ) ;
void ApplyImpulse ( const : : Oyster : : Math : : Float3 & worldJ , const : : Oyster : : Math : : Float3 & atWorldPos ) ;
void ApplyImpulse_Linear ( const : : Oyster : : Math : : Float3 & worldJ ) ;
void ApplyImpulse_Angular ( const : : Oyster : : Math : : Float3 & worldJ ) ;
void ApplyForce ( const : : Oyster : : Math : : Float3 & worldF , : : Oyster : : Math : : Float updateFrameLength ) ;
void ApplyForce ( const : : Oyster : : Math : : Float3 & worldF , : : Oyster : : Math : : Float updateFrameLength , const : : Oyster : : Math : : Float3 & atWorldPos ) ;
2013-11-12 12:33:52 +01:00
// GET METHODS ////////////////////////////////
2014-01-23 19:13:02 +01:00
const : : Oyster : : Physics3D : : MomentOfInertia & GetMomentOfInertia ( ) const ;
: : Oyster : : Math : : Float GetMass ( ) const ;
2014-01-28 09:23:58 +01:00
const : : Oyster : : Math : : Quaternion & GetRotationQuaternion ( ) const ;
2014-01-23 19:13:02 +01:00
: : Oyster : : Math : : Float4x4 GetRotationMatrix ( ) const ;
: : Oyster : : Math : : Float4x4 GetOrientation ( ) const ;
: : Oyster : : Math : : Float4x4 GetView ( ) const ;
: : Oyster : : Math : : Float4x4 GetToWorldMatrix ( ) const ;
: : Oyster : : Math : : Float4x4 GetToLocalMatrix ( ) const ;
2014-01-28 09:23:58 +01:00
: : Oyster : : Math : : Float3 GetSize ( ) const ;
: : Oyster : : Math : : Float3 GetVelocity_Linear ( ) const ;
: : Oyster : : Math : : Float3 GetVelocity_Angular ( ) const ;
: : Oyster : : Math : : Float3 GetLinearMomentum ( const : : Oyster : : Math : : Float3 & atWorldPos ) const ;
2013-11-12 12:33:52 +01:00
// SET METHODS ////////////////////////////////
2014-01-23 19:13:02 +01:00
void SetMomentOfInertia_KeepVelocity ( const : : Oyster : : Physics3D : : MomentOfInertia & localTensorI ) ;
void SetMomentOfInertia_KeepMomentum ( const : : Oyster : : Physics3D : : MomentOfInertia & localTensorI ) ;
2013-11-12 12:33:52 +01:00
void SetMass_KeepVelocity ( const : : Oyster : : Math : : Float & m ) ;
void SetMass_KeepMomentum ( const : : Oyster : : Math : : Float & m ) ;
2014-01-28 09:23:58 +01:00
//void SetOrientation( const ::Oyster::Math::Float4x4 &o );
//void SetRotation( const ::Oyster::Math::Float4x4 &r );
void SetSize ( const : : Oyster : : Math : : Float3 & widthHeight ) ;
2013-11-20 11:09:27 +01:00
2014-01-28 09:23:58 +01:00
void SetMomentum_Linear ( const : : Oyster : : Math : : Float3 & worldG , const : : Oyster : : Math : : Float3 & atWorldPos ) ;
2013-12-19 21:39:20 +01:00
2014-01-28 09:23:58 +01:00
void SetVelocity_Linear ( const : : Oyster : : Math : : Float3 & worldV ) ;
void SetVelocity_Linear ( const : : Oyster : : Math : : Float3 & worldV , const : : Oyster : : Math : : Float3 & atWorldPos ) ;
void SetVelocity_Angular ( const : : Oyster : : Math : : Float3 & worldW ) ;
2013-12-19 21:39:20 +01:00
2014-01-28 09:23:58 +01:00
void SetImpulse_Linear ( const : : Oyster : : Math : : Float3 & worldJ , const : : Oyster : : Math : : Float3 & atWorldPos ) ;
//void SetForce( const ::Oyster::Math::Float3 &worldF, ::Oyster::Math::Float updateFrameLength );
//void SetForce( const ::Oyster::Math::Float3 &worldF, ::Oyster::Math::Float updateFrameLength, const ::Oyster::Math::Float3 &atWorldPos );
2013-11-12 12:33:52 +01:00
private :
2013-12-19 21:39:20 +01:00
: : Oyster : : Math : : Float mass ; //!< m (kg)
2014-01-23 19:13:02 +01:00
//::Oyster::Math::Float4x4 momentOfInertiaTensor; //!< I (Nm*s) Tensor matrix ( only need to be 3x3 matrix, but is 4x4 for future hardware acceleration ) (localValue)
: : Oyster : : Physics3D : : MomentOfInertia momentOfInertiaTensor ;
2013-12-19 21:39:20 +01:00
: : Oyster : : Math : : Quaternion rotation ; //!< RotationAxis of the body.
2013-11-12 12:33:52 +01:00
} ;
} }
2013-12-19 21:39:20 +01:00
# include "RigidBody_Inline.h"
2013-11-12 12:33:52 +01:00
# endif