ThreeJS入门(091):THREE.PositionalAudio 知识详解,示例代码

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

在这里插入图片描述

查看本专栏目录 - 本文是第 091篇入门文章

文章目录

      • 构造函数
      • 参数说明
      • 属性
      • 方法
      • 示例
      • 使用 `THREE.PositionalAudio` 在 Three.js 中
        • 示例:创建一个带有三维音频的场景
      • 总结

THREE.PositionalAudio 是 Three.js 中用于实现三维空间中具有位置信息的音频源的一个类。通过 THREE.PositionalAudio,你可以为场景中的对象赋予声音,并根据这些对象的位置和听者的位置来调整声音的效果,如距离衰减、方向感等。这对于创建沉浸式的声音体验非常有用,尤其是在游戏和虚拟现实应用中。

构造函数

构造函数 new THREE.PositionalAudio(listener) 接受一个参数来定义一个具有位置信息的音频源。

参数说明

  • listener:一个 THREE.AudioListener 对象,用于绑定音频源,使之能够在三维环境中正确播放音频。

属性

THREE.PositionalAudio 的实例拥有如下属性:

  • refDistance:一个浮点数,表示参考距离,在这个距离内的声音不会受到距离衰减的影响。
  • coneInnerAngle:一个角度值,表示内锥角度,用于定义声音的最大传播方向。
  • coneOuterAngle:一个角度值,表示外锥角度,当声音传播方向超出这个角度时,声音会受到衰减。
  • coneOuterGain:一个介于 01 之间的浮点数,表示当声音传播方向超出外锥角度时的声音增益。
  • distanceModel:一个字符串,表示使用的距离模型,可选值有 'inverse', 'linear', 'exponential'
  • rolloffFactor:一个浮点数,表示声音衰减的速度。
  • panningModel:一个字符串,表示使用的立体声模型,可选值有 'equalpower', 'HRTF'

方法

THREE.PositionalAudio 提供了以下常用的方法来操作和控制音频源:

  • setBuffer(buffer):设置音频的缓冲区,使其能够播放指定的音频文件。
  • play():开始播放音频。
  • pause():暂停播放音频。
  • stop():停止播放音频。
  • setVolume(volume):设置音频的音量大小,范围通常在 [0, 1] 之间。
  • setRefDistance(distance):设置参考距离。
  • setRolloffFactor(factor):设置衰减因子。
  • setMaxDistance(distance):设置最大距离,在超过这个距离后,声音将不再衰减。
  • setConeOrientation(vector):设置声音传播的方向。
  • setConeInnerAngle(angle):设置内锥角度。
  • setConeOuterAngle(angle):设置外锥角度。
  • setConeOuterGain(gain):设置外锥增益。
  • setDistanceModel(model):设置距离模型。
  • setPanningModel(model):设置立体声模型。

示例

创建一个基本的 THREE.PositionalAudio 对象,并将其附加到一个 THREE.Object3D 上:

// 假设已经创建了 `THREE.AudioListener` 对象 `audioListener`
const positionalAudio = new THREE.PositionalAudio(audioListener);// 加载音频文件
const audioLoader = new THREE.AudioLoader();
audioLoader.load('path/to/audio.mp3', function (buffer) {positionalAudio.setBuffer(buffer);positionalAudio.setLoop(true); // 设置音频循环播放positionalAudio.setVolume(0.5); // 设置音量大小positionalAudio.play(); // 开始播放音频
});// 创建一个三维对象,并将音频源附加到该对象上
const object3D = new THREE.Object3D();
object3D.position.set(10, 0, 0); // 设置物体的位置
object3D.add(positionalAudio);
scene.add(object3D);

使用 THREE.PositionalAudio 在 Three.js 中

THREE.PositionalAudio 在 Three.js 中主要用于实现具有位置信息的音频源。通过结合 THREE.AudioListener,可以实现三维空间中的声音效果,如距离衰减、方向感等。

