当前位置: 首页 > news >正文

【前端】Matter:物体的高级控制

在 Matter.js 中,除了简单的物体创建和碰撞检测外,还可以通过高级控制实现更复杂的物理交互与模拟效果。本教程将介绍如何使用 约束 (Constraint)复合物体 (Composite) 以及如何进行 运动与旋转控制,来实现链条、摆钟等效果,以及复杂的物体组合与精准的物体运动控制。

约束 (Constraint)

约束在物理引擎中用来连接两个物体,模拟关节、弹簧等效果。通过约束可以创建更复杂的物体行为,比如链条、摆钟等。

创建基本约束

在 Matter.js 中,Constraint.create() 用于创建一个约束。你可以将它应用于两个物体或将一个物体固定在世界中的某个点。以下是一个简单的例子,展示如何创建一个连接两个物体的约束:

const { Engine, Render, Runner, World, Bodies, Constraint } = Matter;// 创建引擎和渲染器
const engine = Engine.create();
const render = Render.create({element: document.body,engine: engine,options: {width: 800,height: 600,wireframes: false}
});// 创建两个物体
const circleA = Bodies.circle(300, 200, 40);
const circleB = Bodies.circle(400, 200, 40);// 创建约束连接两个物体
const constraint = Constraint.create({bodyA: circleA,bodyB: circleB,stiffness: 0.05, // 弹性系数,值越大连接越刚性length: 100,     // 约束的长度render: {visible: true   // 可视化约束}
});// 将物体和约束添加到世界中
World.add(engine.world, [circleA, circleB, constraint]);// 运行引擎和渲染器
Engine.run(engine);
Render.run(render);

在这个示例中,两个圆形物体 circleAcircleB 通过约束连接在一起,stiffness 控制约束的弹性系数,length 设置连接的长度。通过这个约束,物体之间可以相互拉动或推动,产生类似弹簧的效果。

模拟摆钟

我们可以使用约束创建一个简单的摆钟。在摆钟中,一个物体通过关节固定在某个位置,并且可以在重力作用下摆动。

const pendulumBall = Bodies.circle(400, 300, 40);// 创建摆钟的约束,将物体固定在世界中的某个点
const pendulum = Constraint.create({pointA: { x: 400, y: 100 },  // 固定点的位置bodyB: pendulumBall,         // 链接的物体length: 200,stiffness: 0.9
});World.add(engine.world, [pendulumBall, pendulum]);

在这里,pointA 表示约束的固定点,bodyB 是摆钟的球体。这种约束模拟了一个固定在天花板上的摆钟。

链条效果

通过连接多个物体和约束,我们可以模拟链条的效果。每个物体通过约束与前一个物体连接,形成一条链条。

const chain = [];
let prevCircle = null;for (let i = 0; i < 5; i++) {const circle = Bodies.circle(300 + i * 50, 200, 20);if (prevCircle) {const link = Constraint.create({bodyA: prevCircle,bodyB: circle,length: 50,stiffness: 0.9});World.add(engine.world, link);}chain.push(circle);prevCircle = circle;
}World.add(engine.world, chain);

在这个例子中,chain 是一个由圆形物体组成的链条。每个物体通过约束与前一个物体连接,模拟了链条的运动。

复合物体 (Composite)

复合物体是将多个刚体组合成一个单一的结构,这些刚体可以作为一个整体进行运动和交互。复合物体非常适合用来创建复杂的形状或机械结构,如车辆、机器人等。

创建简单的复合物体

Composite.create() 用于创建一个复合物体,然后我们可以将多个刚体添加到其中。

const composite = Matter.Composite.create();const bodyA = Bodies.circle(200, 200, 40);
const bodyB = Bodies.rectangle(300, 200, 80, 40);// 将物体添加到复合物体中
Matter.Composite.add(composite, [bodyA, bodyB]);// 将复合物体添加到世界中
World.add(engine.world, composite);

在这个示例中,我们创建了一个复合物体,并将一个圆形和一个矩形物体添加到复合物体中。这个复合物体会作为一个整体参与物理模拟。

组合复杂结构

你可以通过复合物体创建更复杂的结构,如带有轮子的车体。以下是一个简单的例子,展示了如何组合车身和车轮:

