ThreeJs的音频和位置音频

简介: 这篇文章详细介绍了在Three.js中如何使用Audio和PositionalAudio来实现普通音频和位置相关的音频效果,包括音频加载、音量控制以及如何根据位置变化调整音频的播放。

Threejs的场景有时候需要引入声音,比如下雨声音,撞击声音等,这需要用到Threejs的两个类Audio和PositionalAudio,第一个Audio是普通的声音,比如下雨,在整个场景中听到的都是下雨的声音,而且每个位置的声音都一样大小,那么就需要用Audio,也可以作为3D场景的背景音乐来用,但是如果是某个位置发生了撞击,那么应该是距离越远,听到撞击的声音越小,也就是要把声源的位置固定,把耳朵绑定到相机上,相机距离声源越远听到的声音越小,相机距离声源越近听到的声音越大,此外,如果撞击声音在左侧,那么应该左侧耳机声音更大,如果撞击发生在右侧,正好想反,下面看下整个过程:

首先创建场景:

initScene(){
      scene = new THREE.Scene();
    },
    initCamera(){
      this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera.position.set(10,10,10);
      this.camera.lookAt(0,0,0)
    },
    initLight(){
      //添加两个平行光
      const directionalLight1 = new THREE.DirectionalLight(0xffffff, 1.5);
      directionalLight1.position.set(300,300,600)
      scene.add(directionalLight1);
      const directionalLight2 = new THREE.DirectionalLight(0xffffff, 1.5);
      directionalLight2.position.set(600,200,600)
      scene.add(directionalLight2);
    },
initRenderer(){
      this.renderer = new THREE.WebGLRenderer({ antialias: true });
      this.container = document.getElementById("container")
      this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
      this.renderer.setClearColor('#AAAAAA', 1.0);
      this.container.appendChild(this.renderer.domElement);
    },
    initControl(){
      this.controls = new OrbitControls(this.camera, this.renderer.domElement);
      this.controls.enableDamping = true;
      this.controls.maxPolarAngle = Math.PI / 2.2;      // // 最大角度
    },
    initAnimate() {
      requestAnimationFrame(this.initAnimate);
      this.renderer.render(scene, this.camera);
    },

然后创建监听和声音,先创建一个监听:AudioListener,再创建一个Audio加载器用来加载声音,

AudioLoader,然后播放声音就可以了,

initAudio(){
      // 创建一个监听者
      let listener = new THREE.AudioListener();
      // 创建一个非位置音频对象  用来控制播放
      let audio = new THREE.Audio(listener);
      // 创建一个音频加载器对象
      let audioLoader = new THREE.AudioLoader();
      // 加载音频文件,返回一个音频缓冲区对象作为回调函数参数
      audioLoader.load('/static/video/music.mp3', function(AudioBuffer) {
        // 音频缓冲区对象关联到音频对象audio
        audio.setBuffer(AudioBuffer);
        audio.setLoop(true); //是否循环
        audio.setVolume(0.5); //音量
        // 播放缓冲区中的音频数据
        audio.play();
      });
    },

这里也可以用一个简单的用html隐藏一个audio标签实现,并用js控制,因为这里不会对音乐做特殊的处理,这里就不演示效果了。

再来试下位置音频,同样是加载一个监听和一个声音,但是这里为了了解音频的位置,所以先创建一个模型,将音频绑定到模型上,后面就可以通过改变相机的位置,体验下不同距离和位置对听到的声音的影响。

initAudio(){
      let geometry = new THREE.BoxGeometry(2,2,2);
      let material = new THREE.MeshPhysicalMaterial({color:'#1c32b5'});
      let audioMesh = new THREE.Mesh(geometry, material);
      // 设置网格模型的位置,相当于设置音源的位置
      audioMesh.position.set(0, 0, 0);
      scene.add(audioMesh);
      // 创建一个虚拟的监听者
      let listener = new THREE.AudioListener();
      // 监听者绑定到相机对象
      this.camera.add(listener);
      // 创建一个位置音频对象,监听者作为参数,音频和监听者关联。
      let PosAudio = new THREE.PositionalAudio(listener);
      //音源绑定到一个网格模型上
      audioMesh.add(PosAudio);
      // 创建一个音频加载器
      let audioLoader = new THREE.AudioLoader();
      // 加载音频文件,返回一个音频缓冲区对象作为回调函数参数
      audioLoader.load('/static/video/music.mp3', function(AudioBuffer) {
        // console.log(buffer);
        // 音频缓冲区对象关联到音频对象audio
        PosAudio.setBuffer(AudioBuffer);
        PosAudio.setVolume(0.9); //音量
        PosAudio.setRefDistance(200); //参数值越大,声音越大
        PosAudio.play(); //播放
      });
    },

