Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 1. 数学几何计算基础

  • 2.位移、速度、加速度(向量)

  • 3.向量点乘、叉乘

  • 4.四元数、欧拉角(角度姿态)

  • 5.矩阵

  • 6.射线

  • 7.包围盒

  • 8.第一、三人称漫游

  • 9.漫游-八叉树碰撞检测

  • 10.CannonJS物理引擎

    • 1. 物理引擎CannonJS简介和引入
    • 2. CannonJS自由落体计算
    • 3. 练习-threejs可视化cannon计算结果
    • 4. CannonJS模拟乒乓球下落反弹
    • 5. 练习-修改小球参数
    • 6. 练习-点按钮重复下落
    • 7. CannonJS碰撞事件,碰撞声音
      • 8. 长方体Box碰撞体(箱子下落)
      • 9. 练习题-外部gltf箱子模型
      • 10. 凸多面体ConvexPolyhedron
    • Three.js进阶教程
    • 10.CannonJS物理引擎
    郭隆邦
    2023-10-11
    目录

    7. CannonJS碰撞事件,碰撞声音

    # CannonJS碰撞事件,碰撞声音

    本节课给大家主要讲解CannonJS的碰撞事件,并根据碰撞信息,设置碰撞声音。

    # 碰撞体Body的碰撞事件collide

    浏览器控制台查看碰撞事件的属性

    body.addEventListener('collide', (event) => {
        console.log('碰撞事件', event);
    })
    

    查看碰撞事件的.contact属性,.contact表示当前body与其他碰撞体Body的碰撞信息。

    body.addEventListener('collide', (event) => {
        console.log('碰撞碰撞信息', event.contact);
    })
    

    # 碰撞事件的接触属性.contact

    当两个碰撞体Body碰撞的时候,会生成碰撞信息,碰撞事件.contact包含内容是body之间的碰撞信息。

    属性.contact的值对应CannonJS的一个类ContactEquation,cannon-es对应封装的文件目录\src\equations\ContactEquation.ts。

    点击文档地址ContactEquation (opens new window)

    contact.bi和contact.bj两个属性表示发生碰撞的两个碰撞体Body。

    • contact.bi: 监控碰撞事件的Body
    • contact.bj: 与contact.bi发生的碰撞的Body

    # contact.getImpactVelocityAlongNormal()

    两个物体在碰撞法线方向上对的相对速度

    const contact = event.contact;
    //获得沿法线的冲击速度
    contact.getImpactVelocityAlongNormal()
    

    # 碰撞声音基本思路

    提前准备一个乒乓球碰撞地面的录音,然后通过Audio加载音频,当物理小球body与物理地面发生碰撞的时候,播放音频。

    // 这里只是简单的思路,后面会详细讲解
    const audio = new Audio('./碰撞声.wav');
    ... 
    body.addEventListener('collide', (event) => {
        ...
        // 小球body发生碰撞事件,播放音频
        audio.play();
    })
    

    # 加载音频代码

    注意浏览器限制,音频首次播放,需要用户交互,不能用audio.play();代码直接播放,所以在碰撞事件播放音频之前,先通过用户点击事件播放音频。

    const audio = new Audio('./碰撞声.wav');
    document.getElementById('audio').addEventListener('click', function () {
        audio.volume = 0;//按钮开启声音时候,设置静音
        audio.play();
    })
    

    碰撞事件触发音频播放

    body.addEventListener('collide', () => {
        audio.volume = 1;
        audio.play();
    })
    

    # 通过碰撞程度,控制音量大小

    刚刚讲过contact.getImpactVelocityAlongNormal()可以获取两个物体在碰撞法线方向上对的相对速度。

    可以用碰撞相对速度表征碰撞程度,通过碰撞相对速度,控制音量大小。

    // 浏览器控制台测试下最大碰撞相对速度
    body.addEventListener('collide', (event) => {
        const contact = event.contact;
        const ImpactV = contact.getImpactVelocityAlongNormal();
        console.log('ImpactV', ImpactV);
    })
    
    body.addEventListener('collide', (event) => {
        const contact = event.contact;
        const ImpactV = contact.getImpactVelocityAlongNormal();
        // 碰撞越狠,声音越大
        //4.5比ImpactV最大值吕略微大一点,这样音量范围0~1
        audio.volume = ImpactV / 4.5;
        audio.play();
    })
    

    当然你也可以用其他函数关系

    audio.volume = Math.pow(ImpactV / 4.5,2);
    

    # 声音资源下载地址

    https://www.aigei.com/

    6. 练习-点按钮重复下落
    8. 长方体Box碰撞体(箱子下落)

    ← 6. 练习-点按钮重复下落 8. 长方体Box碰撞体(箱子下落)→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式