const car = Composite.create();// 车身
const body = Bodies.rectangle(400, 300, 100, 40);// 车轮
const wheelA = Bodies.circle(370, 340, 20);
const wheelB = Bodies.circle(430, 340, 20);// 将车轮通过约束连接到车身
const axleA = Constraint.create({bodyA: body,bodyB: wheelA,pointB: { x: 0, y: 0 },stiffness: 1,length: 0
});const axleB = Constraint.create({bodyA: body,bodyB: wheelB,pointB: { x: 0, y: 0 },stiffness: 1,length: 0
});// 将所有部件添加到复合物体中
Composite.add(car, [body, wheelA, wheelB, axleA, axleB]);World.add(engine.world, car);

这个例子创建了一个简单的汽车结构,两个车轮通过约束连接到车身上,形成一个整体。车轮可以自由旋转,而车身则负责支持整个结构。

运动与旋转控制

在 Matter.js 中,除了依靠物理引擎的自动处理外,我们还可以精确控制物体的运动和旋转行为。

直接设置位置和角度

可以使用 Body.setPosition()Body.setAngle() 来直接修改物体的位置和角度。这允许你在特定条件下精确控制物体的位置和旋转。

const box = Bodies.rectangle(400, 300, 80, 80);// 设置新的位置
Matter.Body.setPosition(box, { x: 500, y: 400 });// 设置新的角度(单位为弧度)
Matter.Body.setAngle(box, Math.PI / 4);

设置物体的速度和角速度

你可以通过 Body.setVelocity()Body.setAngularVelocity() 来控制物体的速度和旋转速度。

// 设置线速度
Matter.Body.setVelocity(box, { x: 5, y: -3 });// 设置角速度(旋转速度)
Matter.Body.setAngularVelocity(box, 0.1);

这些方法允许你直接操控物体的运动轨迹和旋转行为,而不仅仅依赖于物理引擎的自动计算。

施加持续力和扭矩

除了瞬时的速度变化,你还可以通过 Body.applyForce()Body.applyTorque() 持续施加力和扭矩,控制物体的运动方向和旋转效果。

// 施加一个持续的向上的力
Matter.Body.applyForce(box, { x: box.position.x, y: box.position.y }, { x: 0, y: -0.05 });// 施加扭矩,使物体旋转
Matter.Body.applyTorque(box, 0.01);

applyForce() 允许你施加一个在某个点作用的力,而 applyTorque() 则用于施加扭矩,导致物体旋转。

小结

在本教程中,我们探索了 Matter.js 中物体的高级控制,包括通过 约束 (Constraint) 实现复杂的物体连接与交互、使用 复合物体 (Composite) 创建复杂结构,以及如何进行精确的 运动与旋转控制。这些高级技术能够帮助你实现更加逼真的物理模拟效果,创建更具挑战性和趣味性的交互场景。

相关文章:

【前端】Matter:物体的高级控制

在 Matter.js 中&#xff0c;除了简单的物体创建和碰撞检测外&#xff0c;还可以通过高级控制实现更复杂的物理交互与模拟效果。本教程将介绍如何使用 约束 (Constraint)、复合物体 (Composite) 以及如何进行 运动与旋转控制&#xff0c;来实现链条、摆钟等效果&#xff0c;以及…...

ASP.NET Core 路由规则 MapControllerRoute、MapDefaultControllerRoute、MapController

MapControllers 来映射属性路由控制器。 资料...

linux命令之less用法

less 分屏上下翻页浏览文件内容 补充说明 less命令 的作用与more十分相似&#xff0c;都可以用来浏览文字档案的内容&#xff0c;不同的是less命令允许用户向前或向后浏览文件&#xff0c;而more命令只能向前浏览。用less命令显示文件时&#xff0c;用PageUp键向上翻页&…...

试用cursor的简单的记录

快下班时又饿了&#xff0c;饿了几个小时了。中午那点饭&#xff0c;没够顶到下班。难怪店家说饭可以随便加。 所以不编码了&#xff0c;本周任务也超额完成了&#xff0c;这种状态再去编码调试&#xff0c;搞不好会写出自己不认识的代码。 本周工作中&#xff0c;新的事务是…...

下载Edge/Chrome浏览器主题的背景图片

当我们为Edge安装了心仪的主题后&#xff0c;希望把对应的背景图片下载保存要怎么做呢&#xff0c;以下图的“湖心小屋”主题为例。如下图&#xff0c;我们已经在应用商店中按照了该主题。 当打开新标签页后&#xff0c;可以欣赏这个主题内置的背景图片。 如果想要下载这个背景…...

