物理演算エンジン「Matter.js」を使ってみた(スマホも対応)

物理演算エンジン「Matter.js」を使ってみた(スマホも対応)

おじいちゃん

おじいちゃん

こんにちは、おじいちゃんです。

今回は物理演算エンジンであるMatter.jsをご紹介したいと思います。

Matter.jsとは

pic01

Matter.jsは、物理演算が必要なアニメーションやWebゲームなどを作りたいときに使えるJavaScriptライブラリです。スマートフォンにも対応しているとのこと、ありがたいですね。

下記サイトからダウンロードすることができます。

サイト内のDEMOでは、色々なサンプルがありパラメータも変更できるようになっているので触ってみてください。

ボールを落とす

それでは簡単なサンプルを作ってみましょう。

まずはボールが落ちるサンプルです。

(function () {
    //使用するメソッドを読み込む
    var Engine = Matter.Engine,
        Gui = Matter.Gui,
        World = Matter.World,
        Bodies = Matter.Bodies,
        Body = Matter.Body,
        Composite = Matter.Composite,
        Composites = Matter.Composites,
        Common = Matter.Common,
        Constraint = Matter.Constraint,
        RenderPixi = Matter.RenderPixi,
        Events = Matter.Events,
        Bounds = Matter.Bounds,
        Vector = Matter.Vector,
        Vertices = Matter.Vertices,
        MouseConstraint = Matter.MouseConstraint;

    var STARGE = {};

    var _engine,
        _gui;

    //初期化
    STARGE.init = function () {

        //描画するDOMを取得
        var container = document.getElementById('stage');

        var options = {
            positionIterations: 6,
            velocityIterations: 4,
            enableSleeping: false
        };

        //描画域を作成(描画したいDOM,オプションを読み込む)
        _engine = Engine.create(container, options);

        //実行
        Engine.run(_engine);

        STARGE.ballSample();
    };

    //ページの読み込みが終わったらSTARGE.initを実行
    if (window.addEventListener) {
        window.addEventListener('load', STARGE.init);
    } else if (window.attachEvent) {
        window.attachEvent('load', STARGE.init);
    }

    STARGE.ballSample = function () {
        var _world = _engine.world;

        STARGE.reset();

        //circle(x座標,y座標,大きさ,オプション)
        var ball = Bodies.circle(530, 100, 50, {render: {fillStyle: '#d04030'}
        });

        //World.add(追加)
        World.add(_world, [ball]);
    };
    
    //描画域の設定
    STARGE.reset = function () {

        var _world = _engine.world;

        //描画クリア
        World.clear(_world);
        Engine.clear(_engine);

        //重力値
        _engine.world.gravity.y = 1;

        var offset = 0;

        //矩形で枠線を作る(rectangle(x座標,y座標,横幅,縦幅,option))
        World.add(_world, [
            Bodies.rectangle(400, 0, 800, 1, {isStatic: true}),
            Bodies.rectangle(800, 300, 1, 600, {isStatic: true}),
            Bodies.rectangle(0, 0, 1, 600, {isStatic: true}),
            Bodies.rectangle(400, 600, 800, 1, {isStatic: true})
        ]);
        //renderのオプション(各種renderのオプション)
        var renderOptions = _engine.render.options;
        renderOptions.wireframes = false;
    };
})();

rakka

生成した描画域内でボールが落ちましたね。

このようにオブジェクトを配置するだけで、物理演算を利用したアニメーションを実装することができます。

オプションや機能などはドキュメントにまとめられています。

今回はいくつかわかりやすい機能だけご紹介します。

ボールを固定する

さきほどはボールを生成しただけで落ちていきました。今度はボールを固定してみましょう。

circleのオプションにあるisStaticをtrueをすることで、固定することができます。

var ball = Bodies.circle(375, 100, 50, {
            //固定するかをtrueかfalseで変更
            isStatic: true,
            render: {
                lineWidth: 1,
                strokeStyle: '#d04030',
                fillStyle: '#d04030'
            }
        });

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

おじいちゃん
おじいちゃん フロントエンドエンジニア / 後藤 寛一

フロントエンドエンジニアのおじいちゃんと言います。本当は24歳です。よろしくお願いします。

このメンバーの記事をもっと読む
使ってみた | 45 articles
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL