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

s2-pro部署教程:Caddy反向代理+自动HTTPS+访问日志审计配置

s2-pro部署教程&#xff1a;Caddy反向代理自动HTTPS访问日志审计配置 1. 环境准备与快速部署 在开始部署s2-pro语音合成服务前&#xff0c;请确保您的服务器满足以下基本要求&#xff1a; 操作系统&#xff1a;Ubuntu 20.04/22.04 LTS&#xff08;推荐&#xff09;硬件配置&…...

智能运维避坑指南:高压断路器机器学习诊断中的5大常见数据陷阱

智能运维避坑指南&#xff1a;高压断路器机器学习诊断中的5大常见数据陷阱 在电力系统智能运维的浪潮中&#xff0c;高压断路器作为电网的"安全卫士"&#xff0c;其故障诊断的准确性与及时性直接关系到整个电网的稳定运行。随着机器学习技术在工业领域的深入应用&…...

OpenGL插值曲线实战:从二次到四次的参数化绘制与矩阵求解

1. 为什么我们需要插值曲线&#xff1f; 在图形学和动画制作中&#xff0c;我们经常需要创建平滑的过渡效果。想象一下你在设计一个游戏角色移动的轨迹&#xff0c;或者制作一个UI元素的动画效果&#xff0c;直接使用折线会显得非常生硬。这时候插值曲线就派上用场了。 插值曲线…...

SOONet模型ComfyUI工作流集成:可视化节点式长视频分析

SOONet模型ComfyUI工作流集成&#xff1a;可视化节点式长视频分析 你是不是也遇到过这样的烦恼&#xff1f;手里有一段长达几小时的会议录像、教学视频或者监控素材&#xff0c;想快速找到“讨论预算的片段”或者“老师讲解例题的部分”。一帧一帧地看&#xff1f;太费时费力。…...

大模型应用开发:从环境搭建到项目部署完整流程

大模型应用开发&#xff1a;从环境搭建到项目部署完整流程 标签&#xff1a;#人工智能、#大模型、#自然语言处理、#大模型开发、#智能体开发、#agent开发、#AI 系统封装学习规划&#xff08;从玩具到产品&#xff09; 打包成Docker&#xff1a;写一个Dockerfile&#xff08;我手…...

Hunyuan模型支持蒙古语吗?少数民族语言翻译案例

Hunyuan模型支持蒙古语吗&#xff1f;少数民族语言翻译案例 1. 引言 随着全球化进程的加速&#xff0c;语言多样性保护和文化交流变得愈发重要。对于蒙古族同胞、语言学研究者和跨文化交流工作者来说&#xff0c;一个关键问题常常被提及&#xff1a;当前主流的大语言模型是否…...

OpenClaw新手避坑指南:Qwen3.5-9B对接常见问题解决方案

OpenClaw新手避坑指南&#xff1a;Qwen3.5-9B对接常见问题解决方案 1. 为什么需要这份指南 上周我在本地部署OpenClaw对接Qwen3.5-9B模型时&#xff0c;连续踩了五个坑。从安装报错到模型连接超时&#xff0c;每个问题都消耗了我至少两小时的排查时间。这种经历让我意识到&am…...

Qwen3-VL-8B在.NET生态中的集成:开发C#桌面端图像分析应用

Qwen3-VL-8B在.NET生态中的集成&#xff1a;开发C#桌面端图像分析应用 最近在帮一个做电商的朋友处理商品图片&#xff0c;他每天要手动整理上百张图片的信息&#xff0c;比如识别商品类别、提取价格标签、统计库存表格&#xff0c;忙得焦头烂额。我就在想&#xff0c;能不能用…...

Qwen-Image-Edit-2511局部重绘教程:精准修改图片任何区域

Qwen-Image-Edit-2511局部重绘教程&#xff1a;精准修改图片任何区域 你是否遇到过这样的困扰&#xff1a;一张近乎完美的图片&#xff0c;只有某个小细节需要修改&#xff0c;但传统修图工具要么操作复杂&#xff0c;要么修改后痕迹明显&#xff1f;Qwen-Image-Edit-2511的局…...

如何用Synonyms实现智能问答系统:面向初学者的完整指南

如何用Synonyms实现智能问答系统&#xff1a;面向初学者的完整指南 【免费下载链接】Synonyms :herb: 中文近义词&#xff1a;聊天机器人&#xff0c;智能问答工具包 项目地址: https://gitcode.com/gh_mirrors/sy/Synonyms Synonyms是一个强大的中文近义词工具包&#…...