2Dアニメーションライブラリtwo.jsの基本的な使い方

2Dアニメーションライブラリtwo.jsの基本的な使い方:


Two.jsとは

Webブラウザ上の2Dアニメーションライブラリ.

two.js.org


特徴

  • モダンブラウザ向け(対応バージョン不明)
  • jQueryと共存可能
  • 同じAPIでSVG,Canvas,WebGLを使い分けられる

    • SVG

      • デフォルト
      • パフォーマンスはあまり良くない
      • 描画する内容がHTML要素として生成されるので描画結果をJavaScriptで扱うには向いている
    • Canvas

      • パフォーマンスはまあまあ良い
      • 描画する内容はHTML要素として生成されず一枚の絵として描画される
    • WebGL

      • パフォーマンスは良い
      • 描画する内容はHTML要素として生成されず一枚の絵として描画される
      • ただし拡大縮小が苦手
    • ドキュメントが少なく公式ドキュメントとexampleコードの読解がメイン

      • 日本語ドキュメントはほぼ無い
      • とはいえTwo.js自体で複雑な事はあまりやらない
      • 少し複雑になことをやろうとするとSVG,Canvas,WebGLを知ることになる


とりあえず使ってみる


始め方

  • two.jsをダウンロード
  • HTMLファイルを用意
  • サンプルコードを記述
  • HTMLファイルを開く


two.jsをダウンロード

公式のdownloadからtwo.jsファイルをダウンロード。

とりあえずDevelopment Versionから落とす。


HTMLファイルを用意

  • two.jsを読み込む
  • bodyに描画エリアのdivを用意する(idは任意)
<html> 
<head> 
    <script type="JavaScrpt" src="./two.js"></script> 
</head> 
<body> 
<div id="draw-shapes"> 
</div> 
</body> 
</html> 


サンプルコードを記述

公式のサンプルコードをbody内の一番下に記述

<html> 
 
<head> 
    <script src="./two.js"></script> 
</head> 
 
<body> 
    <div id="draw-shapes"> 
    </div> 
    <script> 
        // Make an instance of two and place it on the page. 
        var elem = document.getElementById('draw-shapes'); 
        var params = { width: 285, height: 200 }; 
        var two = new Two(params).appendTo(elem); 
 
        // two has convenience methods to create shapes. 
        var circle = two.makeCircle(72, 100, 50); 
        var rect = two.makeRectangle(213, 100, 100, 100); 
 
        // The object returned has many stylable properties: 
        circle.fill = '#FF8000'; 
        circle.stroke = 'orangered'; // Accepts all valid css color 
        circle.linewidth = 5; 
 
        rect.fill = 'rgb(0, 200, 255)'; 
        rect.opacity = 0.75; 
        rect.noStroke(); 
 
        // Don't forget to tell two to render everything 
        // to the screen 
        two.update(); 
    </script> 
</body> 
 
</html> 


HTMLファイルを開く

実行結果


sc001.png



基本的な使い方

描画するHTML要素を取得する

var elem = document.getElementById('draw-shapes'); 
Twoインスタンスを生成する

// 描画エリアのサイズを指定 
var params = { width: 285, height: 200 }; 
//Twoクラスのインスタンスを生成 
var two = new Two(params).appendTo(elem); 
描画したい要素を作成する

// 円を作成する 
// 第一引数:X座標。画面の左上を0として右に行くほど大きくなる 
// 第二引数:y座標。画面の左上を0として下に行くほど大きくなる 
// 第三引数:円の直径 
// この場合、座標(x,y)が(72,100)の位置に直径50の円を描いている 
var circle = two.makeCircle(72, 100, 50); 
作成した要素に設定をする

circle.fill = '#FF8000';      // 塗りつぶす色(CSSと同じ色指定方法) 
circle.stroke = 'orangered';  // フチの色CSSと同じ色指定方法) 
circle.linewidth = 5;         // フチの幅 
描画する

