在vue3中用PlayCanvas构建3D物理模型

Alt

本文由ScriptEcho平台提供技术支持

项目地址:传送门

3D 物理引擎示例:PlayCanvas 创建可互动的物理场景

应用场景

本示例演示了如何使用 PlayCanvas 创建一个交互式的 3D 物理场景。在这个场景中,用户可以创建和删除椅子,椅子会受到物理引擎的影响,可以相互碰撞和移动。

代码基本功能

此代码的主要功能包括:

  • 使用 PlayCanvas 创建一个 3D 场景,其中包含椅子、地面和灯光。
  • 使用 Ammo.js 物理引擎为椅子和地面添加物理属性。
  • 允许用户通过点击按钮创建和删除椅子。
  • 实时更新物理场景,使椅子可以相互碰撞和移动。

功能实现步骤及关键代码分析

1. 创建 PlayCanvas 场景

const app = new pc.AppBase(canvas)
app.init(createOptions)
app.start()

这些代码行创建了 PlayCanvas 应用程序并初始化了场景。createOptions 对象指定了应用程序的设置,例如图形设备、组件系统和资源处理程序。

2. 添加物理引擎

pc.WasmModule.setConfig('Ammo', {
  glueUrl: 'playcanvas/src/lib/ammo/ammo.wasm.js',
  wasmUrl: 'playcanvas/src/lib/ammo/ammo.wasm.wasm',
  fallbackUrl: 'playcanvas/src/lib/ammo/ammo.js',
})

这些代码行配置并加载 Ammo.js 物理引擎。

3. 创建场景层次结构

const scene = [
  // ... (场景定义)
]

scene 变量定义了场景的层次结构,包括椅子、地面和灯光。

4. 解析场景

function parseScene(s) {
  s.forEach(function (e) {
    app.root.addChild(parseEntity(e))
  })
}

parseScene 函数解析场景定义并将其转换为 PlayCanvas 实体。

5. 添加物理属性

function parseEntity(e) {
  // ... (其他代码)
  if (e.components) {
    e.components.forEach(function (c) {
      entity.addComponent(c.type, c.options)
    })
  }
  // ... (其他代码)
}

在解析实体时,parseEntity 函数检查实体是否有 components 属性。如果有,则为实体添加指定的组件,包括碰撞组件和刚体组件。

6. 创建和删除椅子

function spawnChair() {
  const chair = app.root.findByName('Chair')
  const clone = chair.clone()
  clone.setLocalPosition(
    Math.random() * 1 - 0.5,
    Math.random() * 2 + 1,
    Math.random() * 1 - 0.5,
  )
  app.root.addChild(clone)
  numChairs++
}

spawnChair 函数克隆了一个椅子实体并将其添加到场景中。它还更新了场景中椅子的数量。

7. 实时更新物理场景

app.on('update', function (dt) {
  // ... (其他代码)

  app.root
    .findComponents('rigidbody')
    .forEach(function (body) {
      body.entity
        .findComponents('render')
        .forEach(function (render) {
          render.material = body.isActive() ? red : gray
        })
      })
  })
})

update 事件处理程序中,代码会更新物理场景,使椅子可以相互碰撞和移动。它还检查刚体是否处于活动状态,并相应地更新其材质颜色。

总结与展望

此代码示例演示了如何使用 PlayCanvas 创建一个交互式的 3D 物理场景。该示例可以作为构建更复杂物理模拟的基础,例如游戏或虚拟现实体验。

未来开发方向:

  • 优化物理引擎性能,以支持更多椅子和更复杂的交互。

  • 添加更多交互功能,例如允许用户控制椅子的运动或添加新的物体类型。

  • 集成用户界面,允许用户调整物理引擎设置或保存和加载场景。

    更多组件:

    在这里插入图片描述


    在这里插入图片描述

获取更多Echos

本文由ScriptEcho平台提供技术支持

项目地址:传送门

扫码加入AI生成前端微信讨论群:

扫码加入群聊

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python入门教程 - 模块、包(八)

目录 一、模块的概念 二、模块的导入方式 三、案例演示 3.1 import模块名 3.2 from 模块名 import 功能名 3.3 from 模块名 import * 3.4 as定义别名 四、自定义模块 4.1 制作自定义模块 4.2 测试模块 4.3 注意事项 4.4 __all__ 五、Python包 5.1 包的概念 5.2 …

操作系统——信号

将信号分为以上四个阶段 1.信号注册:是针对信号处理方式的规定,进程收到信号时有三种处理方式:默认动作,忽略,自定义动作。如果不是自定义动作,这一步可以忽略。这个步骤要使用到signal/sigaction接口 2.…

2002-2023年款别克君威 君威GS维修手册和电路图资料更新

经过整理,2002-2023年款别克君威 君威GS全系列已经更新至汽修帮手资料库内,覆盖市面上99%车型,包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图…

Dorkish:一款针对OSINT和网络侦查任务的Chrome扩展

关于Dorkish Dorkish是一款功能强大的Chrome扩展工具,该工具可以为广大研究人员在执行OSINT和网络侦查任务期间提供强大帮助。 一般来说,广大研究人员在执行网络侦查或进行OSINT信息收集任务过程中,通常会使用到Google Dorking和Shodan&…

晶圆代工市占洗牌,中芯跃居第三名 | 百能云芯

市场研究机构集邦咨询(TrendForce)最新发布的调查显示,今年第1季前五大晶圆代工厂第1季排名出现明显变动,除了台积电(TSMC)继续蝉联第一名,中芯国际(SMIC)受惠消费性库存…

