Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PhysicsSystem Class Reference

#include <physics.h>

Public Member Functions

 PhysicsSystem (float M, float I, QVector *pos, Vector *p, Vector *q, Vector *r)
 
virtual void Rotate (const Vector &axis)
 
virtual void JettisonReactionMass (const Vector &Direction, float speed, float mass)
 
virtual void JettisonMass (const Vector &Direction, float speed, float mass)
 
virtual void ResistiveLiquidTorque (float ResistiveForceCoef)
 
virtual void ResistiveTorque (float ResistiveForceCoef)
 
virtual void ResistiveLiquidForce (float ResistiveForceCoef)
 
virtual void ResistiveForce (float ResistiveForceCoef)
 
virtual void ResistiveThrust (float strength)
 
virtual void ResistiveTorqueThrust (float strength, const Vector &Position)
 
virtual void ApplyForce (const Vector &Vforce, float time)
 
virtual void ApplyTorque (const Vector &Vforce, const Vector &Location, float time)
 
virtual void ApplyLocalTorque (const Vector &Vforce, const Vector &Location, float time)
 
virtual void ApplyBalancedLocalTorque (const Vector &Vforce, const Vector &Location, float time)
 
void ApplyImpulses (float Time)
 
void SetVelocity (Vector v)
 
void SetAngularVelocity (Vector w)
 
const VectorGetVelocity () const
 
const VectorGetAngularVelocity () const
 
virtual void Update ()
 

Detailed Description

Definition at line 38 of file physics.h.

Constructor & Destructor Documentation

PhysicsSystem::PhysicsSystem ( float  M,
float  I,
QVector pos,
Vector p,
Vector q,
Vector r 
)

Definition at line 25 of file physics.cpp.

25  :
26  mass( M )
27  , MomentOfInertia( I )
28  , NetForce( 0, 0, 0 )
29  , NetTorque( 0, 0, 0 )
30  , AngularVelocity( 0, 0, 0 )
31  , Velocity( 0, 0, 0 )
32  , pos( pos )
33  , p( p )
34  , q( q )
35  , r( r )
36 {
37  NumActiveForces = 0;
38  NumActiveTorques = 0;
39 }

Member Function Documentation

void PhysicsSystem::ApplyBalancedLocalTorque ( const Vector Vforce,
const Vector Location,
float  time 
)
virtual

Definition at line 143 of file physics.cpp.

References Force::F, forcemax, and Force::t.

Referenced by CockpitKeys::_PitchDown(), CockpitKeys::_PitchUp(), CockpitKeys::_YawLeft(), CockpitKeys::_YawRight(), and ResistiveTorqueThrust().

144 {
145  if (NumActiveTorques < forcemax) {
146  ActiveTorques[NumActiveTorques].F = Location.Cross( Vforce );
147  ActiveTorques[NumActiveTorques].t = time;
148  ++NumActiveTorques;
149  }
150 }
void PhysicsSystem::ApplyForce ( const Vector Vforce,
float  time 
)
virtual

Definition at line 114 of file physics.cpp.

References Force::F, forcemax, Force::t, and Vforce.

Referenced by ApplyLocalTorque(), ApplyTorque(), and ResistiveThrust().

115 {
116  if (NumActiveForces < forcemax) {
117  ActiveForces[NumActiveForces].F = Vforce;
118  ActiveForces[NumActiveForces].t = time;
119  ++NumActiveForces;
120  }
121 }
void PhysicsSystem::ApplyImpulses ( float  Time)

Definition at line 151 of file physics.cpp.

References co10, Force::F, i, oocc, Rotate(), Force::t, Vector, and y.

Referenced by Update().

152 {
153  Vector temptorque = Time*NetTorque;
154  Vector tempforce = Time*NetForce;
155  int i;
156  for (i = 0; i < NumActiveTorques; ++i) {
157  if (Time >= ActiveTorques[i].t) {
158  temptorque += ActiveTorques[i].t*ActiveTorques[i].F;
159  ActiveTorques[i].F = ActiveTorques[NumActiveTorques-1].F;
160  ActiveTorques[i].t = ActiveTorques[NumActiveTorques-1].t;
161  --NumActiveTorques;
162  --i; //so the loop goes through the active force that was just switched places with
163  } else {
164  temptorque += Time*ActiveTorques[i].F;
165  ActiveTorques[i].t -= Time;
166  }
167  }
168  for (i = 0; i < NumActiveForces; ++i) {
169  if (Time >= ActiveForces[i].t) {
170  tempforce += ActiveForces[i].t*ActiveForces[i].F;
171  ActiveForces[i].F = ActiveForces[NumActiveForces-1].F;
172  ActiveForces[i].t = ActiveForces[NumActiveForces-1].t;
173  NumActiveForces--;
174  i--; //so the loop goes through the active force that was just switched places with
175  } else {
176  tempforce += Time*ActiveForces[i].F;
177  ActiveForces[i].t -= Time;
178  }
179  }
180  temptorque = temptorque*(0.5/MomentOfInertia);
181  Rotate( AngularVelocity+0.5*temptorque );
182  AngularVelocity += temptorque;
183  tempforce = tempforce*(0.5/mass); //acceleration
184  //now the fuck with it... add relitivity to the picture here
185  if (fabs( Velocity.i )+fabs( Velocity.j )+fabs( Velocity.k ) > co10) {
186  float magvel = Velocity.Magnitude();
187  float y = (1-magvel*magvel*oocc);
188  tempforce = tempforce*powf( y, 1.5 );
189  }
190  *pos += (Velocity+.5*tempforce).Cast();
191  Velocity += tempforce;
192 }
void PhysicsSystem::ApplyLocalTorque ( const Vector Vforce,
const Vector Location,
float  time 
)
virtual

