gl.enchant.js で球同士の衝突プログラムを作ってみた

phiary に引っ越しました. 毎日プログラミングやWebに関する情報を発信しています! RSS 登録してたまに覗いたり, tweet やハテブして拡散してもらえると幸いです.

Pocket

前回書いたエントリー『JavaScript ライブラリ tmlib.js で円同士の衝突プログラムを作ってみた』の 3D バージョンを gl.enchant.js を使って作ってみました.

やっているのは, 前回同様

  • 球同士の衝突判定
  • めり込みの補正
  • 衝突後の反発

です.

ベクトル周りの処理は glMatrix.js にある vec3 でできるのですが, C言語っぽい使い方と最後の引数を省略すると動作が変わるという いかにもバグの温床になりそうな仕様に馴染めなかったので自作のベクトルクラス(TM.Geom.Vector3)を使用しています.

衝突関連の処理は単純に前作で TM.Geom.Vector2 を使っていた箇所を TM.Geom.Vector3 に変更しただけです.

トップページでサンプルを起動する前に球体の数やフィールドの大きさなどを指定できるようにしてあります. ぜひ遊んでみてください.

Sample and Download

今回制作したサンプルはこちら.

上記のトップページからサンプルへのリンクをクリックするか, パラメータ設定フォームで値をいじって Run を押してサンプルを起動してください.

フィールドのサイズ, 球体の数, 球体のサイズ, 物理パラメータの変更などが可能です. 十字キーでカメラ移動, 球をクリックするとランダムな方向に飛びます.

Donwload はこちらから出来ます.

Code

今回制作したサンプルの全体コードです. tmlib.js を使用して tm.geom.vector.js を動的にロードしているので, window.onload の代わりにスクリプトロード終了後に呼ばれる TM.main(…) を使用している点に注意してください.

/**
 * phi
 */

// おまじない
enchant();

// 動的に tm.????.js(tm.vector.js など)をロード
TM.loadScript("geom", "vector");
TM.loadScript("collision", "collision");

// 定数
var FRAME_RATE          = 60;           // フレームレート
var FIELD_SIZE          = 10;           // フィールドサイズ
var FIELD_SIZE_HALF     = FIELD_SIZE/2; // フィールドサイズの半分
var SPHERE_MAX_NUM      = 16;           // 球体の数
var SPHERE_SIZE         = 1;            // 球体のサイズ
var NINE_LEAP_TEXTURE   = null;         // 9leap テクスチャ用バッファ
var PHYSICS_PARAM       = {};           // パラメータ

// グローバル変数
var game                = null;
var collideSphereList   = [];


/**
 * リソース初期化
 * テクスチャの読み込みやパラメータの初期化など
 */
var initResource = function()
{
    // url からパラメータを取得する
    var params = {};
    var query  = document.location.search.substr(1).split('&');
    for (var i=0,len=query.length; i<len; ++i) {
        var param = query&#91;i&#93;;
        var pos = param.indexOf('=');
        if (pos>0) {
            var key   = param.substring(0, pos);
            var value = param.substring(pos+1);
            params[key] = value;
        }
    }
    
    // フィールドサイズをセット
    if (params["fieldSize"]) {
        FIELD_SIZE      = Number(params["fieldSize"]);
        FIELD_SIZE_HALF = FIELD_SIZE/2;
    }
    // 球体の数をセット
    if (params["sphereMaxNum"]) {
        SPHERE_MAX_NUM = Number(params["sphereMaxNum"]);
    }
    // 球体のサイズをセット
    if (params["sphereSize"]) {
        SPHERE_SIZE = Number(params["sphereSize"]);
    }
    
    // 物理パラメータをセット
    if (params["mode"] == "space") {
        // 宇宙バージョン
        PHYSICS_PARAM["BOUNCINESS"]    = 1.0;                       // 反発係数
        PHYSICS_PARAM["FRICTION"]      = 1.0;                       // 摩擦係数
        PHYSICS_PARAM["GRAVITY"]       = TM.Geom.Vector3(0, 0, 0);  // 重力
    }
    else {
        PHYSICS_PARAM["BOUNCINESS"]    = 0.8;                           // 反発係数
        PHYSICS_PARAM["FRICTION"]      = 0.99;                          // 摩擦係数
        PHYSICS_PARAM["GRAVITY"]       = TM.Geom.Vector3(0,-0.01, 0);   // 重力
    }
    
    // みなさんのローカル環境でも動くようにテクスチャは Data URI scheme で読み込んでおく
    NINE_LEAP_TEXTURE = new Texture("data:image/png;base64,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");
};

/**
 * ゲーム初期化
 */
