用PlayCanvas打造一个3D模型

news2025/2/25 3:16:40

Alt

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

项目地址:传送门

基于 PlayCanvas 的 3D 物理场景开发

应用场景介绍

PlayCanvas 是一款功能强大的 3D 引擎,可用于创建各种类型的 3D 体验,包括游戏、模拟和交互式可视化。本技术博客将介绍如何使用 PlayCanvas 创建一个具有物理交互功能的 3D 场景。

代码基本功能介绍

本代码演示了如何使用 PlayCanvas 创建一个具有以下功能的 3D 场景:

  • 物理碰撞和刚体运动
  • 使用 3D 模型和动画
  • 相机控制和场景交互
  • 动态创建和销毁对象

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

1. 初始化 PlayCanvas 和加载资产

首先,我们初始化 PlayCanvas 并加载所需的资产,包括 3D 模型、动画和纹理。

import * as pc from 'playcanvas'

const canvas = document.getElementById('canvas')
if (!(canvas instanceof HTMLCanvasElement)) {
  throw new Error('No canvas found')
}
const assets = {
  model: new pc.Asset('model', 'container', {
    url: 'playcanvas/assets/models/bitmoji.glb',
  }),
  idleAnim: new pc.Asset('idleAnim', 'container', {
    url: 'playcanvas/assets/animations/bitmoji/idle.glb',
  }),
  helipad: new pc.Asset(
    'helipad-env-atlas',
    'texture',
    { url: 'playcanvas/assets/cubemaps/helipad-env-atlas.png' },
    { type: pc.TEXTURETYPE_RGBP, mipmaps: false },
  ),
}
2. 创建物理场景

接下来,我们创建物理场景并设置重力。

// Set the gravity for our rigid bodies
app.systems.rigidbody.gravity.set(0, -9.81, 0)
3. 创建地面

我们创建了一个平面作为地面,并添加了刚体和碰撞组件,以使其具有物理特性。

const floor = new pc.Entity()
floor.addComponent('render', {
  type: 'box',
  material: gray,
})

// Scale it and move it so that the top is at 0 on the y axis
floor.setLocalScale(10, 1, 10)
floor.translateLocal(0, -0.5, 0)

// Add a rigidbody component so that other objects collide with it
floor.addComponent('rigidbody', {
  type: 'static',
  restitution: 0.5,
})

// Add a collision component
floor.addComponent('collision', {
  type: 'box',
  halfExtents: new pc.Vec3(5, 0.5, 5),
})

// Add the floor to the hierarchy
app.root.addChild(floor)
4. 创建 3D 模型

我们从加载的资产中实例化 3D 模型,并添加了动画、刚体和碰撞组件。

const modelEntity = assets.model.resource.instantiateRenderEntity({
  castShadows: true,
})

// Add an anim component to the entity
modelEntity.addComponent('anim', {
  activate: true,
})

// Add a rigid body and collision for the head with offset as the model's origin is
// at the feet on the floor
modelEntity.addComponent('rigidbody', {
  type: 'static',
  restitution: 0.5,
})

modelEntity.addComponent('collision', {
  type: 'sphere',
  radius: 0.3,
  linearOffset: [0, 1.25, 0],
})
5. 创建相机

我们创建了一个相机实体,并设置了它的位置和视角。

const cameraEntity = new pc.Entity()
cameraEntity.addComponent('camera')
cameraEntity.translate(0, 2, 5)
const lookAtPosition = modelEntity.getPosition()
cameraEntity.lookAt(
  lookAtPosition.x,
  lookAtPosition.y + 0.75,
  lookAtPosition.z,
)

app.root.addChild(cameraEntity)
6. 动态创建对象

我们在更新循环中创建了一个球体模板,并根据需要动态创建和销毁球体。

const ball = new pc.Entity()
ball.tags.add('shape')
ball.setLocalScale(0.4, 0.4, 0.4)
ball.translate(0, -1, 0)
ball.addComponent('render', {
  type: 'sphere',
})

ball.addComponent('rigidbody', {
  type: 'dynamic',
  mass: 50,
  restitution: 0.5,
})

ball.addComponent('collision', {
  type: 'sphere',
  radius: 0.2,
})

