Game Development Reference

In-Depth Information

We can include the damping in the equations to give a damped harmonic oscilla-

tor. The differential equation 6.3 becomes

¨

˙

p

=−

k
p

−

d

p

where
k
is the spring constant (no need for
χ
in this case) and
d
is a drag coefficient

(it matches the
k
1
coefficient from equation 5.1 in the previous chapter). This equa-

tion doesn't allow for drag that is proportional to the velocity squared—that is, the
k
2

value from equation 5.1. If we added this, the mathematics would become consider-

ably more complex for little visible improvement (remember, we're faking this in any

case). So we stick with the simplest kind of drag.

Solving the differential equation gives an expression for the position at any time

in the future:

p
t
=
p
0
cos
(γ t)

c
sin
(γ t)
e
−

1

2
dt

+

where
γ
is a constant given by

2
4
k

1

γ

=

−

d
2

and
c
is a constant given by

d

2
γ
p
0
+

1

γ
˙

c

=

p
0

Substituting the time interval for
t
in these equations, as before, we can get a value

for
p
t
, and calculate the acceleration required using equation 6.5, as we did for regular

harmonic motion.

Implementation

The code to implement a fake implicit spring force generator looks like this:

Excerpt from include/cyclone/precision.h

/** Defines the precision of the sine operator. */

#define real_sin sinf

/** Defines the precision of the cosine operator. */

#define real_cos cosf

/** Defines the precision of the exponent operator. */

#define real_exp expf

Excerpt from include/cyclone/pfgen.h

/**

* A force generator that fakes a stiff spring force, and where

* one end is attached to a fixed point in space.