Python解力扣算法题4(基础)

# 1.求斐波那契数列下标为n的数 &#xff08;从零开始&#xff09; # def fib(n): # if n < 2: # return n # # p, q, r 0, 0, 1 # for i in range(2, n 1): # p, q q, r # r p q # # return r#2. 和谐数组是指一个数组里元素…...

鸿蒙NEXT开发-网络管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

【LeetCode每日一题】——1413.逐步求和得到正数的最小值

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 1413.逐步求和得到正数的最小值 四【题目描述】…...

音频分割:长语音音频 分割为 短语音音频 - python 实现

在做语音任务时&#xff0c;有是会用到的语音音频是长音频&#xff0c;这就需要我们将长音频分割为短音频。 该示例将声音的音量和静默时间结合作为语音的分割条件。 使用音量和静默时间结合的分割条件&#xff0c;能够比较好的进行自然断句&#xff0c;不会话语没有说完就切断…...

【Echarts动态排序图,series使用背景色更新动画,背景底色不同步跟随柱子动画】大家有没有解决方案

echarts动态排序图背景色动画不同步 echarts试一试 series下面添加了showBackground属性&#xff0c;动画时底色背景不同步跟随柱图 showBackground: true, backgroundStyle: {borderRadius: 9,color: RGB(255,199,91, 0.2) }const data []; for (let i 0; i < 5; i) {d…...

FLINK SQL 元数据持久化扩展

Flink SQL元数据持久化扩展是一个复杂但重要的过程&#xff0c;它允许Flink作业在重启或失败后能够恢复状态&#xff0c;从而确保数据处理的连续性和准确性。以下是对Flink SQL元数据持久化扩展的详细分析&#xff1a; 一、元数据持久化的重要性 在Flink中&#xff0c;元数据…...

MySQL【知识改变命运】04

复习&#xff1a; 1&#xff1a;CURD 1.1Create &#xff08;创建&#xff09; 语法&#xff1a; insert [into] 表名 [column[,column]] valuse(value_list)[,vaule_list]... value_list:value,[value]...创建一个实例表&#xff1a; 1.1.1单⾏数据全列插⼊ values_l…...

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…...

无人机之位置信息计算篇

一、主要导航技术 卫星导航 全球定位系统&#xff08;GPS&#xff09;&#xff1a;无人机上装有专门的接收器&#xff0c;用于捕获GPS系统发射的无线电信号。当无人机接收到来自至少四颗卫星的信号时&#xff0c;通过计算信号抵达时间的微小差异&#xff0c;即可运用三角定位…...

安卓cpu知识

背景 目前的cpu都是多核的&#xff0c;为了有更好的能效&#xff0c;每个核的频率从低往高不等。市面上&#xff0c;大家根据频率不同&#xff0c;都叫大小核。既然分了大小核&#xff0c;那么多核心&#xff0c;就要有不同的cpu调度策略。所以cpu上的所有核&#xff0c;又会根…...

图书管理新纪元:Spring Boot进销存系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理图书进销存管理系统的相关信息成为必然。开…...

Application protocol

5 应用协议 在 TS 31.101 [11] 的对应条款中所述的要求适用于 USIM 应用。 在执行后续章节“USIM 安全相关程序”和“订阅相关程序”中的程序之前&#xff0c;必须执行“USIM 管理程序”中列出的程序。“USIM 安全相关程序”中列出的程序是强制性的。“订阅相关程序”中列出的程…...

金融信用评分卡建模项目:AI辅助

最近我一直忙着开发一个信用评分卡建模工具&#xff0c;所以没有时间更新示例或动态。今天&#xff0c;我很高兴地跟大家分享&#xff0c;这个工具的基本框架已经完成了&#xff0c;并且探索性的将大语言模型&#xff08;AI&#xff09;整合了进去。目前ai在工具中扮演智能助手…...

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前&#xff0c;OpenAI等GPT服务厂商主要提供HTTP接口&#xff0c;这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题&#xff0c;Spring团队推出了Spring AI &#xff0c;它提供了统一且标准化的接口来对接不同的AI服务提供商…...

微信小程序引入组件教程

1、安装 node.js 下载网址&#xff1a;https://nodejs.org 2.通过 npm 安装 npm init -y npm i vant/weapp -S --production 3、修改 app.json 将 app.json 中的 “style”: “v2” 去除 4、修改 project.config.json 关于修改 project.config.json 的详细内容&#x…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...