ball.enabled = false
// create a falling box every 0.2 seconds
if (count > 0) {
  timer -= dt
  if (timer <= 0) {
    count--
    timer = 0.5

    // Create a new ball to drop
    const clone = ball.clone()
    clone.rigidbody.teleport(
      pc.math.random(-0.25, 0.25),
      5,
      pc.math.random(-0.25, 0.25),
    )

    app.root.addChild(clone)
    clone.enabled = true
  }
}

总结与展望

通过本代码,我们成功创建了一个具有物理交互功能的 3D 场景。我们了解了如何使用 PlayCanvas 创建 3D 模型、设置物理特性、动态创建对象以及实现场景交互。

未来,我们可以对该场景进行拓展和优化,例如:

  • 添加更多交互元素,如按钮或杠杆

  • 实现更复杂的物理交互,如绳索或弹簧

  • 优化场景性能,提高帧率

    更多组件:

    在这里插入图片描述


    在这里插入图片描述

    获取更多Echos

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

    项目地址:传送门

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

扫码加入群聊

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

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

相关文章

低成本和颜值兼顾的 HomeLab 设备:HPE MicroServer Gen10(二)

本篇文章&#xff0c;继续分享另外一台端午假期折腾的设备&#xff0c;HP MicroServer Gen10 一代。同样分享下我的折腾思路&#xff0c;希望能够帮助到有类似需求的你。 写在前面 Gen10 “标准版”&#xff08;第一代&#xff09;和 Plus 版本设计风格一致&#xff0c;同样颜…

20240607在ubuntu下解压缩7z的压缩包文件

20240607在ubuntu下解压缩7z的压缩包文件 2024/6/7 10:26 百度&#xff1a;ubuntu 7z解压缩 在Ubuntu中&#xff0c;可以使用7z命令来解压.7z文件。首先&#xff0c;确保你已经安装了p7zip-full包&#xff0c;如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo …

预告|博睿数据将受邀出席GOPS全球运维大会北京站!

GOPS全球运维大会作为国内外运维领域最具影响力的技术盛会之一&#xff0c;旨在汇聚全球运维精英&#xff0c;分享运维领域的前沿技术、实践经验与创新理念。6月28日&#xff0c;博睿数据&#xff08;bonree.com&#xff0c;股票代码688229&#xff09;将受邀出席第二十三届 GO…

SQL入门到入土索引优化,聚合函数,数据备份与恢复,事务处理,查询、更新、插入和删除数据库

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

巨头 VC 间的博弈:一文了解 Paradigm 及 Lido 支持的再质押协议 Symbiotic

撰文&#xff1a;Yangz&#xff0c;Techub News 作为此轮牛市中少有的 DeFi 热门叙事&#xff0c;再质押赛道迎来又一位重磅选手。6 月 11 日&#xff0c;Symbiotic 宣布完成初步部署并在 Paradigm 和 Cyber Fund 领投的种子轮融资中筹集 580 万美元。上线 5 小时后&#xff0c…

FOXMAIL邮箱:高效办公,邮件管理新风尚

随着电子邮件在日常工作和生活中的普及&#xff0c;选择一个高效、易用的邮箱客户端变得尤为重要。FOXMAIL作为一款功能强大、操作简便的邮箱客户端&#xff0c;深受用户喜爱。下面将为您详细介绍FOXMAIL邮箱的使用方法&#xff0c;帮助您轻松掌握其各项功能。 一、下载安装与账…

C++中的结构体——结构体案例2

案例描述 设计一个英雄的结构体&#xff0c;包括成员姓名&#xff0c;年龄&#xff0c;性别&#xff1b;创建结构体数组&#xff0c;其中存放五名英雄 通过冒泡排序的算法&#xff0c;将数组中的英雄按照年龄升序排列&#xff0c;最终打印排序后的结果 五名英雄信息如下&…

OpenCV计算形状之间的相似度ShapeContextDistanceExtractor类的使用

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 ShapeContextDistanceExtractor是OpenCV库中的一个类&#xff0c;主要用于计算形状之间的相似度或距离。它是基于形状上下文&#xff08;Shape Co…

