diff --git a/docs/22-audio.md b/docs/22-audio.md index 1412a10..a2e519a 100644 --- a/docs/22-audio.md +++ b/docs/22-audio.md @@ -12,7 +12,7 @@ LWJGL支持OpenGL,不需要任何额外的下载,它就已经可以使用了 下一个元素是声源,它表示发出声音的三维空间中的位置(一个点)。声源与缓冲区关联(一次只能有一个),可以通过以下属性定义: -* 位置,声源的位置($$x$$,$$y$$和$$z$$坐标)。顺便一提,OpenAL和OpenGL一样使用右手笛卡尔坐标系,所以你可以假设(为了简化)你的世界坐标等于声音空间坐标系中的坐标。 +* 位置,声源的位置($x$,$y$和$z$坐标)。顺便一提,OpenAL和OpenGL一样使用右手笛卡尔坐标系,所以你可以假设(为了简化)你的世界坐标等于声音空间坐标系中的坐标。 * 速度,它指定声源移动的速度。这是用来模拟多普勒效应的。 * 增益,用来改变声音的大小(就像是一个放大因数)。 @@ -134,7 +134,7 @@ public class SoundSource { 第一个参数`loop`,表示要播放的声音是否应该处于循环模式。默认情况下,当通过声源调用播放操作时,当声音播放到最后时将停止。这对于一些声音来说是可以的,但是对于其他一些声音,比如背景音乐,就需要反复播放。当声音停止时不需要手动控制并重新播放声音,我们就只用将循环属性设置为`true`:`alSourcei(sourceId, AL_LOOPING, AL_TRUE);`。 -另一个参数`relative`,控制声源的位置是否相对于侦听器。在本例中,当为声源设置位置时,我们基本上是在定义到侦听器的距离(使用想想),而不是OpenAL三维场景中的坐标,也不是世界坐标。这是通过调用`alSourcei(sourceId, AL_SOURCE_RELATIVE, AL_TRUE);”`启用的。但是,我们能用它做什么呢?这个属性很有趣,例如,用于不应该受到侦听器距离影响(减弱)的背景声音。例如,在背景音乐或与播放器控件相关的音效。如果我们将这些声源设置为相对的,并将它们的位置设置为$$(0, 0, 0)$$,它们将不会被减弱。 +另一个参数`relative`,控制声源的位置是否相对于侦听器。在本例中,当为声源设置位置时,我们基本上是在定义到侦听器的距离(使用想想),而不是OpenAL三维场景中的坐标,也不是世界坐标。这是通过调用`alSourcei(sourceId, AL_SOURCE_RELATIVE, AL_TRUE);”`启用的。但是,我们能用它做什么呢?这个属性很有趣,例如,用于不应该受到侦听器距离影响(减弱)的背景声音。例如,在背景音乐或与播放器控件相关的音效。如果我们将这些声源设置为相对的,并将它们的位置设置为$(0, 0, 0)$,它们将不会被减弱。 现在轮到侦听器了,它是由一个名为`SoundListener`定义的。以下是该类的定义: @@ -181,7 +181,7 @@ public class SoundListener { ![侦听器的at和up向量](_static/22/listener_at_up.png) -`at`向量基本上指向侦听器所朝向的位置,默认情况下它的值为$$(0, 0, -1)$$。`up`向量确定侦听器向上的方向,默认情况下它指向$$(0, 1, 0)$$。这两个向量的三个分量都是在`alListenerfv`方法调用中设置的。此方法用于将一组浮点数(浮点数变量)传递到属性(在本例中为方向)。 +`at`向量基本上指向侦听器所朝向的位置,默认情况下它的值为$(0, 0, -1)$。`up`向量确定侦听器向上的方向,默认情况下它指向$(0, 1, 0)$。这两个向量的三个分量都是在`alListenerfv`方法调用中设置的。此方法用于将一组浮点数(浮点数变量)传递到属性(在本例中为方向)。 在继续讲解之前,有必要强调一些与声音和侦听器速度相关的概念。声源与侦听器之间的相对速度会导致OpenAL模拟多普勒效应。如果你不知道多普勒效应是什么,多普勒效应将导致一个离你越来越近的物体发出的频率似乎比它离开时发出的频率要高的效应。问题是,仅仅通过设置声音和侦听器速度,OpenAL不会为你更新它们的位置。它将使用相对速度来计算多普勒效应,但位置不会改变。因此,如果你想要模拟一个移动的声源或者侦听器,你必须注意在游戏循环中更新它们的位置。 @@ -233,7 +233,7 @@ public class SoundManager { * 为该设备创建功能。 * 创建一个声音环境,就像是OpenGL那样,并将其设置为当前环境。 -`SoundManager`类还具有更新给定摄像机位置的侦听器朝向的方法。在本例中,侦听器将被设置在摄像机所在的位置。那么,给定摄像机的位置和旋转信息,我们如何计算`at`和`up`向量呢?答案是使用与摄像机相关联的观察矩阵。我们需要将`at`$$(0, 0, -1)$$与`up`$$(0, 1, 0)$$向量转换为考虑摄像机旋转的向量。让`cameraMatrix`为与摄像机关联的观察矩阵。实现的代码如下: +`SoundManager`类还具有更新给定摄像机位置的侦听器朝向的方法。在本例中,侦听器将被设置在摄像机所在的位置。那么,给定摄像机的位置和旋转信息,我们如何计算`at`和`up`向量呢?答案是使用与摄像机相关联的观察矩阵。我们需要将`at`$(0, 0, -1)$与`up`$(0, 1, 0)$向量转换为考虑摄像机旋转的向量。让`cameraMatrix`为与摄像机关联的观察矩阵。实现的代码如下: ```java Matrix4f invCam = new Matrix4f(cameraMatrix).invert();