示例:创建一个带有三维音频的场景

假设你想在一个 Three.js 场景中播放音频,并根据物体的位置调整音频效果:

// 创建一个场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建一个音频监听器
const audioListener = new THREE.AudioListener();
camera.add(audioListener);// 创建一个具有位置信息的音频源
const positionalAudio = new THREE.PositionalAudio(audioListener);// 加载音频文件
const audioLoader = new THREE.AudioLoader();
audioLoader.load('path/to/audio.mp3', function (buffer) {positionalAudio.setBuffer(buffer);positionalAudio.setLoop(true); // 设置音频循环播放positionalAudio.setVolume(0.5); // 设置音量大小positionalAudio.play(); // 开始播放音频
});// 创建一个三维对象,并将音频源附加到该对象上
const object3D = new THREE.Object3D();
object3D.position.set(10, 0, 0); // 设置物体的位置
object3D.add(positionalAudio);
scene.add(object3D);// 定义动画函数
function animate() {requestAnimationFrame(animate);// 更新音频监听器的位置和方向audioListener.position.set(camera.position.x, camera.position.y, camera.position.z);audioListener.forward.set(camera.getWorldDirection(new THREE.Vector3()).x, camera.getWorldDirection(new THREE.Vector3()).y, camera.getWorldDirection(new THREE.Vector3()).z);// 更新物体的位置(例如,模拟物体的移动)object3D.position.y += 0.01;// 渲染场景renderer.render(scene, camera);
}animate();

这段代码展示了如何使用 THREE.PositionalAudio 创建一个带有三维音频的三维场景,并根据物体的位置调整音频效果。

总结

THREE.PositionalAudio 是一个用于实现三维空间中具有位置信息的音频源的类,提供了丰富的操作和控制音频源的方法。通过这些方法,你可以设置音频的缓冲、音量、距离衰减等,并结合 THREE.AudioListener 实现三维空间中的声音效果。在 Three.js 的许多功能中,THREE.PositionalAudio 对于实现真实的三维音频体验非常重要。理解并熟练使用 THREE.PositionalAudio 对于开发高质量的 Three.js 应用程序是非常有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556648.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

边缘人工智能(Edge Intelligence)

边缘人工智能(Edge AI)是指在边缘设备上直接运行人工智能(AI)和机器学习(ML)算法的技术。机器学习是一个广泛的领域,近年来取得了巨大的进步。它所基于的原则是,计算机可以通过从数据…

免杀对抗—javaASMMSF源码特征修改汇编调用CS内联C

前言 今天讲最后的两个语言java和汇编,那么基本所有语言就讲了一个遍了。java在后门免杀这一块呢其实是有点鸡肋的,其它语言编译成的是exe,而java编译成的是jar包,而jar包又得有java环境才能运行,不像exe是个电脑都行…

数据分析案例-机器学习工程师薪资数据可视化分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

揭秘AI写作工具:如何改变内容创作新格局

小伙伴们,今儿咱们来聊聊那些个让人眼前一亮、脑洞大开的AI写作神器——笔灵AI写作、宙语AI写作、博思白板AI写作,还有讯飞星火,它们啊,简直就是文案人儿的超级辅助,让咱们写东西的时候,灵感嗖嗖地往外冒&a…

利士策分享,彩礼能否临时增加?

利士策分享,彩礼能否临时增加? 在中国的传统婚俗中,彩礼作为男方家庭向女方家庭表达诚意与尊重的一种方式,承载着丰富的文化内涵。 然而,在现代社会,彩礼的多少、是否临时增加等问题,却常常成为…

LLM大模型企业应用实战-“消灭”LLM幻觉的利器

大模型一定程度改变了我们生活工作的思考方式,越来越多的个人和企业在思考如何将大模型应用到更加实际的生产生活。 1 LLM的问题 1.1 幻觉 LLM因为是一个预训练模型,它已有一些知识储备,我们提的问题跟他的知识储备不相符时,会…