// 画面を更新するには必ず実行する。実行しないと実際に表示がされない。 
two.update(); 


アニメーションさせてみる

公式のサンプルコードを動かしてみる

<html> 
 
<head> 
    <script src="./two.js"></script> 
</head> 
 
<body> 
    <div id="draw-shapes"> 
    </div> 
    <script> 
        var elem = document.getElementById('draw-animation'); 
        var two = new Two({ width: 285, height: 200 }).appendTo(elem); 
 
        var circle = two.makeCircle(-70, 0, 50); 
        var rect = two.makeRectangle(70, 0, 100, 100); 
        circle.fill = '#FF8000'; 
        rect.fill = 'rgba(0, 200, 255, 0.75)'; 
 
        var group = two.makeGroup(circle, rect); 
        group.translation.set(two.width / 2, two.height / 2); 
        group.scale = 0; 
        group.noStroke(); 
 
        // Bind a function to scale and rotate the group 
        // to the animation loop. 
        two.bind('update', function (frameCount) { 
            // This code is called everytime two.update() is called. 
            // Effectively 60 times per second. 
            if (group.scale > 0.9999) { 
                group.scale = group.rotation = 0; 
            } 
            var t = (1 - group.scale) * 0.125; 
            group.scale += t; 
            group.rotation += t * 4 * Math.PI; 
        }).play();  // Finally, start the animation loop    </script> 
</body> 
 
</html> 
実行結果


two.js001.gif



解説


group

// 座標(-70,0)を中心とした円を作成 
var circle = two.makeCircle(-70, 0, 50); 
// 座標(70,0)を中心とした縦100横100の四角を作成 
var rect = two.makeRectangle(70, 0, 100, 100); 
ここで、circleは(-70,0)とブラウザの表示外の位置をしているしrectは(70,0)と四角の下半分が隠れる位置を指定しているが、この意味は次のコードで分かる。

// 複数の要素を束ねるグループを作成 
var group = two.makeGroup(circle, rect); 
 
// translation.set(x,y)で位置を指定 
// この場合twoオブジェクトの描画エリアの中央を指定 
group.translation.set(two.width / 2, two.height / 2); 
// scaleは1が元の大きさを表す。0〜1の値を取る 
// 0ならば大きさは0になる 
group.scale = 0; 
group.noStroke(); 
2つの要素をgroupという変数で1つのグループに束ねている。

circleとrectの位置は、groupの中心座標からの相対値を表すことになる。

実際の値で言うと

  • groupの座標

    • (142.5, 100)

  • circleの座標



    • (142.5, 100)から(-70,0)だけ移動 = (72.5,100)

  • rectの座標



    • (142.5, 100)から(-70,0)だけ移動 = (242.5,100)
に配置されることになる。


アニメーション部分

twoオブジェクトのupdateメソッドに任意の関数をbindし(割り当て)

two.play(); 
することでupdate()を60fpsで無限ループとして呼び出す。必要ならば当然何らかの方法で終了処理を行わなければならない。このサンプルコードの場合は割り当てと同時にアニメーションを実行し、止まることなくアニメーションを繰り返すコードになる。

two.bind('update', function (frameCount) { 
    // group.scaleが1より大きかったらアニメーションを初期状態に戻す 
    if (group.scale > 0.9999) { 
        group.scale = group.rotation = 0; 
    } 
    // 1コマごとにちょっとずつgroup.scaleの値を増やして大きさを大きくする 
    var t = (1 - group.scale) * 0.125; 
    group.scale += t; 
 
    // 1コマごとにちょっとずつgroup.rotationの値を増やして回転させる 
    // rotationに指定する数値の単位はラジアン。 
    group.rotation += t * 4 * Math.PI; 
}).play(); 


アニメーションの止め方

two.pause(); 
で止まる。

今回はここまで。使ってみて実際に詰まった所は次以降に書く。


参考

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)