Jogamp
ff3a5ba25183f5b562145f15c9af678f76694731
[joal-demos.git] / www / devmaster / lesson7.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3 <head>
4 <title>Lesson 7: The Doppler Effect</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6 <link rel="stylesheet" type="text/css" href="general.css">
7 </head>
8 <body>
9 <div Align=center> 
10   <img ID="NavBar" WIDTH=800 HEIGHT=64 SRC="http://games.dev.java.net/images/navbar2p.gif" VSPACE=0 HSPACE=0 ALIGN="TOP" BORDER=0 USEMAP="#NavBar_MAP" NOFINSIDE="~!   ~!" > </div>
11   
12 <MAP NAME="NavBar_Map">
13   <AREA SHAPE="rect" ALT="Projects" COORDS="356,14,440,46" HREF="http://games.dev.java.net" TARGET="_self">
14   <AREA SHAPE="rect" ALT="Wiki" COORDS="643,14,695,46" HREF="http://wiki.java.net/bin/view/Games">
15   <AREA SHAPE="rect" ALT="Weblogs" COORDS="562,15,624,46" HREF="http://weblogs.java.net/weblogs/project/games">
16   <AREA SHAPE="rect" COORDS="463,16,541,45" HREF="http://www.javagaming.org/cgi-bin/JGNetForums/YaBB.cgi" target="_top" ALT="Forums">
17   <AREA SHAPE="rect" ALT="JavaGames Home" COORDS="147,16,334,48" HREF="http://community.java.net/games">
18   <AREA SHAPE="rect" ALT="Java.net" COORDS="21,15,128,46" HREF="http://www.java.net" TARGET="_self">
19 </MAP>
20 <br>
21 <br>
22 OpenAL Tutorials from DevMaster.net. Reprinted with Permission.<br>
23 <br>
24 <table border="0" cellspacing="0" style="border-collapse: collapse" width="100%" cellpadding="0" id="AutoNumber1" height="12" bgcolor="#666699">
25   <tr> 
26     <td width="47%" height="12" valign="middle"><p><b><font color="#FFFFFF">OpenAL 
27         Tutorials</font></b></p></td>
28     <td width="53%" height="12" align="right" valign="middle"><p align="right"><a href="http://devmaster.net/"><font color="#66FF99">DevMaster.net</font></a></p></td>
29   </tr>
30 </table>
31 <p class="ArticleTitle"><font size="5">The Doppler Effect<br>
32   </font><font color="#000000" size="4"><strong>Lesson 7</strong></font></p>
33 <p align="right" class="ArticleAuthor">Author: <a href="mailto:lightonthewater@hotmail.com">Jesse 
34   Maurais</a><br>
35   Adapted For Java By: <a href="mailto:athomas@dev.java.net">Athomas Goldberg</a></p>
36 <h1>A Look at Real-World Physics</h1>
37 <p align="justify">I know this will be boring review for anyone with a course 
38   in high school physics, but lets humour ourselves. The Doppler effect can be 
39   a very tricky concept for some people, but it is a logical process, and kind 
40   of interesting when you get right down to it. To begin understanding the Doppler 
41   effect we first must start to understand what a &quot;sound&quot; really is. 
42   Basically a sound is your minds interpretation of a compression wave that is 
43   traveling through the air. Whenever the air becomes disturbed it starts a wave 
44   which compresses the air particles around it. This wave travels outward from 
45   it's point of origin. Consider the following diagram.</p>
46 <p align="justify"><img src="sound_waves.jpg" width="150" height="132" hspace="5" vspace="0" border="0" align="left">In 
47   this diagram (on the left) the big red &quot;S&quot; stands for the sources 
48   position, and the big red &quot;L&quot; stands for (you guessed it), the Listener's 
49   position. Both source and Listener are not moving. The source is emitting compression 
50   waves outward, which are represented in this diagram by the blue circles. The 
51   Listener is experiencing the sound exactly as it is being made in this diagram. 
52   The Doppler effect is not actually present in this example since there is no 
53   motion; the Doppler effect only describes the warping of sound due to motion.</p>
54 <p align="justify">What you should try to do is picture this diagram animated. 
55   When the source emits a wave (the circles) it will look as though it is growing 
56   away from it's point of origin, which is the sources position. A good example 
57   of a similar effect is the ripples in a pond. When you throw a pebble into a 
58   calm body of water it will emit waves which constantly move away from the point 
59   of impact. Believe it or not this occurs from the exact same physical properties. 
60   But what does this have to do with the Doppler effect? Check out the next diagram 
61   (on the right).</p>
62
63 <p align="justify"> <img src="doppler_effect.jpg" width="150" height="132" hspace="5" border="0" align="right">Wow, 
64   what's going on here? The source is now in motion, indicated by the little red 
65   arrow. In fact the source is now moving towards the Listener with an implied 
66   velocity. Notice particularly that the waves (circles) are being displaced inside 
67   each other. The displacement follows the approximate path of the source which 
68   emits them. This is the key to the Doppler effect. Essentially what has happened 
69   is that the source has emitted a wave at different points in it's path of travel. 
70   The waves it emits do not move with it, but continue on their own path of travel 
71   from the point they were emitted.</p>
72 <p align="justify">So how does this effect the perceived sound by the Listener? 
73   Well, notice too in the last diagram that the waves (circles) that are between 
74   the source and the Listener are kind of compressed together. This will cause 
75   the sound waves to run together, which in turn causes the perceived sound seem 
76   like it's faster. What we are talking about here is frequency. The distances 
77   between the waves effects the frequency of the sound. When the source that emits 
78   the sound is in motion, it causes a change in frequency. You may notice too 
79   that distance between the waves varies at different points in space. For example, 
80   on the opposite side of the moving source (anywhere along the previous path 
81   of travel) the distances are actually wider, so the frequency will be lower 
82   (the distance and frequency have an inverse relationship). What this implies 
83   is that the frequency perceived by the Listener is relative to where the Listener 
84   is standing. </p>
85 <p align="justify">The motion of the Listener can also affect the frequency. This 
86   one is a little harder to picture though. If the source is still, and the Listener 
87   is moving toward the source, then the perceived frequency by the Listener will 
88   be warped in the same exact manner that we described for the moving source. 
89 </p>
90 <p>If you still have trouble picturing this, consider the following two 
91 diagrams:</p>
92 <p align="center"><img border="0" src="sin_wave.jpg" width="255" height="135">&nbsp;&nbsp;
93 <img border="0" src="compress_sin_wave.jpg" width="255" height="135"></p>
94 <p align="justify">These two diagrams will represent the sound in the form of 
95   a sine wave. Look at the first one. Think of the peaks as the instance of the 
96   wave. The very top point of the wave will be the same as the instance of the 
97   blue circle in the previous set of diagrams. The valleys will be like the spaces 
98   in between the blue circles. The second diagram represents a compressed wave. 
99   When you compare the two you will notice an obvious difference. The second diagram 
100   simply has more wave occurrences in the same amount of space. Other ways of 
101   saying this are that they occur more often, with a greater regularity, or with 
102   a greater frequency. </p>
103 <p align="justify">For anyone who is interested in some added information: The 
104   velocity of the waves is the speed of sound. If the velocity of the source is 
105   greater than that of the wave, then the source is breaking the sound barrier.</p>
106 <h1>The Physics of OpenAL</h1>
107
108 <p align="justify">Ok, either you have understood my ramblings on the Doppler 
109   effect from above, or you have skipped it because you already have full knowledge 
110   of the Doppler effect and just want to know how it effects the OpenAL rendering 
111   pipeline. I think the best start to his section will be to quote the OpenAL 
112   spec directly:</p>
113 <blockquote>
114   <p align="justify"><i>&quot;The Doppler Effect depends on the velocities of 
115     Source and Listener relative to the medium, and the propagation speed of sound 
116     in that medium.&quot; - chapter 3, subsection 7&quot;</i></p>
117 </blockquote>
118 <p align="justify">We can take this to mean that there are 3 factors which are 
119   going to affect the final frequency of the sound heard by the Listener. These 
120   factors are the velocity of the source, the velocity of the Listener, and a 
121   predefined speed of sound. </p>
122 <p align="justify">When we refer to a &quot;medium&quot;, what we mean is the 
123   kind of material that both the source and Listener are &quot;in&quot;. For example, 
124   sounds that are heard from underwater are much different than sounds that are 
125   heard in the open air. Air and water are examples of different mediums. The 
126   reason that sound is so different between these mediums has to do with the particle 
127   density. As we said before, sound is nothing but the motion of particles in 
128   the air. In a medium with a much greater particle density the sound will be 
129   much different because the particles are in closer contact. When they are in 
130   closer contact it allows for the wave to travel much better. As an example of 
131   the opposite, think of outer space. In outer space there is an extremely low 
132   particle density. In fact there is only a few very light particles (mostly hydrogen) 
133   scattered about. This is why no sound can be heard from space. </p>
134
135 <p align="justify">Ok, lets get back on topic. OpenAL calculates the Doppler effect 
136   internally for us, so we need only define a few parameters that will effect 
137   the calculation. We would do this in case we don't want a realistic rendering. 
138   Rather if want to exaggerate or deemphasize the effect. The calculation goes 
139   like this.</p>
140 <p><span class="codeNormal">&nbsp;&nbsp;&nbsp; shift = DOPPLER_FACTOR * freq * (DOPPLER_VELOCITY 
141 - l.velocity) / (DOPPLER_VELOCITY + s.velocity)</span></p>
142 <p align="justify">Constants are written in all caps to differentiate. The &quot;l&quot; 
143   and &quot;s&quot; variables are the Listener and source respectively. &quot;freq&quot; 
144   is the initial unaltered frequency of the emitting wave, and &quot;shift&quot; 
145   is the altered frequency of the wave. The term &quot;shift&quot; is the proper 
146   way to address the altered frequency and will be used from now on. This final 
147   shifted frequency will be sampled by OpenAL for all audio streaming that is 
148   affected. </p>
149
150 <p align="justify">We already know that we can define the velocity of both source 
151   and Listener by using the 'AL_VELOCITY' field to 'alListenerfv' and 'alSourcefv'. 
152   The 'freq' parameter comes straight from the buffer properties when it was loaded 
153   from file. To set the constant values the following functions are provided for 
154   us.</p>
155 <pre class=code><font color="#0000FF">public void </font>alDopplerFactor(<font color="#0000FF">float</font> factor);
156 <font color="#0000FF">public void </font>alDopplerVelocity(<font color="#0000FF">float</font> velocity);
157 </pre>
158 <p align="justify">For 'alDopplerFactor' any non-negative value will suffice. 
159   Passing a negative value will raise an error of 'AL_INVALID_VALUE', and the 
160   whole command will be ignored. Passing zero is a perfectly valid argument. Doing 
161   this will disable the Doppler effect and may in fact help overall performance 
162   (but won't be as realistic). The effect of the Doppler factor will directly 
163   change the magnitude of the equation. A value of 1.0 will not change the effect 
164   at all. Passing anything between 0.0 and 1.0 will minimize the Doppler effect, 
165   and anything greater than 1.0 will maximize the effect. </p>
166 <p align="justify">For 'alDopplerVelocity' any non-negative non-zero value will 
167   suffice. Passing either a negative or a zero will raise an error of 'AL_INVALID_VALUE', 
168   and the whole command will be ignored. The Doppler velocity is essentially the 
169   speed of sound. Setting this will be like setting how fast sound can move through 
170   the medium. OpenAL has no sense of medium, but setting the velocity will give 
171   the effect of a medium. OpenAL also has no sense of units (kilometer, miles, 
172   parsecs), so keep that in mind when you set this value so it is consistent with 
173   all other notions of units that you have defined.</p>
174 </p>
175 <table border="0" cellspacing="1" style="border-collapse: collapse" width="100%" id="AutoNumber2" bgcolor="#666699">
176   <tr> 
177     <td width="40%"> <p dir="ltr"><font color="#FFFFFF" size="2">© 2003 DevMaster.net. 
178         All rights reserved.</font></td>
179     <td width="60%"> <p align="right" dir="ltr"><font size="2"><a href="mailto:webmaster@devmaster.net"> 
180         <font color="#FFFFFF">Contact us</font></a><font color="#FFFFFF"> if you 
181         want to write for us or for any comments, suggestions, or feedback.</font></font></td>
182   </tr>
183 </table>
184 </body>
185 </html>
http://JogAmp.org git info: FAQ, tutorial and man pages.