var initGame = function()
{
    // シーン生成
    var scene = new Scene3D();
    scene.backgroundColor = "rgba(0, 0, 0, 1.0)";
    
    // ライト
    var light = new DirectionalLight();
    scene.setDirectionalLight(light);
    
    // カメラ
    var camera = new DebugCamera();
    camera.setDirectionFromAngle(15, 0);
    camera.distance = FIELD_SIZE*4;
    camera.centerX = camera.centerY = camera.centerZ = 0;
    scene.setCamera(camera);
    
    // 枠表示
    var cube = new Cube();
    cube.mesh.setBaseColor("#ffffff");
    cube.mesh.texture.ambient = [1.0, 1.0, 1.0, 1.0];
    cube.scale(FIELD_SIZE, FIELD_SIZE, FIELD_SIZE);
    cube.primType = gl.LINES;   // ライン描画に切り替えておく
    scene.addChild(cube);
    
    // 球体生成
    for (var i=0; i<SPHERE_MAX_NUM; ++i) {
        var ball = new CollideSphere(
            Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
            Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
            Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
            SPHERE_SIZE
        );
        collideSphereList.push(ball);
        game.currentScene3D.addChild( ball );
    }
    
    // デケェーの1個混ぜとく
    var bigBall = new CollideSphere(
        Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
        Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
        Math.random()*FIELD_SIZE-FIELD_SIZE_HALF,
        SPHERE_SIZE * 2
    );
    collideSphereList.push(bigBall);
    game.currentScene3D.addChild( bigBall );
    
    // 更新関数登録
    game.rootScene.addEventListener("enterframe", function(e) {
        camera.update(game.input);
    });
};


/**
 * 
 */
TM.main(function(){
    
    game = new Game(640, 640);
    //game = new Game(window.innerWidth, window.innerHeight);
    game.fps = FRAME_RATE;
    game.keybind(90, 'a');      // z
    game.keybind(88, 'b');      // x
    game.keybind(32, "space");  // space
    
    game.onload = function() {
        initResource();
        initGame();
    }
    
    game.start();
    
});


