Lab 7: More Projectiles

Download Report

Transcript Lab 7: More Projectiles

CS 282

Last week we dealt with projectile physics
◦ Examined the gravity-only model
◦ Coded drag affecting projectiles
 Used Runge-Kutta for approximating integration
◦ Coded wind effect

This week we will add the last effect…

First of all, open up a completed version of
last week’s lab
◦ If neither you nor your partner have it, you will have
to code it again. Refer to last week’s instructions.

So that we have a common starting ground,
set the parameters for the following…
◦
◦
◦
◦
Initial position: (0.0, 0.0, 0.0)
Initial Velocity: (15.0, 20.0, 1.0)
Drag Coefficient: 0.05 Mass: 10.0 Radius: 1.2
Wind Velocity: (5.0, 2.0, 0.0)

Compile it and run the following scenarios
◦ IMPORTANT: Limit your simulations by either time (i.e. 5
seconds) or by position (when y position is at 0)
 Gravity-only model
 Gravity and Drag Model
 Gravity, Drag, and Wind Model

Start outputting the magnitude of the velocity to
the screen for each model
◦ sqrt (vx2 + vy2 + vz2)

Capture these outputs in separate files
◦ Use > on the command-line

Spin is a very common occurrence when
dealing with projectile physics.
◦ A bullet leaving a gun will have spin
◦ A golf ball will also have spin when hit by the club

Spinning objects generate force

First of all, a spinning object generates lift
◦ This is called the Magnus effect (also known as
Robin’s effect)
◦ The direction of the force will be perpendicular to
the velocity and spin direction

If the object has backspin…
◦ Then the Magnus force will be positive in the
vertical direction, propelling the object upwards

On the other hand, if the object has topspin…
◦ The resulting force will be in the opposite direction,
thus pushing the object down


Here we can see all the forces interacting with
our ball (minus the wind)
Glossary:
◦ CL (lift coefficient)
◦ p (fluid density)
 Greek letter rho
◦
◦
◦
◦
v (velocity magnitude)
A (characteristic area)
R (spin axis vector)
w (rotation velocity)
 Greek letter omega

We need to create some variables in our class
◦ We will need the following doubles…
 Spin axis components: X-axis rotation, Y-axis rotation,
Z-axis rotation
 Angular/Rotational velocity (omega)
◦ And some way of setting/initializing them
 You can either have them be public and manually set
them, or create get/set functions (better)

Create a spin_wind_drag function
◦ It will need to take delta time as a parameter
◦ HINT: We will be using Runge-Kutta

For a sphere, the force FM is defined as…
◦ FM = ½ CL* p * v2 * A
 For p and A, you can just use the values calculated in the
main driver function
◦ CL = (radius * rotational velocity) / v

Solve the following in terms of acceleration
(remember F = ma) and add them to their
corresponding acceleration components.
◦ FMx = - (vy/v) * Ry * FM
◦ FMy = - (vx/v) * Rz * FM
◦ FMz = 0
 Because we will rotate the sphere along the Z-axis, this
component will be 0 (e.g. 0,0,1 for the spin axis vector)


Hopefully, you have now added the acceleration
components to each step of Runge-Kutta.
Be sure to add your k’s appropriately to the new
accelerations you added.

Let’s set the spin axis to 0,0,1

Add the appropriate line of code to the driver

Compile and run

What if our spin axis is on a multiple axes?
◦ Let’s get the general form of the Magnus force





FMx = ((vz / v) * Ry – (vy / v) *Rz) * FM
FMy = ((vx / v) * Rz – (vz / v) *Rx) * FM
FMz = - ((vx / v) * Ry – (vy / v) *Rx) * FM
Use these forces to get your acceleration now
instead of the old forces.
Compile and run the with a spin axis of
◦ (0.5 ,0.5, 0.0)

Use a spin axis of (0.75, 1.0, 0.0)
◦ Default values on the rest


If you have completed the first exercise, you
already have your data for the first three
models.
Collect the data for the drag_wind_spin

Plot a graph showing the differences velocity
magnitude vs. time of all four models.
◦ Bonus point(s) for the models not explicitly mentioned 

If you wish to use a constant delta time (instead of
a timer), you may do so by replacing the
measure_reset call with a flat value (i.e. 0.5)