Extensible 3D (X3D)
Part 1: Architecture and base components

16 Sound component

声音组件

--- X3D separator bar ---

cube 16.1 介绍

16.1.1 名称

这部分组件的名称是 "Sound""。当在 COMPONENT 语句中引用这个组件时需要使用这个名称(参见 7.2.3.4 Component 语句)。

16.1.2 概述

本条款描述了 ISO/IEC 19775 标准这部分中的 Sound component(声音组件)。其中包括如何在 X3D 场景中存取并发射声音。 表 16.1 列出了这一条款的主要主题。

表 16.1 — 主题

cube 16.2 概念

16.2.1 声音优先权

如果浏览器没有足够的资源播放当前所有激活的声音,则推荐浏览器按指定的以下排序线索对激活的声音排序:

  1. 按 priority 降序;
  2. 对于 priority > 0.5 的声音,按 now - startTime 的值升序;
  3. 按在观测者位置的强度值(此处 intensity 为 intensity × "强度衰减系数")降序;

这里 priority 为 Sound 节点中的 priority 域时,now 表示了当前的时间,startTime 为 source 域中指定的音频源节点中的 startTime 域,"强度衰减系数" 引用了一个强度因子,这个强度因子来自内外椭球之间的线性分贝衰减斜坡。

对于使用高优先权的声音(事件和提示音),第 2 条排序线索是重要的,这时即使当前激活的高优先权的声音“占满”了浏览器的资源,仍然可以听见新的提示音。对于一般优先权的声音将不使用第 2 条排序线索,在这些声音中的选择将基于第 3 条排序线索(在观测者处的强度)。

浏览器应利用可用的资源并尽量挖掘渲染潜伏期之间的资源,从此排序列表中的第一项开始尽可能多地播放声音。在大多数系统中,可供播放 MIDI 流的资源和可供播放采样声音的资源是不同的,因此把处理 MIDI 数据的列表分开维护可能受益。

16.2.2 声音衰减和空间化

为了建立观测者从声音内椭球到外椭球之间移动时的响度上的线性衰减,衰减必须基于线性分贝衰减斜坡。为了使不同浏览器上的衰减一致,分贝衰减斜坡在最小椭球处为 0 dB,在外椭球处为 -20 dB。外椭球比最小椭球大 10 倍的 Sound 节点将表现为平方倒数的衰减,这接近于一个声音在无回声的环境中的效果。

如果 spatialize 域设置为 TRUE,且底层声音库支持,则浏览器可以支持空间化的声音定位。浏览器最少也需支持非 MIDI 声音的立体声定位平移,平移的量将基于观测者和音源之间的角度。把 Sound 的位置域 location (在全局空间中)投射到观测者的 XZ 平面可以得到此角度。参照 附图 16.1,从观测者到变换后的 location 的矢量决定了一个角度,并以此角度赋予了一个在 [0.0, 1.0] 范围内平移值。当给定一个平移值 pan 时,左声道和右声道的电平可以按以下方程计算:

    leftPanFactor  = 1 - pan2
    rightPanFactor = 1 - (1 - pan)2
Stereo Panning

附图 16.1 — 立体声平移

使用此技术时,现按 intensity 值修改声音的响度,然后按距离衰减声音得到一个未定位的音频输出。然后把未定位的音频输出的值用 leftPanFactor 和 rightPanFactor 换算以决定最后的左右输出信号。鼓励使用更成熟的定位技术,但并不做要求(见 [SNDB])。

16.3 抽象节点

16.3.1 X3DSoundNode

X3DSoundNode : X3DChildNode { 
  SFNode [in,out] metadata NULL [X3DMetadataObject]
}

这个抽象类型是所有 Sound 节点的基本类型。

16.3.2 X3DSoundSourceNode

X3DSoundSourceNode : X3DTimeDependentNode { 
  SFString [in,out] description      ""
  SFBool   [in,out] loop             FALSE
  SFNode   [in,out] metadata         NULL [X3DMetadataObject]
  SFTime   [in,out] pauseTime        0    (-∞,∞)
  SFFloat  [in,out] pitch            1.0  (0,∞)
  SFTime   [in,out] resumeTime       0    (-∞,∞)
  SFTime   [in,out] startTime        0    (-∞,∞)
  SFTime   [in,out] stopTime         0    (-∞,∞)
  SFTime   [out]    duration_changed
  SFTime   [out]    elapsedTime
  SFBool   [out]    isActive
  SFBool   [out]    isPaused
}

这个抽象节点类型用以衍生可放出音频数据的节点类型。

