DirectSound---3D环境

更新时间:2023-04-28 06:32:31 阅读: 评论:0


2023年4月28日发(作者:快乐大本营主持人)

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)表⽰现实中距

离原点x2⽶)。

多普勒因⼦: 表⽰产⽣的多普勒效应是真实效应的⼏倍。

滚降因⼦: 表⽰⾳量随距离的衰减程度。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(value) > outsideAngle)

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小时内删除。

标签:3dsource
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图