Cannon-es.js编程进阶:复杂形状的碰撞

news2024/11/15 19:39:45

本文目录

  • 前言
  • 最终复杂模型碰撞效果
  • 1、碰撞事件及休眠事件
    • 1.1 前文回顾及代码整改
    • 1.2 效果
    • 1.3 监听碰撞事件与休眠
      • 1.3.1 碰撞事件collide
      • 1.3.2 休眠事件sleepy及sleep
  • 2、多个形状的组合物体碰撞
    • 2.1 效果
  • 3、Trimesh
    • 3.1 代码
    • 3.2 效果

前言

我们在Cannon-es.js基础入门:3D 物理碰撞效果已经了解了简单的物体碰撞效果,我们还可以监听其碰撞的事件,和监听休眠事件。甚至我们可以实现多个形状的组合物体以及复杂模型的物理碰撞。并且解决了threejs里的gltf模型缩放了7倍,cannon-es里的Trimesh该如何对应的问题。
在三维图形与物理模拟的交融领域,cannon-es(一个轻量级、模块化的JavaScript 3D物理引擎库)与three.js(强大的WebGL JavaScript库,用于在网页上创建和显示3D图形)的结合无疑为开发者们提供了一个强大的平台,用于创建既逼真又交互性强的3D场景。本指南将深入探讨如何将这两个库有效结合,实现复杂的物理碰撞检测、物体休眠状态管理以及复杂形状(如Trimesh三角网格)的碰撞处理。

最终复杂模型碰撞效果

请添加图片描述

1、碰撞事件及休眠事件

1.1 前文回顾及代码整改

我们在Cannon-es.js基础入门:3D 物理碰撞效果的代码基础修改正方体的位置:
box.position.set(-3, 5, 0);
在这里插入图片描述


并且增加其物理刚体的材质的弹性属性:
boxMaterial.restitution = 0.7; // 反弹系数
在这里插入图片描述


给物理地面材质增加弹性属性:
groundMaterial.restitution = 0.9; // 反弹系数
在这里插入图片描述


并且删除其速度的代码
在这里插入图片描述

1.2 效果

请添加图片描述

1.3 监听碰撞事件与休眠

1.3.1 碰撞事件collide

getImpactVelocityAlongNormal获取碰撞物体速度。
我们监听正方体的碰撞事件,如下代码:

    // 碰撞事件
    boxBody.addEventListener("collide", (e) => {
   
        console.log('碰撞', e)
        let speed = e.contact.getImpactVelocityAlongNormal()
        console.log('速度', speed)
    })

效果如下:
在这里插入图片描述

1.3.2 休眠事件sleepy及sleep

我们首先要先设置物理世界允许休眠:
physicsWorld.allowSleep = true
在这里插入图片描述
监听正方体休眠事件及配置:

    // 设置立方体允许休眠
    boxBody.allowSleep = true
    // 设置速度小于1休眠
    boxBody.sleepSpeedLimit = 0.5
    // 设置1秒后进入休眠
    boxBody.sleepTimeLimit = 1


    // 监听休眠事件
    boxBody.addEventListener("sleepy", (e) => {
   
        console.log('即将进入休眠', e)
    })
    boxBody.addEventListener("sleep", (e) => {
   
        console.log('已经休眠', e)
    })

效果:
在这里插入图片描述


2、多个形状的组合物体碰撞

代码如下,创建一个胶囊体:

<template>
    <canvas ref="cannonDemo" class="cannonDemo">
    </canvas>
</template>

<script setup>
import {
    onMounted, ref } from "vue"