效果如下:
WechatIMG116.jpg
threejs场景下的音频和位置音频

这里不支持上传视频,我就只能上传个图片了,如果想看动态效果可以私我,我发给你视频

相关文章
|
缓存
SpringCloud Gateway 网关的请求体body的读取和修改
SpringCloud Gateway 框架中,为了处理请求体body,实现多次读取与修改,创建了一个名为`RequestParamGlobalFilter`的全局过滤器。这个过滤器使用`@Component`和`@Slf4j`注解,实现了`GlobalFilter`和`Ordered`接口,设置最高优先级以首先读取body。它通过缓存请求体并创建装饰过的`ServerHttpRequest`来实现body的动态获取。
2073 4
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
435 2
ThreeJs场景中添加视频
Threejs实现闪电效果
这篇文章讲解了如何利用Three.js实现闪电效果,包括设置粒子系统、调整材质属性以及控制闪电路径的方法。
226 1
Threejs实现闪电效果
|
编解码 vr&ar 图形学
|
编解码 缓存 算法
Three.js如何降低3D模型的大小以便更快加载
为加快600MB的3D模型在Three.js中的加载速度,可采用多种压缩方法:1) 减少顶点数,使用简化工具或LOD技术;2) 压缩纹理,降低分辨率或转为KTX2等格式;3) 采用高效文件格式如glTF 2.0及draco压缩;4) 合并材质减少数量;5) 利用Three.js内置优化如BufferGeometry;6) 按需分批加载模型;7) Web Workers后台处理;8) 多模型合并减少绘制;9) 使用Texture Atlas及专业优化工具。示例代码展示了使用GLTFLoader加载优化后的模型。
1752 12
|
JavaScript 前端开发 开发者
ThreeJs控制模型骨骼实现数字人
这篇文章讲解了如何使用Three.js通过控制模型的骨骼来实现数字人的动态表现,包括加载模型、获取骨骼信息以及通过编程控制骨骼动作的具体方法。
1375 1
|
11月前
|
人工智能 自然语言处理 前端开发
Lobe Vidol:AI数字人交互平台,可与虚拟人和3D模型聊天互动
Lobe Vidol是一款开源的AI数字人交互平台,允许用户创建和互动自己的虚拟偶像。该平台提供流畅的对话体验、丰富的动作姿势库、优雅的用户界面设计以及多种技术支持,如文本到语音和语音到文本技术。Lobe Vidol适用于娱乐互动、在线教育、客户服务、品牌营销和社交媒体等多个应用场景。
699 7
Lobe Vidol:AI数字人交互平台,可与虚拟人和3D模型聊天互动
|
编解码 vr&ar 图形学
超时空穿越!揭秘如何在VR头显端实现毫秒级低延迟的RTSP|RTMP播放,打造沉浸式直播新纪元!
本文详细介绍了如何在VR头显端实现低延迟的RTSP或RTMP播放。首先,确保开发环境已安装Unity编辑器及相关插件。接着,通过初始化客户端、解码视频数据并渲染到VR头显屏幕,实现流畅的视频播放。最后,提供了优化低延迟的方法,包括硬件加速、减少缓冲区大小和选择合适的编解码器。示例代码展示了具体实现步骤。
353 1
|
敏捷开发 运维 Prometheus
构建高效运维体系:从基础架构到自动化管理
本文探讨了如何通过优化基础架构、引入自动化工具和流程,以及加强团队协作,构建高效的运维体系。通过案例分析和实践建议,帮助运维人员实现系统的稳定性、可靠性和可维护性。
318 22