小目标检测利器:YOLOv8+SAHI使用教程

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

MySQL连接查询:自连接

先看我的表结构 emp表 自连接也就是把一个表看作是两个作用的表就好,也就是说我把emp看作员工表,也看做领导表 自连接 基本语法 select 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;例子1:查询员工 及其 所属领导的名字 select a.n…

《从零开始大模型开发与微调》真的把大模型说透了!零基础入门一定要看!

2022年底,ChatGPT震撼上线,大语言模型技术迅速“席卷”了整个社会,人工智能技术因此迎来了一次重要进展。与大语言模型相关的研发岗薪资更是水涨船高,基本都是5w月薪起。很多程序员也想跟上ChatGPT脚步,今天给大家带来…

【C++指南】类和对象(二):类的默认成员函数——全面剖析 :构造函数

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 ​ 阅读本篇文章之前,你需要具备的前置知识:类和对象的基础 点击下方链接 【C指南…

顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录 1 资料2 我的总结3 复现源码首先你需要有gpt的api接口安装:数据集执行指令源码 4 结果 1 资料 我复现的源码:https://github.com/Whiffe/test_set_contamination 官网源码:https://github.com/tatsu-lab/test_set_contamination 论文&#x…

Java实体对象转换利器MapStruct详解

概述 现在的JAVA项目多数采用分层结构,参考《阿里巴巴JAVA开发手册》。 分层之后,每一层都有自己的领域模型,即不同类型的 Bean:  DO ( Data Object ) :与数据库表结构一一对应,…

游戏盾是如何解决游戏行业攻击问题

随着游戏行业的迅猛发展,其高额的利润和激烈的市场竞争吸引了众多企业和创业者的目光。然而,这一行业也面临着前所未有的业务和安全挑战,尤其是DDoS(分布式拒绝服务)攻击,已经成为游戏行业的一大威胁。今天…

C语言基础(10)之指针(2)

在上一篇文章中我们谈到了指针,并给老铁们讲解了什么是指针、指针类型、野指针以及指针运算等知识。在这篇文章中小编将继续带大家了解指针的相关知识点。 1. 指针和数组 指针和数组之间又能有什么联系呢?在谈这个之前,我们先来讲讲指针和数…

Android15车载音频之Virtualbox中QACT实时调试(八十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

微信小程序开发-调试及配置文件介绍

一,隐藏控制台系统日志 在小程序开发中,如果你想要隐藏控制台中的系统日志,可以通过以下步骤进行操作: 打开小程序的开发工具。在开发工具的控制台(Console)中,找到你想要隐藏的系统日志。右键点击该系统日志条目。在…

MySQL连接查询:外连接

先看我的表结构 dept表 emp表 外连接分为 1.左外连接 2.右外连接 1.左外连接 基本语法 select 字段列表 FORM 表1 LEFT [OUTER] JOIN 表2 ON 条件;例子:查询emp表的所有数据,和对应部门的员工信息(左外连接) select e.*, d.n…

利士策分享,旅游是否要舟车劳顿才能尽兴?

利士策分享,旅游是否要舟车劳顿才能尽兴? 国庆假期,当夜幕降临,城市灯火阑珊,一场关于美食与等待的较量悄然上演。 李女士在北京天坛公园附近餐厅的等位经历——前方1053桌的壮观景象,不仅让人咋舌&#xf…

信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map、find函数、substr函数

PDF文档回复:20241007 1 P7911 [CSP-J 2021] 网络连接 [题目描述] TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。 在本问题中,计算机分为两大类:服务机&#x…

3. BBP系列运动控制板(飞控板)简介

3.1. 概述 Bread Board Pilot(简称BBP) 是在积累了前期 Single Pilot 及 PH7 飞控板大量设计及使用经验的基础上,全新基于PH47代码框架开发的高灵活性, 高性能, 超低成本的最新一代飞控板设计。 目前,因为其使用便捷灵活&#xf…