import * as THREE from 'three'
import * as CANNON from 'cannon-es'
import {
    OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const cannonDemo = ref('null')

onMounted(() => {
   
    const cannonDemoDomWidth = cannonDemo.value.offsetWidth
    const cannonDemoDomHeight = cannonDemo.value.offsetHeight

    // 创建场景
    const scene = new THREE.Scene
    // 创建相机
    const camera = new THREE.PerspectiveCamera( // 透视相机
        45, // 视角 角度数
        cannonDemoDomWidth / cannonDemoDomHeight, // 宽高比 占据屏幕
        0.1, // 近平面(相机最近能看到物体)
        1000, // 远平面(相机最远能看到物体)
    )
    camera.position.set(0, 2, 30)
    // 创建渲染器
    const renderer = new THREE.WebGLRenderer({
   
        antialias: true, // 抗锯齿
        canvas: cannonDemo.value
    })
    // 设置设备像素比
    renderer.setPixelRatio(window.devicePixelRatio)
    // 设置画布尺寸
    renderer.setSize(cannonDemoDomWidth, cannonDemoDomHeight)

    // 创建物理世界开始
    const physicsWorld = new CANNON.World()
    physicsWorld.allowSleep = true
    // 设置y轴重力
    physicsWorld.gravity.set(0, -9.82, 0)
    // 创建物理材料
    const groundMaterial = new CANNON.Material('groundMaterial')
    groundMaterial.friction = 0.1
    groundMaterial.restitution = 1 // 反弹系数

    // 设置碰撞组 数值要用2 的幂
    const GROUP1 = 1
    const GROUP2 = 2

    /

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

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

相关文章

新闻媒体宣发套餐扩大影响力和建立品牌形象方法-华媒舍

在当今互联网时代&#xff0c;营销推广是任何企业必须要面对的挑战。而在众多的营销方式中&#xff0c;精准投放和新闻媒体宣发套餐推广成为了越来越受欢迎的选择。本文将从精准投放和新闻媒体宣发套餐推广两个方面进行科普介绍&#xff0c;解析其背后的重要意义和带来的百倍回…

微软宣布弃用WSUS,企业用户尽早准备替换方案

微软最近宣布将逐步弃用Windows Server Update Services (WSUS)&#xff0c;不再为其开发新功能&#xff0c;但会继续支持现有的更新和功能。这一决定对企业客户来说影响深远&#xff0c;尤其是那些依赖WSUS来管理大规模Windows设备更新的组织。 对企业客户的影响 安全性与合规…

如何使用ant design vue的a-select下拉框,实现既能输入内容,也可以下拉选择的效果,apiselect同样适用

修改mode 强烈推荐 代码如下&#xff0c;重点在search和mode <ApiSelectv-if"editableData[record.key]"mode"SECRET_COMBOBOX_MODE_DO_NOT_USE"search"inputinspect":api"problem":params"{projectId:projectId}"showS…

[前端]DOM+CSS+HTML实现水波进度效果

效果展示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

PAT甲级-1115 Counting Nodes in a Binary Search Tree

题目 题目大意 给定节点个数&#xff0c;以及每个节点的值&#xff0c;要求构造一棵二叉排序&#xff08;搜索&#xff09;树&#xff0c;并按照规定格式输出最后一层和倒数第二层的节点个数。 思路 二叉排序树的构造方法是递归&#xff0c;但思路类似于二分查找。逐个将n个…

浅克隆与深克隆

1、浅克隆 1.1、什么是浅克隆&#xff1f; 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然 指向原来的对象(克隆对象与原型对象共享引用数据类型变量)。 如下图所示&#xff1a; 1.2、浅克隆代码实现 类实现接口 Cloneable&#xf…

教育在线答题在线小程序源码系统 PHP+MySQL组合开发源码开源可二次开发 带搭建部署教程

系统概述 教育在线答题在线小程序源码系统是一款专为教育行业设计的&#xff0c;集在线题库管理、智能组卷、在线答题、自动评分、成绩分析等功能于一体的综合性平台。该系统采用PHP作为后端开发语言&#xff0c;结合MySQL数据库进行数据存储与管理&#xff0c;确保了系统的稳…

数据在内存中的存储(下)

目录 前言一、浮点数在内存中的存储1.1 练习1.2 浮点数的存储1.2.1 浮点数存的过程1.2.2 浮点数取的过程 1.3 题目解析 总结 前言 前面一期我们主要说到整形在数据中的存储方式&#xff0c;这期我们来看看浮点数在内存中是如何存储的&#xff0c;话不多说&#xff0c;正文开始…

Proto3 深度解读:Protobuf 的用法与实例分析(C++)

文章目录 1. 前言1.1 序列化和反序列化1.2 什么情况下要进行序列化1.3 部分序列化工具 2. 了解Protobuf2.1 什么是Protobuf2.2 proto 成分2.3 如何编译proto2.4 编译.proto文件后生成的文件都有什么&#xff1f; 3. Protobuf的使用3.1 Protobuf的使用过程3.2 上手编写实例 4. p…

打印沙漏(最蠢的办法)

直接给代码&#xff0c;很好理解的 #include<bits/stdc.h> using namespace std; int s(int b){if(b<1)return 0;if(b2)return 1;for(int i3;i<sqrt(b);i){if(b%i0)return 0;}return 1; } int main(){int n;cin>>n;char c;cin>>c;vector<int>s;…

什么是服务器日志,日志有什么作用?

前言 服务器日志是指服务器等电脑设备或软件的运作记录‌。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要&#xff0c;因为它们包含了用于调试问题的消息、服务器状态以及其他…

深入解析网络通信关键要素:IP 协议、DNS 及相关技术

我的主页&#xff1a;2的n次方_ 1. IP 协议报头结构 4 位版本&#xff1a;表示 IPv4 / IPv6 4 位首部长度&#xff1a;表示 IP 报头的长度&#xff0c;以 4 字节为单位 8 位服务类型&#xff1a;包括 3 位优先权字段&#xff08;已弃用&#xff09;&#xff0c;4 位 TOS 字…

css基础知识(二)

“落座无言行三载&#xff0c;持笔无悔笑苍生&#xff01;” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;1. 选择器类型标签选择器类选择器ID选择器通配符选择器复合选择器 2. 元素显示模式块级元素行内元素行内块元素 3. 背景属性4. 字体和文本属性5.垂直居中的实现方…

vue到出excel

安装 npm install exceljs npm install file-saver<template><button click"dade66">导出 66</button> </template><script> import ExcelJS from exceljs; import { saveAs } from file-saver;export default {data() {return {data…

Unity多语言插件I2 Localization国际化应用

【就不收费了&#xff0c;要个关注不过分吧】 【图片来自插件官网&#xff0c;侵删】 前言 目前游戏往往都不会仅局限于国内语言&#xff0c;为了适应产品都要做国际化适配&#xff0c;因此会用到这个插件&#xff0c;这个插件要付费&#xff0c;因此请前往unity官网进行下载…

Windows系统设置定时任务,周期性执行.bat文件

通过.bat清除注册表项 在 Windows 系统中&#xff0c;.bat 文件&#xff08;批处理文件&#xff09;是一个包含一系列命令的文本文件。这些命令会被 Windows 命令解释器 (cmd.exe) 依次执行。 你可以把它想象成一个简单的程序&#xff0c;但它不像 C 或 Python 那样需要编译&a…

Go容器化微服务系统实战

1-1 本课的go微服务有什么不同&#xff1f; 聚焦于容器化可观测的购物微服务系统实战&#xff0c;通过介绍Go语言的应用趋势、容器化优势及微服务适用性&#xff0c;旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…

Linux文件IO(九)-原子操作与竞争冒险

Linux 是一个多任务、多进程操作系统&#xff0c;系统中往往运行着多个不同的进程、任务&#xff0c;多个不同的进程就有可能对同一个文件进行 IO 操作&#xff0c;此时该文件便是它们的共享资源&#xff0c;它们共同操作着同一份文件&#xff1b;操作系统级编程不同于大家以前…

javase复习day33网络编程

网络编程 常见的软件架构 BS架构 CS架构 网络编程小结 网络编程三要素 三要素小结 IP IPV4 IPV6 IP小结 IPV4的地址分类形式 常用的CMD命令 小结 InetAddress的使用 public class Demo1 {public static void main(String[] args) throws UnknownHostException {//获取IP对象/*…

【EI会议大盘点!涵盖计算机图像视觉、机器学习等众多方向】

EI会议&#xff0c;作为全球知名的学术会议平台&#xff0c;以其广泛的影响力和严格的收录标准著称。 相较于SCI、核心期刊等期刊来说&#xff0c;EI会议的审稿周期更短&#xff0c;最快7天即可录用。 费用上也相对较低&#xff0c;这对于资金和时间双重压力的学生党来说&…