我正在尝试根据摄像机和声音之间的观察方向来调节一些声音的音量。因此,如果你完全看着声源,音量是100%,如果你离开它,它是调低的。
设置链接到Panner Audio API的内置directionalCone不是我想要的。这定义了当播放器位于锥体内部时是否启用了音频,我希望根据视图方向工作。
我有一些工作在Aframe,通过做一个点之间的相机观察方向和方向之间的播放器和音频剪辑。然而,这(由于某些原因)是相当昂贵的,我想知道是否有一些内置的功能,我忽略了。
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是昂贵的,即使层次结构本身是简单的。
发布于 2020-04-24 00:21:21
由于某些原因,
,尤其是getWorldDirection是很昂贵的
Object3D.getWorldPosition()
和Object3D.getWorldDirection()
总是强制重新计算对象的世界矩阵。根据执行tick
的时间,这样做就足够了:
camFwd.setFromMatrixPosition( this.camera.object3D.matrixWorld );
dir.setFromMatrixPosition( this.el.object3D.matrixWorld );
代码只是从世界矩阵中提取位置,而不更新它。您可以对方向向量使用类似的方法,尽管代码有点复杂:
var e = this.camera.object3D.matrixWorld.elements;
camFwd.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();
https://stackoverflow.com/questions/61388988
复制相似问题