p5-matter を使って p5.js での物理演算エンジン（Matter.js）の利用を簡単化する【概要編】

今回の記事の内容は、以下の記事の最後に書いた「[p5-matter](http://palmerpaul.com/p5-matter/)」の話です。

●p5.js と物理演算エンジン「Matter.js」の組み合わせをお試し - Qiita
　https://qiita.com/youtoy/items/0b16f6fb3a1c76d64b68

前回の記事では、p5.js での描画処理に「物理演算エンジン Matter.js」を取り入れるという内容を、[CodingTrain のリポジトリ](https://github.com/CodingTrain/website)の中で公開されていたサンプルをベースにして進めました。
その際に、Matter.js の処理をいろいろ書く必要があったのですが、その処理を簡単化できる [p5-matter](http://palmerpaul.com/p5-matter/)というライブラリがあるらしいです。
（物理演算エンジンのお試しをあれこれやっている中、Twitter で「[@takawo さんが OpenProcessing で過去に公開された作品](https://openprocessing.org/sketch/1038378)」をツイートされているの見かけ、そこでロードされているライブラリの一覧を見ていた時に知りました）

そこで、今回は p5-matter の公式の情報を見ていきつつ、簡単なお試しをしてみようと思います。

## p5-matter の公式ページ関連
公式ページの情報をいろいろ見ていきたいところですが、まずは何か動くものを触れると楽しそうです。

### スターターテンプレートを試す
#### 中身を見てみる
公式ページを見ていくと、以下のように「Starter Template」という記載と、「[Download the Starter Template! というリンク](http://palmerpaul.com/p5-matter/p5-matter-template.zip)」がありました。
![スターターテンプレート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/172754eb-16b9-a0e0-1946-9462ee2d76cf.jpeg)

これをダウンロードして、中身を見てみます。
ファイルｎ中身の構成は、「index.html」・「sketch.js」・「3つのライブラリ」となっているようです。
![スターターテンプレートの中身.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/11481446-65af-abbd-2ba7-85bc24ebdc12.jpeg)

その中の「index.html」と「sketch.js」の中身を見てみます。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Starter Template | p5-matter</title>
  </head>
  <body>

    <script src="lib/p5.js/0.5.11/p5.min.js"></script>
    <script src="lib/matter.js/0.12.0/matter.min.js"></script>
    <script src="lib/p5-matter/1.1.0/p5-matter.min.js"></script>
    <script src="sketch.js"></script>
  </body>
</html>
```

```javascript
/* This is the start of a simple p5.js sketch using p5-matter.
 Use this as a template for creating your own sketches! */

var ball;
var floor;

function setup() {
  // put setup code here.
  createCanvas(600, 600);

  ball = matter.makeBall(width / 2, 40, 80);
  floor = matter.makeBarrier(width / 2, height, width, 50);
}

function draw() {
  // put the drawing code here
  background(0);

  fill(127);
  floor.show();

  fill(255);
  ball.show();
}
```

[前回の記事](https://qiita.com/youtoy/items/0b16f6fb3a1c76d64b68)で登場したプログラムは実行内容が上記とは違いますが、対応関係がとれそうな部分を見て比べると、今回の JavaScript のプログラムが圧倒的に短そうです。

#### オンライン環境（p5.js Web Editor）で動かしてみる
前回の記事と同様に、オンラインの開発・実行環境である [p5.js Web Editor](https://editor.p5js.org/) を使って、こちらを動かしてみます。

p5.js Web Editor のデフォルトの index.html をもとに、p5.sound.min.js を削除し、matter.min.js（現時点の最新版を CDN から読み込み）と p5-matter.min.js を追加しました。
p5-matter.min.js は CDN からは読み込めなそうだったので、ファイルをアップロードして、それを読むようにしています（※ バージョンは 1.1.0）。

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.17.1/matter.min.js"></script><!-- 追加 -->
    <script src="./p5-matter.min.js"></script><!-- 1.1.0 追加 -->

    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />

  </head>
  <body>
    <script src="sketch.js"></script>
  </body>
</html>
```

デフォルトの style.css は特に変更は加えていません。

そして、sketch.js の処理内容は以下としました。
少し makeBarrier の縦方向の位置をずらしたくらいで、全体的には元の内容ほぼそのままという感じです。

```javascript:sketch.js
let ball;
let floor;

function setup() {
  // put setup code here.
  createCanvas(640, 480);

  ball = matter.makeBall(width / 2, 40, 80);
  floor = matter.makeBarrier(width / 2, height-30, width, 50);
}

function draw() {
  // put the drawing code here
  background(0);

  fill(127);
  floor.show();

  fill(255);
  ball.show();
}
```

上記の内容で処理を実行すると、以下のような結果が得られます。
![スターターテンプレートをベースに使ったもの.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fa9574ba-a497-9321-933a-469102fd8ead.gif)

### 公式サンプルを見てみる
公式のページを見ていくと、公式サンプルが見られるリンクがいろいろ掲載されてました。
![公式サンプル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8d8ae6a4-f078-f34d-99b2-89d37f9c55a3.jpeg)

どれも興味深かったですが、個人的には特に以下が面白かったです。

- [Lattice](http://palmerpaul.com/p5-matter/examples/lattice)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">p5-matter（ <a href="https://t.co/lnBkXp5oN2">https://t.co/lnBkXp5oN2</a> ）の公式サンプルの中の「Lattice」、面白い！<br>⇒ マウス操作で動かせたりもする<br><br>物理演算エンジンを使うと、 <a href="https://twitter.com/hashtag/p5js?src=hash&amp;ref_src=twsrc%5Etfw">#p5js</a> の描画でこんなこともできてしまうのか！ <a href="https://t.co/sOyX6CXpDA">pic.twitter.com/sOyX6CXpDA</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1436325609387421705?ref_src=twsrc%5Etfw">September 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式ページに、Matter.js のカスタマイズ性をある程度制限して処理を簡単化、ということを書いていたように思いますが、p5-matter のサンプルを見る限りはいろいろと面白いことができそうです。

## まとめ
今回、物理演算エンジンの Matter.js を p5.js と組み合わせて利用する際に、その処理を簡単化できる p5-matter を軽く試してみました。
また、公式で公開されているサンプルを見てみたり、その中の 1つを紹介してみたりしました。

公式サンプルを見て、何が実現できるかという情報はある程度見たものの、細かな部分は確認できてないので以下の公式ドキュメントを読んでみたりしつつ、また何か作品に取り入れられればと思います。

●p5-matter 1.0.0 | Documentation
　http://palmerpaul.com/p5-matter/docs/

以下の仕組みとかに組み込むと、面白いことができたりしそうかな。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この前試した、 <a href="https://twitter.com/hashtag/p5js?src=hash&amp;ref_src=twsrc%5Etfw">#p5js</a> とリアルタイム通信（MQTT）の組み合わせで MacBook と iPad のそれぞれの画面間をつないだような処理をやった話の発展形！<br><br>今度は、スマホ 2台の画面をつないだのですが、その2つの画面のつながる方向が、動的に縦方向だったり横方向だったり、変化するような実装にしてみた！ <a href="https://t.co/WmCev0oBfx">pic.twitter.com/WmCev0oBfx</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1430905469149663240?ref_src=twsrc%5Etfw">August 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 【追記】 活用編1 の記事を書きました

●p5-matter を使って p5.js での物理演算エンジン（Matter.js）の利用を簡単化する【活用編1】 - Qiita
　https://qiita.com/youtoy/items/7fa6f6e6df2cf60133e6