Definition at line 133 of file physics.cpp.

References ApplyForce(), Force::F, forcemax, and Force::t.

134 {
135  ApplyForce( Vforce, time );
136  if (NumActiveTorques < forcemax) {
137  ActiveTorques[NumActiveTorques].F = Location.Cross( Vforce );
138  ActiveTorques[NumActiveTorques].t = time;
139  ++NumActiveTorques;
140  }
141 }
void PhysicsSystem::ApplyTorque ( const Vector Vforce,
const Vector Location,
float  time 
)
virtual

Definition at line 123 of file physics.cpp.

References ApplyForce(), Force::F, forcemax, and Force::t.

124 {
125  ApplyForce( Vforce, time );
126  if (NumActiveTorques < forcemax) {
127  ActiveTorques[NumActiveTorques].F = (Location.Cast()-*pos).Cast().Cross( Vforce );
128  ActiveTorques[NumActiveTorques].t = time;
129  ++NumActiveTorques;
130  }
131 }
const Vector& PhysicsSystem::GetAngularVelocity ( ) const
inline

Definition at line 79 of file physics.h.

80  {
81  return AngularVelocity;
82  }
const Vector& PhysicsSystem::GetVelocity ( ) const
inline

Definition at line 75 of file physics.h.

76  {
77  return Velocity;
78  }
void PhysicsSystem::JettisonMass ( const Vector Direction,
float  speed,
float  mass 
)
virtual

Definition at line 108 of file physics.cpp.

References JettisonReactionMass().

109 {
110  mass -= jmass; //fuel is sent out
111  JettisonReactionMass( Direction, speed, jmass );
112 }
void PhysicsSystem::JettisonReactionMass ( const Vector Direction,
float  speed,
float  mass 
)
virtual

Definition at line 103 of file physics.cpp.

References GetElapsedTime().

Referenced by JettisonMass().

104 {
105  NetForce += Direction*( speed*mass/GetElapsedTime() );
106 }
void PhysicsSystem::ResistiveForce ( float  ResistiveForceCoef)
virtual

Definition at line 71 of file physics.cpp.

References Vector.

72 {
73  if ( (Velocity.i || Velocity.j || Velocity.k) && ResistiveForceCoef ) {
74  Vector temp = Velocity;
75  NetForce += (ResistiveForceCoef*Velocity*Velocity)*temp.Normalize();
76  }
77 }
void PhysicsSystem::ResistiveLiquidForce ( float  ResistiveForceCoef)
virtual

Definition at line 45 of file physics.cpp.

46 {
47  NetForce += ResistiveForceCoef*Velocity;
48 }
void PhysicsSystem::ResistiveLiquidTorque ( float  ResistiveForceCoef)
virtual

Definition at line 41 of file physics.cpp.

42 {
43  NetTorque += ResistiveForceCoef*AngularVelocity;
44 }
void PhysicsSystem::ResistiveThrust ( float  strength)
virtual

Definition at line 49 of file physics.cpp.

References ApplyForce(), V1, and Vector.

50 {
51  Vector V1 = Velocity;
52  float mag = V1.Magnitude();
53  float t = mag/fabs( strength );
54  ApplyForce( (strength/mag)*V1, t );
55 }
void PhysicsSystem::ResistiveTorque ( float  ResistiveForceCoef)
virtual

Definition at line 64 of file physics.cpp.

References Vector.

65 {
66  if ( (AngularVelocity.i || AngularVelocity.j || AngularVelocity.k) && ResistiveForceCoef ) {
67  Vector temp = AngularVelocity;
68  NetTorque += (ResistiveForceCoef*AngularVelocity*AngularVelocity)*temp.Normalize();
69  }
70 }
void PhysicsSystem::ResistiveTorqueThrust ( float  strength,
const Vector Position 
)
virtual

Definition at line 56 of file physics.cpp.

References ApplyBalancedLocalTorque(), V1, and Vector.

57 {
58  Vector V1 = AngularVelocity;
59  float mag = V1.Magnitude();
60  float t = mag/fabs( strength );
61  ApplyBalancedLocalTorque( (strength/mag)*V1, Position, t );
62 }
void PhysicsSystem::Rotate ( const Vector axis)
virtual

Definition at line 86 of file physics.cpp.

References Quaternion::Conjugate(), UniverseUtil::cos(), f, UniverseUtil::sin(), and Quaternion::v.

Referenced by ApplyImpulses().

87 {
88  float theta = axis.Magnitude();
89  if (theta == 0.0f)
90  return;
91  float ootheta = 1/theta;
92  float s = cos( theta*.5 );
93  Quaternion rot = Quaternion( s, axis*(sin( theta*.5 )*ootheta) );
94  Quaternion rotprime = rot.Conjugate();
95  Quaternion pquat = rot*Quaternion( 0, *p )*rotprime;
96  Quaternion qquat = rot*Quaternion( 0, *q )*rotprime;
97  Quaternion rquat = rot*Quaternion( 0, *r )*rotprime;
98  *p = pquat.v;
99  *q = qquat.v;
100  *r = rquat.v;
101 }
void PhysicsSystem::SetAngularVelocity ( Vector  w)
inline
void PhysicsSystem::SetVelocity ( Vector  v)
inline

Definition at line 67 of file physics.h.

References v.

68  {
69  Velocity = v;
70  }
void PhysicsSystem::Update ( )
virtual

Definition at line 79 of file physics.cpp.

References ApplyImpulses(), GetElapsedTime(), getTimeCompression(), and Vector.

Referenced by Camera::UpdateGFX().

80 {
82  NetForce = Vector( 0, 0, 0 );
83  NetTorque = Vector( 0, 0, 0 );
84 }

The documentation for this class was generated from the following files: