DirectSound---3D环境
DirectSound对于单声道的Wav⽂件(或者说对于单声道的PCM⾳频数据)提供了内置3D⾳效的模拟,你能够控制每⼀个声源和收听者的⽴
体位置,对移动的物体应⽤多普勒效果等等。在单个应⽤程序中,可以有多个声源,但是只能有⼀个收听者。
1. 3D⾳效概念简介
1. 3D坐标: 坐标采⽤左⼿笛卡尔坐标系,x轴向右延伸,y轴向上延伸,z轴向前延伸。
2. 3D处理模式: DirectSound由三种3D环境处理模式:普通模式、禁⽤模式、头部相关模式。普通模式就是的3D模式,禁⽤模式不
完整
⾔⽽喻,头部相关模式是3D(因为该模式下所有的声源参数都是参考听者位置的,⽽不是参考原点)。
部分模式
3. 延迟⽣效: 因此每次应⽤3D配置,DirectSound都要进⾏⼤量的计算,可能会家中cpu的负担。因此,声源和听者都⽀持⼀种叫做延迟
设置的⽅式,多个以设置的参数需要调⽤提交函数才能应⽤到⾳频数据上,这样可以避免多次重复计算。
延迟设置
1.1 声源(Source)相关概念
最⼩距离: 在最⼩距离范围内,听到的声源⾳量⼤⼩保持不变;在最⼩距离范围外,听到的⾳量开始成⽐例衰减(例如最⼩距离是10
⽶,则听者站在距离声源20⽶处听到的声⾳是原始声⾳的1/2)。
最⼤距离: 在最⼤距离外的听者,不管再怎么朝外移动,听到的⾳量都不会再减⼩。
朝向: 朝向⽤来指定声源投射的⽅向,具体见下⼀点。
⾳量投射⾓度: 3D环境下的⾳量有⼀个锥形的投射⾓度(当设置朝向时),分内⾓和外⾓:内⾓的声⾳是正常的⾳量,外⾓的⾳量通
常是衰减的⾳量,在内⾓边界向外⾓边界过渡时⾳量逐级衰减。
移动速度: 移动速度在整个3D环境⾥主要是⽤廉政教育片 来计算多普勒效应(Doppler Effect)的。
1.2 听者(Listener)相关概念
朝向: 听者的朝向⾓度由两个3维向量构成,实际上这个朝向是⼀个平⾯。两个三维向量都以听者头部中⼼为原点,⼀个向顶部延
伸,⼀个向前延伸。
距离因⼦: 距离因⼦(Distance Factor)表⽰三维空间中的单位,与⽶成正⽐(例如距离因⼦为2,则⼀个三维点(1,0,0)表⽰现实中距
离原点x轴2⽶)。
多普勒因⼦: 表⽰产⽣的多普勒效应是真实效应的⼏倍。
滚降因⼦: 表⽰⾳量随距离的衰减程度。0表⽰不衰减,1表⽰衰减成程度与现实环境相同,等等。
2. 3D⽰例程序
2.1 获取和设置声源最⼤最⼩距离
IDirectSound3DBuffer8::GetMaxDistance(D3DVALUE * pflMaxDistance);
IDirectSound3DBuffer8::GetMinDistance(D3DVALUE * pflMinDistance);
IDirectSound3DBuffer8::SetMaxDistance(D3DVALUE flMaxDistance, DWORD dwApply);
IDirectSound3DBuffer8::SetMinDistance(D3DVALUE flMinDistance, DWORD dwApply);
dwApply参数⽤来指定是⽴即⽣效还是延迟⽣效(需要调⽤CommitDeferredSettings函数)。
2.2 获取和设置声源⾳量投射⾓度
因为投射⾓度中外⾓肯定要⽐内⾓⼤,为了保证这⼀点我们需要做些额外的判断处理:
void MainWindow::on_coneAnglesInside_valueChanged(int节约用水手抄报内容 value)
{
DWORD insideAngle, outsideAngle;
if (m_3DSource()->GetConeAngles(&insideAngle, &outsideAngle) != DS_OK)
throw std::exception("GetConeAngles error");
if (static_cast
ui->coneAnglesOutside->tValue(value),
outsideAngle = value;
if (m_3DSource()->SetConeAngles(value, outsideAngle, DS3D_IMMEDIATE) != DS_OK)
throw std::exception("SetConeAngles error");
ui->coneAnglesInsideLabel->tText(QString("coneAnglesInside(%1)").arg(value));
}
2.3 获取和设置声源朝向
这⾥也有⼀个特殊情况要处理:朝向的3个维度不能都为0,否则就是⼀个⽆效的⽅向:
#define SET_ONE_VECTOR_WITH_ZERO_CHECK_OF_SOURCE(getFunc, tFunc, sliderName, valueX, valueY, valueZ)
D3DVECTOR vector;
if (m_3DSource()->getFunc(&vector) != DS_OK)
throw std::exception(#getFunc " error");
后背右侧疼是怎么回事
if (!(valueX == 0.0 && valueY == 0.0 && valueZ == 0.0))
if (m_3DSo公司催款函 urce()->tFunc(valueX, valueY, valueZ, DS3D_IMMEDIATE) != DS_OK)
throw std::except鲁滨逊漂流记感受 ion(#tFunc " error");
家常焖面
ui->sliderName##两性知识 Label->tText(QString(#sliderName "(%1)").arg(value));
void MainWindow::on_coneOrientationX_valueChanged(int value)
{
就业补助 SET_降糖中药配方 ONE_VECTOR_WITH_ZERO_CHECK_OF_SOURCE(GetConeOrientation, SetConeOrientation, coneOrientationX,
value, vector.y, vector.z);
}
其他相关设置这⾥就不给出代码了,都⽐较简单,有需要的可以看。
3. 运⾏结果⽰意图
界⾯太⼤,我就分成3张图展⽰了:
完整代码见。
本文发布于:2023-04-28 06:32:31,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/518887.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |