【科学技術計算講座5-3】p5.jsでアニメーション

前回はJavaScriptでHello Worldのプログラミングを行ってみました。

JavaScriptでHello Worldプログラムを実行してみます。JavaScriptはブラウザで簡単に実行できます。科学技術計算講座5「粒子法(SPH法)で流体シミュレーション」の第2回目です。

今回はp5.jsというJavaScriptライブラリでデータのアニメーションを表示してみたいと思います。

p5.jsとは

p5.jsとはデータの可視化やアニメーションなど、描画用のJavaScriptライブラリです。p5.jsを使うことによって、最初の回でお見せしたようなデータのアニメーションを簡単にブラウザ上に表示することができます。

p5.jsで可視化してみる

では早速p5.jsで可視化を行ってみましょう。

p5.jsのダウンロード

p5.jsもJavaScriptで書かれたプログラムです。まずはこれをダウンロードするために、以下のp5.jsの公式サイトにアクセスします。

p5.jsの公式サイト

p5.jsのページ

ページの左にある「Download」をクリックしてダウンロードページを開きます。

p5.jsダウンロードページ

ダウンロードページの下の方にある「p5.min.js」をクリックするとファイルがダウンロードされます。

このp5.min.jsというファイルは、p5.jsのプログラムが書かれたファイルを圧縮したものです。コメントや空白など不要なものはすべて消されているので、容量が小さくなっています。

※となりのp5.jsをダウンロードしても構いません。こちらは圧縮する前のプログラムです。

JavaScriptプログラムの作成

ではp5.jsで可視化するために、簡単なJavaScriptプログラムを作りましょう。次のプログラムをball.jsというファイル名で作成してください。

function setup() {
  createCanvas(800, 400);
}

function draw() {
  background(220);
  ellipse(100, 200, 20);
}

最初のsetup()という関数は、p5.jsで初期化のために最初に呼ばれる関数です。createCanvas(x, y)は、xピクセル、yピクセルの大きさの描画領域(キャンバス)を作成するという命令です。

次のdraw()関数は、p5.jsで描画するために呼ばれる関数です。background()は、背景を指定した色で塗るという命令です。220は色コードで灰色のような色を表します。

最後のellipse(x, y, d)は、x, y の位置に直径dピクセルの円を描きます。

※位置x, y は、キャンバスの左上角を原点にした位置です。

このプログラムを実行するために、前回と同じようにindex.htmlを作ります。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Ball</title>
  </head>

  <body>
    <script type="text/javascript" src="p5.min.js"></script>
    <script type="text/javascript" src="ball.js"></script>
  </body>
</html>

前回と違うのは、<script>タグを一つ増やして、p5.min.jsを読んでいる箇所です。これで、2つのJavaScriptプログラムを読み込みます。

※各ファイルの場所に注意してください。上記の場合だと、index.htmlと同じフォルダにp5.min.js、ball.jsがあります。

プログラムの実行

では、index.htmlをブラウザで開いてみてください。

p5.jsの描画

灰色のキャンバスに円が描かれました。

アニメーションのプログラム

これだけだと面白くないので、ボールを動かしてみましょう。ball.jsを次のように書き換えます。

let x, y;
let dx, dy;

function setup() {
  createCanvas(800, 400);
  
  x = 0;
  y = 0;
  dx = 1;
  dy = 2;
}

function draw() {
  background(220);
  x += dx;
  y += dy;
  ellipse(x, y, 20);
}

x, yを座標の変数、dx, dyを座標増分の変数として宣言します。setup()内でそれぞれの変数の初期値を指定しています。

※ JavaScriptでは代入可能な変数は let で宣言します。

そして、draw()内で、x, y 座標をdx, dyで増やしてやり、円を描きます。

これを実行してみてください。

p5jsボールアニメ

左上の原点から円が移動していくアニメーションが表示されましたね。

draw()という関数内にはforループなどの処理は書いていませんが、円の位置はどんどん変化していきます。p5.jsではdraw()関数は、1秒間に60回繰り返し呼ばれる仕様になっています。そのため、draw内で位置座標を更新するだけでアニメーションができてしまいます。drawは繰り返し呼ばれる関数なので、「背景を塗りつぶして、円を描く」が繰り返されており、円が動いているように見えるのです。

円が跳ね返るアニメーション

先程のプログラムだと円が一方向にしか動かないので、領域の外に出てしまいます。そこで、ball.jsを次のように書き換えてみましょう。

let x, y;
let dx, dy;

function setup() {
  createCanvas(800, 400);
  
  x = 0;
  y = 0;
  dx = 1;
  dy = 2;
}

function draw() {
  background(220);
  x += dx;
  y += dy;
  ellipse(x, y, 20);

  if (x < 0 || x > 800) {
    dx *= -1;
  } 
  if (y < 0 || y > 400) {
    dy *= -1;
  } 
}

draw関数の最後にif文を追加しました。円のx, y座標がキャンバス領域から外れると、増分値に-1をかけています。つまり、増分値を反転させています。これで、実行してみます。

p5.js円アニメ跳ね返り

円が領域の端で跳ね返るアニメーションが出来上がりました。跳ね返りの挙動を何かで制御するようにすれば、簡単なゲームでも作れそうです。

まとめ

p5.jsを使ってアニメーションを表示するプログラムを作りました。これをたくさんの粒子について表示すればSPH法の粒子のアニメが作れます。

次回は、もう少しJavaScriptのプログラミングについてお話しておきたいと思います。


←前回 JavaScriptでHello World!!
→次回 JavaScriptでオブジェクト指向プログラミング

全体の目次

スポンサーリンク
科学技術計算のご相談は「キャットテックラボ」へ

科学技術計算やCAEに関するご相談、計算用プログラムの開発などお困りのことは「株式会社キャットテックラボ」へお問い合わせください。

お問い合わせはこちら

フォローする