Flutter-使用MethodChannel 实现与iOS交互

前言 使用 MethodChannel 在 Flutter 与原生 Android 和 iOS 之间进行通信,可以让你在 Flutter 应用中调用设备的原生功能。 基础概念 MethodChannel:Flutter 提供的通信机制,允许消息以方法调用的形式在 Flutter 与原生代码之间传递。方法…

光储充一体化充电站:能源革新的绿色引擎

在这个科技日新月异的时代,一场绿色能源的革命正悄然兴起。 光储充一体化充电站,作为这场革命中的璀璨明星,正以其独特的魅力,引领我们走向更加环保、高效的未来。 光储充一体化充电站,顾名思义,将光伏发电…

Chromium源码阅读:Mojo实战:从浏览器JS API 到blink实现

​ 通过在前面几篇文章,我们粗略梳理了Mojo这套跨进程通信的设计思路和IDL细节。 实际上,Mojo不止是跨进程通信框架,而是跨语言的模块通信自动化系统。 在浏览器暴露的JS API,也是需要通过Mojo这个系统进行桥接,最终…

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

在遥感影像上人工制作分类数据集 1.新建shp文件 地理坐标系保持和影像一致,面类型 2.打开属性表 3.添加字段 这里分类6类,点击添加值添加 添加完毕 开始人工选地物类型,制作数据集 开始标注,标注的时候可以借助谷歌地图…

记录清除挖矿病毒 solrd 过程

1、发现solrd病毒 端午节期间,kafka 服务器被黑客攻击了,植入了挖矿病毒 solrd,这个病毒很聪明,内存,CPU并没有异常升高,以致于上班第一天完全没有察觉。 上班第一天 正常登录服务器查看 flink ,消费kafka…

Eclipse创建Spring项目

第一步&#xff1a;先用Eclipse创建一个tomcat项目 打开eclipse 配置tomcat 这里点击add去添加tomcat 创建项目 写好项目名字&#xff0c;点击next 将这个Deploy path修改一下 配置一下项目&#xff0c;将项目部署到tomcat上面去 写个html测试一下 <html><h1>Hel…

tensorboard终于不报错了!

之前tensorboard笔记,记录2种使用方法&#xff0c;可以参考&#xff01; 有图这也没有数据啊这也。实际是没点对&#xff0c;干了个大噶。选择上方scalars就能看见图了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

GitHub新手使用基本流程(保姆级教程)

GitHub&#xff0c; 一个聚合了海量开源免费的软件、电子书、视频课等资源的神仙网站&#xff0c;如果你还不会用GitHub&#xff0c;这条保姆级教程&#xff0c;您千万不要错过。 首先打开浏览器搜索GitHub, 点击进入官网 如果遇到无法加载的问题&#xff0c;可以试试这个名叫…

机器视觉:工业相机的主要参数

工业相机是将目标物体的表面特征信息转化为数字信号&#xff08;或者模拟信号&#xff09;的一种采集设备。 一、工业相机的成像原理 工业相机主要由光电传感器和转换电路组成。 光线照射到被检测物体的表面&#xff0c;反射光经过透镜&#xff0c;再进入相机的光电传感器&a…

从报名到领证:软考初级【信息系统运行管理员】报名考试全攻略

本文共计9991字&#xff0c;预计阅读33分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…

flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理

目录 一&#xff1a;蓝图 1.蓝图介绍 2.使用步骤 3.蓝图中的静态资源和模板 二.cookie和session 1.cookie 2.flask中操作cookie 3.session 4.session操作步骤 三.请求钩子 四.flask上下文 1.介绍 2.请求上下文&#xff1a; 3.应用上下文 3.g对象 五&#xff1a;…

STM32高级控制定时器(STM32F103):TIM1和TIM8介绍

目录 概述 1 认识TIM1和TIM8 2 TIM1和TIM8的特性 3 TIM1和TIM6时基和分频 3.1 时基单元 3.2 预分频 3.3 时基和分频相关寄存器 3.3.1TIMx_CR1 3.3.2 TIMx_PSC 概述 本文主要介绍STM32高级定时器TIM1和TIM8的功能&#xff0c;还介绍了与之相关的寄存器的配置参数。包括…

如何在3天内开发一个鸿蒙app

华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;自2.0版本正式上线以来&#xff0c;在短时间内就部署超过了2亿台设备&#xff0c;纵观全球操作系统的发展史&#xff0c;也是十分罕见的。与其他手机操作系统不同&#xff0c;HarmonyOS自诞生之日起&#xff0c;就是一款面向…

layui一个页面多个table显示时工具栏被下方的table遮挡

记录&#xff1a;layui一个页面多个table显示时工具栏被下方的table遮挡 css代码&#xff1a; [lay-idcurrentTableId] .layui-table-tool {position: relative;z-index: 9999;width: 100%;min-height: 50px;line-height: 30px;padding: 10px 15px;border-width: 0;border-bot…

c#中上传超过30mb的文件,接口一直报404,小于30mb的却可以上传成功

在一次前端实现上传视频文件时,超过30mb的文件上传,访问接口一直报404,但是在Swagger中直接访问接口确是正常的,且在后端控制器中添加了限制特性,如下 但是却仍然报404,在apifox中请求接口也是报404, 网上说: 在ASP.NET Core中,配置请求过来的文件上传的大小限制通常…