当前位置: 首页 > 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…...

物联网与云技术赋能咖啡后处理:CeriTech 的实时监控系统实践

1. 项目概述&#xff1a;用物联网与云技术重塑咖啡后处理在印尼的咖啡农场里&#xff0c;传统的发酵与干燥过程很大程度上依赖“感觉”和“经验”。一位有经验的农人可能会用手触摸、用鼻子闻&#xff0c;或者根据天气和日照时间来估算发酵是否完成、干燥是否均匀。这种方法固然…...

Claude端到端测试设计:从零搭建可审计、可回放、可量化的AI服务测试流水线(含开源Schema校验工具)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Claude端到端测试设计 端到端测试是验证Claude模型在真实用户交互链路中行为一致性的关键手段。它覆盖从原始提示输入、上下文管理、流式响应生成&#xff0c;到输出解析与业务校验的全路径&#xff0c;确保模…...

Unity动态自然系统:Forest Environment-Dynamic Nature深度解析

1. 这不是“贴图堆砌”&#xff0c;而是自然系统级建模&#xff1a;Forest Environment-Dynamic Nature 的真实定位你有没有试过在Unity里拖进几棵树、铺点草、加个天空盒&#xff0c;然后发现场景像一张静止的风景明信片——风不动、叶不摇、雨不落、雾不散&#xff1f;我做过…...

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心

OmenSuperHub&#xff1a;释放惠普游戏本性能的纯净开源控制中心 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为官方…...

Arcmap实操:如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例

Arcmap实操&#xff1a;如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例 想象一下&#xff0c;医生通过CT扫描将人体内部结构分层呈现&#xff0c;而GIS中的"渔网"工具同样能对城市路网进行"切片式"分析。这种空间离散化技术&…...

Unity3D深度纹理实战:手把手教你实现可交互的激光雷达扫描特效(附完整C#/Shader代码)

Unity3D深度纹理实战&#xff1a;手把手教你实现可交互的激光雷达扫描特效&#xff08;附完整C#/Shader代码&#xff09;在科幻题材的游戏开发中&#xff0c;激光雷达扫描特效是营造科技感的经典元素。从《赛博朋克2077》的战术目镜到《看门狗》的环境扫描&#xff0c;这种动态…...

三步让小爱音箱秒变AI语音助手:MiGPT深度配置指南

三步让小爱音箱秒变AI语音助手&#xff1a;MiGPT深度配置指南 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 还在为小爱音箱的"人工智障&q…...

输电线路在线监测系统|架空线路安全运行的“第一道防线“!

输电线路微气象监测站是专为高压输电线路、电网廊道、杆塔运维量身打造的专利级一体化微气象智能监测设备。依托双专利超声波探测技术、六要素集成传感架构、无启动风速高精测量、智能抗干扰稳控系统&#xff0c;实现输电线路沿线气象24小时全自动捕捉、动态实时监测、大风风险…...

Jetson Orin上TVA模型DLA精准卸载配置

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

全方位梳理 OpenClaw 部署与使用干货

OpenClaw 一键安装包&#xff5c;可视化部署&#xff0c;简化环境配置流程 ✨适配系统&#xff1a;Windows10/11 64 位 当前版本&#xff1a;v2.7.5&#xff08;虾壳云版&#xff09; ✨核心优势&#xff1a;全程可视化操作&#xff0c;不用命令行、不用手动配置 Python/Node…...