Game Development Reference

In-Depth Information

barrel also spin and are affected by this Magnus force. There have even been sailboats

built with tall, vertical, rotating cylindrical “sails” that use the Magnus force for pro‐

pulsion. We've also seen technical articles describing a propeller with spinning cylin‐

drical blades instead of airfoil-type blades.

To further illustrate the Magnus effect, we've prepared a simple example program that

simulates a ball being thrown with varying amounts of backspin (or topspin). This

example is based on the cannon example, so here again, the code should look familiar

to you. In this example we've neglected drag, so the only forces that the ball will see are

due to gravity and the Magnus effect. We did this to isolate the lift-generating effect of

spin and to keep the equations of motion clearer.

Since most of the code for this example is identical, or very similar, to the previous

cannon examples, we won't repeat it here. We will, however, show you the global vari‐

ables used in this simulation along with a revised
DoSimulation
function that takes care

of the equations of motion:

//----------------------------------------------------------------------------//

// Global variables required for this simulation

//----------------------------------------------------------------------------//

TVector V1; // Initial velocity (given), m/s

TVector V2; // Velocity vector at time t, m/s

double m; // Projectile mass (given), kg

TVector s1; // Initial position (given), m

TVector s2; // The projectile's position (displacement) vector, m

double time; // The time from the instant the projectile

// is launched, s

double tInc; // The time increment to use when stepping

// through the simulation, s

double g; // acceleration due to gravity (given), m/s^2

double spin; // spin in rpm (given)

double omega; // spin in radians per second

double radius; // radius of projectile (given), m

#define PI 3.14159f

#define RHO 1.225f // kg/m^3

//----------------------------------------------------------------------------//

int DoSimulation(void)

//----------------------------------------------------------------------------//

{

double C = PI * PI * RHO * radius * radius * radius * omega;

double t;

// step to the next time in the simulation

time+=tInc;

t = time;

// Calc. V2:

V2.i = 1.0f/(1.0f-(t/m)*(t/m)*C*C) * (V1.i + C * V1.j * (t/m) −