var CollideSphere = enchant.Class.create(enchant.gl.primitive.Sphere, {
    initialize: function(x, y, z, radius) {
        enchant.gl.primitive.Sphere.call(this);
        
        // 初期値設定
        TM.$V3.prototype.setFromNumber.call(this, x, y, z);
        this.v = TM.$V3.random(0, 360, 0, 360, 0.125);
        this.radius = radius || 1.0;
        this.m      = 4 * Math.PI * Math.pow(this.radius, 3) / 3;    // 体積 = 質量にしとく
        
        // 見た目調整
        this.mesh.texture = NINE_LEAP_TEXTURE;
        this.mesh.setBaseColor(&#91;1.0, 1.0, 1.0, 1.0&#93;);
        this.mesh.texture.ambient = &#91;0.5, 0.5, 0.5, 1.0&#93;;
        this.scale(this.radius, this.radius, this.radius);
    },
    
    onenterframe: function(e)
    {
        // 移動
        this.v.mul( PHYSICS_PARAM&#91;"FRICTION"&#93; );        // 摩擦
        this.v.add( PHYSICS_PARAM&#91;"GRAVITY"&#93; );         // 重力による移動量加算
        TM.$V3.prototype.add.call(this, this.v);// 移動
        
        // 衝突判定
        for (var i=0,len=collideSphereList.length; i<len; ++i) {
            var other = collideSphereList&#91;i&#93;;
            if (this != other &#038;&#038; TM.Collision.testSphereSphere(this, other)) {
                var e = new enchant.Event("collisionenter");
                e.other = other;
                this.dispatchEvent(e);
                break;
            }
        }
        
        // 枠補正
        var left    = FIELD_SIZE_HALF-this.radius;
        var right   =-FIELD_SIZE_HALF+this.radius;
        var top     = FIELD_SIZE_HALF-this.radius;
        var bottom  =-FIELD_SIZE_HALF+this.radius;
        var near    = FIELD_SIZE_HALF-this.radius;
        var far     =-FIELD_SIZE_HALF+this.radius;
        
        if (this.x > left)  { this.x = left;    this.v.x *= -1; }
        if (this.x < right) { this.x = right;   this.v.x *= -1; }
        if (this.y > top)   { this.y = top;     this.v.y *= -1; }
        if (this.y < bottom){ this.y = bottom;  this.v.y *= -1; }
        if (this.z > near)  { this.z = near;    this.v.z *= -1; }
        if (this.z < far)   { this.z = far;     this.v.z *= -1; }
    },
    
    oncollisionenter: function(evt)
    {
        var other = evt.other;
        
        var abVec = TM.Geom.Vector3.sub(other, this);
        var len = abVec.length();
        if (len == 0) return ;
        abVec.normalize();
        
        var distance = (this.radius + other.radius) - len;
        var sinkVec  = TM.Geom.Vector3.mul(abVec, distance/2);
        TM.$V3.prototype.sub.call(this, sinkVec);
        TM.$V3.prototype.add.call(other, sinkVec);
        
        var V = TM.Geom.Vector3;
        var m0 = this.m;
        var m1 = other.m;
        var e = PHYSICS_PARAM&#91;"BOUNCINESS"&#93;;
        
        var ma = ( (m1 / (m0+m1))*(1+e) ) * V.dot(V.sub(other.v, this.v), abVec);
        var mb = ( (m0 / (m0+m1))*(1+e) ) * V.dot(V.sub(this.v, other.v), abVec);
        this.v.add( V.mul(abVec, ma) );
        other.v.add( V.mul(abVec, mb) );
    },
    
    ontouchstart: function(e)
    {
        this.v = TM.$V3.random(0, 360, 0, 360, FIELD_SIZE * 0.1);
    }
});
&#91;/code&#93;</pre>
</section>

<section>
    <h2>Tips</h2>
    
    <section>
        <h3>enchant.js をちょっとイジって on~で登録したイベントの引数でもイベントオブジェクトを渡せるようにしよう</h3>
        <p>
            enchant.js でイベントを発行する機能を持つ enchant.EventTarget クラスは addEventListener でイベントを登録することができます.
        </p>
        <p>
            それとは別にメンバに onイベント名とすることでもイベントを登録することができます.
            このへんは, DOM の イベント登録処理にあわせて作られたのだと思います. 一個しかイベントを登録しない場合はこっちのほうがオススメです.
        </p>
        <p>
            がしかし, 問題が...
        </p>
        <p>
            onイベント名で登録した場合, 引数にイベントオブジェクトが渡されない仕様(バグ?)になっており, イベントオブジェクトが使えないのです.
        </p>
        <p>
            コードを見たところ dispatchEvent で on~をチェックし実行している箇所で e 変数を渡していなかったので下記のように修正しました.
        </p>
        <pre class="prettyprint">
if (this['on' + e.type] != null) this['on' + e.type]();
↓
if (this['on' + e.type] != null) this['on' + e.type](e);

gl.enchant.js をちょっとイジってライン描画をできるようにしよう

enchant.gl.Sprite3D のメンバに primType を追加して, 1454 行目あたりにある描画部分を下記のように変更することで描画タイプを指定できるようにしています.

gl.drawElements(gl.TRIANGLES, this.mesh.indices.length, gl.UNSIGNED_SHORT, 0);
↓
gl.drawElements(this.primType, this.mesh.indices.length, gl.UNSIGNED_SHORT, 0);

実際に使用しているのはこちら

// 枠表示
var cube = new Cube();
cube.mesh.setBaseColor("#ffffff");
cube.mesh.texture.ambient = [1.0, 1.0, 1.0, 1.0];
cube.scale(FIELD_SIZE, FIELD_SIZE, FIELD_SIZE);
cube.primType = gl.LINES;   // ライン描画に切り替えておく
scene.addChild(cube);

枠として使用しています.

衝突後にめり込み補正と反発ベクトルを計算しよう

このへんは前回のエントリーとほとんど同じです. 違いは TM.Geom.Vector2TM.Geom.Vector3 に変更しているぐらいです.

oncollisionenter: function(evt)
{
    var other = evt.other;
    
    var abVec = TM.Geom.Vector3.sub(other, this);
    var len = abVec.length();
    if (len == 0) return ;
    abVec.normalize();
    
    var distance = (this.radius + other.radius) - len;
    var sinkVec  = TM.Geom.Vector3.mul(abVec, distance/2);
    TM.$V3.prototype.sub.call(this, sinkVec);
    TM.$V3.prototype.add.call(other, sinkVec);
    
    var V = TM.Geom.Vector3;
    var m0 = this.m;
    var m1 = other.m;
    var e = PHYSICS_PARAM["BOUNCINESS"];
    
    var ma = ( (m1 / (m0+m1))*(1+e) ) * V.dot(V.sub(other.v, this.v), abVec);
    var mb = ( (m0 / (m0+m1))*(1+e) ) * V.dot(V.sub(this.v, other.v), abVec);
    this.v.add( V.mul(abVec, ma) );
    other.v.add( V.mul(abVec, mb) );
},

enchant.js で球同士が衝突した際に発行される独自定義イベントを作ろう

独自イベントの定義は enchant.EventTarget の dispatchEvent を使うことで実現できます. 下記のように衝突した際に dispatchEvent を呼び, 引数として new enchant.Event("collisionenter") を渡すことで collisionenter イベントが発行され, メンバの oncollisionenter もしくは addEventListener で collisionenter として追加したイベントが実行されます.

// 衝突判定
for (var i=0,len=collideSphereList.length; i
    

Reference

enchant.js 関連へのリンク

次回は, GGJ 開催時に参加できなかった悔しさを胸に, 家でちびちびと gl.enchant.js で3本ほどゲームを作ったので, そのへんの紹介, もしくは step 制作エントリーとして公開したいと思います.

TRACK BACK URL

POST COMMENT

メールアドレスが公開されることはありません。

COMMENT