16.4 节点参考

16.4.1 AudioClip

AudioClip : X3DSoundSourceNode, X3DUrlObject {
  SFString [in,out] description      ""
  SFBool   [in,out] loop             FALSE
  SFNode   [in,out] metadata         NULL  [X3DMetadataObject]
  SFTime   [in,out] pauseTime        0     (-∞,∞)
  SFFloat  [in,out] pitch            1.0   (0,∞)
  SFTime   [in,out] resumeTime       0     (-∞,∞)
  SFTime   [in,out] startTime        0     (-∞,∞)
  SFTime   [in,out] stopTime         0     (-∞,∞)
  MFString [in,out] url              []    [urn]
  SFTime   [out]    duration_changed
  SFTime   [out]    elapsedTime
  SFBool   [out]    isActive
  SFBool   [out]    isPaused
}

AudioClip 节点指定了可由 Sound 节点引用的音频数据。

description 域为音频源指定了文本化的描述。浏览器显示 description 域不是必需的,但可以在播放声音的时候选择同时显示附加的文本。

url 域指定了声音由何处载入的 URL。浏览器应支持至少一种未压缩 PCM 格式的 wavefile 格式(见 [WAV])。推荐浏览器也支持 type 1 类型的 MIDI 格式(见 2.[MIDI])和 MP3 压缩格式(见 2.[I11172-1])。MIDI 文件假定使用 General MIDI 音色库。url 域的描述见 9.2.1 URLs。

inputOutput 域 loop、pauseTime、resumeTime、startTime、stopTime 和 outputOnly 域 elapsedTime、isActive、isPaused,以及其作用于 AudioClip 节点的效果在 8 时间组件 Time component 中详细描述。AudioClip  的 "cycle" (周期)是以指定的 pitch(音调)播放音频一次的秒数。

pitch 域指定了采样声音的播放速率的倍数。pitch 域的值应大于 0。改变 pitch 域即影响声音播放的音调,也影响播放的速度。发送向激活的 AudioClip 节点的 set_pitch 事件将被忽略也不产生 pitch_changed 域事件。如果 pitch 设置为 2.0,和正常播放相比,声音应以一个高八度音阶的音调以两倍快的速度播放。对于采样声音,pitch 域改变了声音播放的采样率。用于控制 MIDI(或其它声音序列器的剪辑)的音调的适当执行模式,可以通过 pitch 值调节播放的节拍,并可以通过 MIDI Coarse Tune(粗调)和 Fine Tune(微调)控制对音调进行适当的调节。

当 duration_changed 域有新值时发送 duration_changed 事件以说明此剪辑以正常速度播放时的持续时间(duration)。一般此事件只在当前 url 改变并载入了声音数据时产生,以指示剪辑在播放一个不同的声音源。持续时间是pitch 设置为 1.0 时播放一个音频的循环周期,并计为以秒为单位的时间长度。改变 pitch 值将不会触发 duration_changed 事件。持续时间值 "−1" 表示声音数据还没有被载入或因为某些原因此值不可用。当 X3D 文件读取中 AudioClip 节点被载入时,或 AudioClip 被添加到场景图里的时候,应发送 duration_changed 事件。

其它的节点可以用 isActive 域判断此剪辑是当前否被激活。如果 AudioClip 为激活的,则声音的播放到的时间应是(声音节点的时间系中采样 0 对应时间 0):

    t = (now − startTime) modulo (duration / pitch)

16.4.2 Sound

Sound : X3DSoundNode {
  SFVec3f [in,out] direction  0 0 1 (-∞,∞)
  SFFloat [in,out] intensity  1     [0,1]
  SFVec3f [in,out] location   0 0 0 (-∞,∞)
  SFFloat [in,out] maxBack    10    [0,∞)
  SFFloat [in,out] maxFront   10    [0,∞)
  SFNode  [in,out] metadata   NULL  [X3DMetadataObject]
  SFFloat [in,out] minBack    1     [0,∞)
  SFFloat [in,out] minFront   1     [0,∞)
  SFFloat [in,out] priority   0     [0,1]
  SFNode  [in,out] source     NULL  [X3DSoundSourceNode]
  SFBool  []       spatialize TRUE
}

Sound 节点指定了一个 X3D 场景中声音的空间化地呈现。声音定位于一个局部坐标系中的点上,并按一个椭圆特性曲线 (由内外两个椭圆定义)向周围发出声音。椭球的方向由 direction 域指定。椭球的形状可以被修改以改变声音方向性聚焦的远近。

