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

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...