Language
cover_photo

2D 物理引擎初探

第一次使用 Matter.js 製作互動物理效果

Quick answer

2D 物理引擎初探:這篇筆記整理了我第一次使用 Matter.js 製作 2D 物理互動的經驗。和一般動畫不同,物理引擎的重點在於讓物件之間的碰撞、重力與約束關係自然發生。

審閱狀態:可審閱後發布

這篇筆記整理了我第一次使用 Matter.js 製作 2D 物理互動的經驗。和一般動畫不同,物理引擎的重點在於讓物件之間的碰撞、重力與約束關係自然發生。

Matter.js 提供了剛體、世界、引擎、渲染器與碰撞事件等基本模組。理解這些角色之後,就能把畫面上的物件轉換成具有物理行為的元素。

初學時最容易混淆的是畫面座標與物理世界之間的關係。你看到的是 canvas 上的圖形,但真正被計算的是物理引擎中的 body。

這類工具很適合做互動式首頁、小遊戲、展示頁或資料視覺化效果。只要控制好物件數量與更新頻率,就能在網頁中加入有趣的互動層次。

建議發佈前補上簡單 demo、Matter.js 初始化程式碼,以及常見參數如 restitution、friction、density 的效果比較。

相關素材

以下整理原文中的圖片、連結、程式碼與 MDX component,作為延伸閱讀與技術參考。

連結

  • https://editor.p5js.org/doremi31618/full/mnYf13X8l"

程式碼與設定片段

片段 1

<html>
  <head>
    <script src="matter.js"></script>
  </head>
  ...
</html>

片段 2

npm install matter-js

片段 3

var Engine = Matter.Engine,
    Runner = Matter.Runner,
    Bodies = Matter.Bodies,
    Composite = Matter.Composite;
    

// create an engine
var engine = Engine.create();

// create a renderer
//由於渲染的部分交給p5js所以這部分直接註解掉
/*
var Render = Matter.Render;
var render = Render.create({
    element: document.body,
    engine: engine
});
*/

片段 4

// create two boxes and a ground
var boxA = Bodies.rectangle(400, 200, 80, 80);
var boxB = Bodies.rectangle(450, 50, 80, 80);
var ground = Bodies.rectangle(400, 610, 810, 60, { isStatic: true });

// add all of the bodies to the world
Composite.add(engine.world, [boxA, boxB, ground]);

片段 5

const width=400, height=400
const mouseCollideRadius = 30;
// module aliases
var Engine = Matter.Engine,
    Runner = Matter.Runner,
    Bodies = Matter.Bodies,
    Composite = Matter.Composite;

// create an engine
var engine,boxA,boxB,ground;

function setup() {
  createCanvas(400, 400);
  engine = Engine.create();

  boxA = Bodies.rectangle(width/2, height/2, 80, 80);
  boxB = Bodies.rectangle(width/3, 50, 80, 80);
  ground = Bodies.rectangle(width, height, 810, 60, { isStatic: true });
  Composite.add(engine.world, [boxA, boxB, ground]);
  var runner = Runner.create();
  Runner.run(runner, engine);

}

function draw() {
  background(220);
  circle(mouseX, mouseY, mouseCollideRadius);
  rect(boxA.position.x, boxA.position.y, 80,80 );
  rect(boxB.position.x, boxA.position.y, 80,80 );
}

FAQ

這篇文章主要在介紹什麼?

這篇筆記整理了我第一次使用 Matter.js 製作 2D 物理互動的經驗。和一般動畫不同,物理引擎的重點在於讓物件之間的碰撞、重力與約束關係自然發生。

這篇文章適合誰閱讀?

適合想理解 2D 物理引擎初探 背後實作、設計取捨與學習脈絡的讀者。

Buy me a coffee