React基础教程(06):Ref的应用

7、Ref的应用 7.1 给标签设置ref"username" 通过这个获取this.refs.username&#xff0c;ref可以获取到应用的真实dom <input style{{width:300}}ref{"text"}/> {/*非常推荐*/} <Button style{{backgroundColor:#2ba471, border:"none&qu…

基于STM32和人工智能的智能交通管理系统

目录 引言环境准备智能交通管理系统基础代码实现&#xff1a;实现智能交通管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能交通管理与优化问题解决方案与优化收尾与总结 1. 引言 随着城市化进程的加快&#xff0…

flutter开发实战-RichText富文本居中对齐

flutter开发实战-RichText富文本居中对齐 在开发过程中&#xff0c;经常会使用到RichText&#xff0c;当使用RichText时候&#xff0c;不同文本字体大小默认没有居中对齐。这里记录一下设置过程。 一、使用RichText 我这里使用RichText设置不同字体大小的文本 Container(de…

什么是相对路径?什么是绝对路径?打包时路径怎么搞?

简单点说&#xff1a; 绝对路径&#xff1a;绝对路径是一个完整的路径&#xff0c;从根目录开始一直到目标文件或目录的路径。通常我们直接使用"/ "代表从根目录开始的目录路径。它提供了文件或目录在文件系统中的确切位置&#xff0c;与当前工作目录无关。绝对路径…

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义&#xff1a;性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备&#xff0c;从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器&#xff0c;从而在开…

Unity基础(三)3D场景搭建

目录 简介: 一.下载新手资源 二.创建基本地形 三.添加场景细节 四,添加水 五,其他 六. 总结 简介: 在 Unity 中进行 3D 场景搭建是创建富有立体感和真实感的虚拟环境的关键步骤。 首先&#xff0c;需要导入各种 3D 模型资源&#xff0c;如建筑物、角色、道具等。这些模…

快速掌握JUnit等测试框架的使用,进行Java单元测试

1. 单元测试简介 单元测试&#xff08;Unit Testing&#xff09;是一种软件测试方法&#xff0c;通过对软件中的最小可测试单元进行验证&#xff0c;确保它们按预期工作。单元测试通常用于测试一个类的单个方法&#xff0c;以确保其逻辑正确、边界情况处理妥当、异常处理合适。…

基于Java的诊所医院管理系统,springboot+html,MySQL数据库,用户+医生+管理员三种身份,完美运行,有一万一千字论文

演示视频 基本介绍 基于Java的诊所医院管理系统&#xff0c;springboothtml&#xff0c;MySQL数据库&#xff0c;用户医生管理员三种身份&#xff0c;完美运行&#xff0c;有一万一千字论文。 用户&#xff1a;个人信息管理、预约医生、查看病例、查看公告、充值、支付费用...…

MAVEN-SNAPSHOT和RELEASE

一、快照版本SNAPSHOT和发布版本RELEASE区别 快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客 在使⽤maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能⼀天就要发布⼀次&#xff0c;遇到bug时&am…

Scala网络编程:代理设置与Curl库应用实例

在网络编程的世界里&#xff0c;Scala以其强大的并发模型和函数式编程特性&#xff0c;成为了开发者的得力助手。然而&#xff0c;网络请求往往需要通过代理服务器进行&#xff0c;以满足企业安全策略或访问控制的需求。本文将深入探讨如何在Scala中使用Curl库进行网络编程&…

【AI】文心一言的使用分享

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在改变我们的生活。文心一言&#xff0c;作为这一浪潮中的佼佼者&#xff0c;以其卓越的自然语言处理能力和广泛的应用场景&#xff0c;给我带来了前所未有的使用体验。在这篇分享中&#xff0c;我…

百万上下文RAG,Agent还能这么玩

❝ 在AI技术飞速发展的今天&#xff0c;我们见证了许多令人惊叹的突破。最近&#xff0c;Qwen2模型的开源引起了广泛的关注&#xff0c;它不仅展示了超越闭源模型的能力&#xff0c;还带来了一个全新的框架——Qwen-Agent。 Qwen-Agent的设计思路虽然与LangChain相似&#xff0…