首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于视点方向的Web音频空间化

基于视点方向的Web音频空间化
EN

Stack Overflow用户
提问于 2020-04-23 21:55:52
回答 1查看 67关注 0票数 0

我正在尝试根据摄像机和声音之间的观察方向来调节一些声音的音量。因此,如果你完全看着声源,音量是100%,如果你离开它,它是调低的。

设置链接到Panner Audio API的内置directionalCone不是我想要的。这定义了当播放器位于锥体内部时是否启用了音频,我希望根据视图方向工作。

我有一些工作在Aframe,通过做一个点之间的相机观察方向和方向之间的播放器和音频剪辑。然而,这(由于某些原因)是相当昂贵的,我想知道是否有一些内置的功能,我忽略了。

代码语言:javascript
运行
复制
tick: function() {
        if(!this.sound.isPlaying) return; //todo: this is true even outside the spatial distance!

        var camFwd = this.camFwd;
        this.camera.object3D.getWorldPosition(camFwd);

        var dir = this.dir;     
        this.el.object3D.getWorldPosition(dir);

        dir.subVectors(
            camFwd, //camera pos
            dir     //element pos
            ).normalize();

        this.camera.object3D.getWorldDirection(camFwd);

        var dot = THREE.Math.clamp(camFwd.dot(dir), 0, 1);

//float dot = Mathf.dot(transform.forward, (camTrans.position-transform.position).normalized);

        this.setVolume(THREE.Math.lerp(
            this.data.minVolume, 
            this.data.maxVolume, 
            dot));
    }, 

这提供了预期的效果,但它在性能分析器中显示为相当昂贵。特别是,由于某些原因,getWorldDirection是昂贵的,即使层次结构本身是简单的。

EN

回答 1

Stack Overflow用户

发布于 2020-04-24 00:21:21

由于某些原因,

,尤其是getWorldDirection是很昂贵的

Object3D.getWorldPosition()Object3D.getWorldDirection()总是强制重新计算对象的世界矩阵。根据执行tick的时间,这样做就足够了:

代码语言:javascript
运行
复制
camFwd.setFromMatrixPosition( this.camera.object3D.matrixWorld );
dir.setFromMatrixPosition( this.el.object3D.matrixWorld );

代码只是从世界矩阵中提取位置,而不更新它。您可以对方向向量使用类似的方法,尽管代码有点复杂:

代码语言:javascript
运行
复制
var e = this.camera.object3D.matrixWorld.elements;
camFwd.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61388988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档