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

news2024/11/23 10:50:27

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内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.coloradmin.cn/o/2194581.html

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

相关文章

二叉树—相关结构

1.相关的结构问题(分治递归) 1.1节点个数 1.2叶子结点个数 叶子结点:没有孩子的节点 1.3树的高度(深度) 1.4二叉树第k层的节点个数 1.5二叉树查找值为x的节点 2.二叉树的创建和销毁 2.1二叉树的构建 二叉树遍历_牛客…

mysql语句执行过程

具体流程如下: 1】当客户端的SOL发送到MySQL时,首先是到达服务器层的连接器,连接器会对你此次发起的连接进行权限校验,以此来获取你这个账号拥有的权限。当你的账号或密码不正确时,会报用户错误。连接成功如果后续没有任何操作&am…

xlwings直接读取使用区域的数据

这里的读取方法,不用最大行号最大列号,直接使用used_range对应的方法 代码如下: import xlwings as xwfile_path r...\AAA.xlsx# 实例化app,打开文件 app_e xw.App(VisibleFalse,add_bookFalse) work_book appe.books.open(f…

New Phytologist | 中国科学院地理所:菌根共生途径塑造树木根经济空间

本文首发于“生态学者”微信公众号! 根经济空间是环境驱动下一系列根属性复杂互作的结果,本质上反映了植物地下碳(“货币”)投资与养分(“商品”)收益的多维策略权衡关系(图1)。然而…

【java】数据类型与变量以及操作符

各位看官:如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论,感谢您的支持!!! 目录 一.字面变量: 二:数据类型 1.1:int类型:&#xff0…

高速机器人的点动与直线运动

工业机器人中的点动和直线运动非常之重要,接下来说一下他们的实现过程。 点动: 点动包括两个部分,第一个点动是每一个关节电机的点动,第二个是机器末端向xyz的三个方向进行点动处理。 第一个点动是非常简单的,即把对…

IO系列-3 NIO基本概念:Buffer和Channel和Selector

1.缓冲区 1.1 Buffer类介绍 java在BIO中通常使用字节数组byte[]和字符数组char[]实现数据传输,在NIO中,引入了缓冲区Buffer进行数据传输,相对数组提供了更多的属性和API.Buffer在java.nio包中引入,Buffer对于常见的类型有对应的…

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

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

Stable Diffusion的核心插件—ControlNet!万字长文解读!

前言 一、介绍 论文地址:[https://arxiv.org/abs/2302.05543](https://arxiv.org/abs/2302.05543 "https://arxiv.org/abs/2302.05543")代码地址:[GitHub - lllyasviel/ControlNet: Let us control diffusion models!](https://github.com/ll…

Python和C++胶体粒子三维残差算法模型和细化亚像素算法

🎯要点 使用信噪比、对比度噪声比和点扩展函数量化实验数据,增强共聚焦显微镜成像。参考粒子跟踪算法:使用二维和三维径向模型细化亚像素。胶体粒子三维图形分割学习模型模拟检测球形胶体。使用网格搜索优化模型和归一化处理以避免光漂白。 …

idear 控制台乱码、查询结果、参数、控制台乱码

一、 -Dfile.encodingUTF-8 二、 三、 四、 五、

【区间选点】

题目 代码 左端点排序区间合并 #include <bits/stdc.h> using namespace std; #define null -0x3f3f3f3f #define x first #define y second typedef pair<int, int> PII; const int N 1e510; vector<PII> v; int main() {int n;cin >> n;for(int i…

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

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

当管理遇上AI,工作效率翻了3倍!

最近这段时间&#xff0c;很多企业都开始降薪、裁员。 在降本增效的大背景下&#xff0c;企业但凡有什么大动作&#xff0c;压力往往都会转嫁到管理者的身上。 一方面&#xff0c;要调大家的状态&#xff0c;处理团队中的各种琐事&#xff1b;另一方面&#xff0c;要及时响应…

C++ : STL容器之string剖析

STL容器之string剖析 一、string 的迭代器&#xff08;一&#xff09;起始迭代器&#xff08;二&#xff09;末尾迭代器&#xff08;三&#xff09;反向迭代器 二、容量相关的函数&#xff08;一&#xff09;size&#xff08;二&#xff09;capacity&#xff08;三&#xff09;…

Unity3d使用JsonUtility.FromJson读取json文件

使用JsonUtility.FromJson方法不需要额外引用第三方库。该方法只能读取json对象&#xff0c;而不能读取json数组。 假如我们有如下的json数组&#xff1a; [ {"id":1, "name":"first2021", "level":5, "score":100, "…

cefsharp129.0.110(CEF 129.0.11,Chromium 129.0.6668.90)版本体验

一、依赖包 1.1 CefSharp.WinForms CefSharp.WinForms .NET Framework:net462 net462 is compatible. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 1.2 CefSharp.…

JAVA思维提升

利用java做一个双色球彩票系统 要求 package ZY; import java.util.Random; import java.util.Scanner; public class Test9双色球 { //目标&#xff1a;模拟双色球//规则投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择。publi…

springboot网站开发-解决web前端请求的一个错误

springboot网站开发-解决web前端请求的一个错误&#xff01;近期在开发网站时&#xff0c;web页面&#xff0c;点击金币结算按钮时&#xff0c;一直报错&#xff0c;说金币余额不足。经过使用浏览器自带的js调试插件&#xff0c;一步一步跟踪调试&#xff0c;发现了原因。是漏写…

程计软题3-编译程序基本原理

(一)词法分析的工具-正规式 题1-语句找表达式 1. 排除法 对于A&#xff1a;a*取0个a&#xff0c;&#xff08;a&#xff09;*取1个a,b*取b,A例可取ab,不满足题目 对于C:取ba*取b,a*取1个a&#xff0c;&#xff08;b&#xff09;*,取ab&#xff0c;不满足题目 对于D:&#xff…