source(源)域指定了 Sound 节点的声音源。如果 source 域没有指定,Sound 节点将不发出声音。source 域应指定为一个 AudioClip 节点或一个 MovieTexture 节点。如果一个 MovieTexture 节点被指定为声音源,MovieTexture 中应应用一个包含声音的影片格式(范例  MPEG-1 系统,见 2.[I11172-1])。

intensity(强度)域调节 Sound 节点发出声音的响度(分贝)(注意这不同于传统的声音的强度定义;见 [SNDA])。intensity 域的值范围在 0.0 到 1.0 间,指定了一个在回放时用于调整过滤后的声音源的采样数据的比例因子。强度值为 1.0 的 Sound 节点应以最大的响度(在衰减之前)发出音频,强度值为 0.0 的 Sound 节点应不发出音频。在这两个值之间,响度从接近 0.0 值 intensity 处的 -20 dB 开始线形地增加,直到 intensity 值 1.0 处变为 0 dB。

由于系统资源的限制或载入的系统,当前激活的 Sound 节点可能多于一次可以同时播放的声音,这时 priority(优先权)域 提示浏览器选择播放哪些声音。16.2 概念 描述了一个在此情况下将选择哪些声音播放的法则。priority 域的范围为 0.0 到 1.0,1.0 为最高的优先权,0.0 为最低的优先权。

location(定位)域决定了在局部坐标系中声音发出的位置。只有 Sound 节点属于遍历过的场景的一部分时,其输出才能被听见。从被禁止游历的(例如不绘制的) LOD、Switch、组节点、原形节点继承的下级的 Sound 节点将不能被听见。当 Sound 因 Switch 或 LOD 节点被禁止,而后 Switch 或 LOD 节点再次变为可游历的一部分时,声音应从该恢复的位置开始继续播放。

Sound 节点有一个定义了空间容积的内椭球,在其中听见的声音为最大的音量。在这个椭球中,过滤后的采样数据由 intensity 域缩放并且没有衰减。通过延伸 direction(方向)矢量使之穿过 location 以定义内椭球。minBack 和 minFront 域指定了沿 direction 矢量的到 location 的前后距离。此内椭球含一个相对 location 的焦距(第二个焦距是隐含的)并和 direction 矢量在 minBack 和 minFront 位置上相交。

Sound  节点有一个定义了空间容积的外椭球,以限制声音可听见性。在外椭球之外将不能听见任何声音。通过延伸 direction(方向)矢量使之穿过 location 以定义外椭球。maxBack 和 maxFront 域指定了沿 direction 矢量的到 location 的前后距离。此内椭球含一个相对 location 的焦距(第二个焦距是隐含的)并和 direction 矢量在 maxBack 和 maxFront 位置上相交。

minFront、maxFront、minBack、maxBack 域在局部坐标中定义,其值应大于或等于 0。minBack 应小于或等于 maxBack,minFront 应小于或等于 maxFront。椭球参数在局部坐标系中指定,但椭球体的几何体受其祖先变换的影响。

在两个椭球体之间是一个响度的线形衰减斜坡,其中最小椭圆处为 0 dB,最大椭圆处 -20 dB:

    attenuation (衰减) = -20 × (d' / d")

其中 d' 为声音定位到观测者矢量方向上,变换后的最小椭球边界到观测者之间的距离,d" 为声音定位到观测者矢量方向上,变换后的最小椭球边界和最大椭球边界之间的距离(见 附图 16.2)。

Sound Node Geometry

附图 16.2 — Sound 节点几何体

spatialize(空间化)域指定了观测者是否可以感知到声音的相对方位。如果 spatialize 域为 TRUE 且观测者位于变换后的内椭圆和外椭圆之间,则观测者相对 Sound 节点的方向和位置应在回放时参与计算。空间化功能的最小需要的描述见 16.2.2 声音衰减和空间化。如果 spatialize 域为 FALSE,定位效果将被忽略,当椭球的尺寸和 intensity 仍将影响声音的响度。如果声音为多通道的(范例 立体声),音源在回放时应保持通道的分离。

cube 16.5 支持级别

Sound component 组件提供 表 16.2 中规定的一个支持级别(levels)。

表 16.2 — Sound 组件支持级别

级别
Level
必备条件 节点/特性 支持

1

Core 1
Time 1
Rendering 1
Shape 1

AudioClipNodeType(抽象) n/a
SoundNodeType(抽象) n/a
AudioClip 所有域完全支持
Sound 所有域完全支持

--- X3D separator bar ---

Site Meter