2Dアニメーションライブラリtwo.jsの基本的な使い方
2Dアニメーションライブラリtwo.jsの基本的な使い方:
Webブラウザ上の2Dアニメーションライブラリ.
two.js.org
公式のdownloadからtwo.jsファイルをダウンロード。
とりあえずDevelopment Versionから落とす。
公式のサンプルコードをbody内の一番下に記述
実行結果
描画するHTML要素を取得する
Twoインスタンスを生成する
描画したい要素を作成する
作成した要素に設定をする
描画する
公式のサンプルコードを動かしてみる
実行結果
ここで、circleは(-70,0)とブラウザの表示外の位置をしているしrectは(70,0)と四角の下半分が隠れる位置を指定しているが、この意味は次のコードで分かる。
2つの要素をgroupという変数で1つのグループに束ねている。
circleとrectの位置は、groupの中心座標からの相対値を表すことになる。
実際の値で言うと
twoオブジェクトのupdateメソッドに任意の関数をbindし(割り当て)
することでupdate()を60fpsで無限ループとして呼び出す。必要ならば当然何らかの方法で終了処理を行わなければならない。このサンプルコードの場合は割り当てと同時にアニメーションを実行し、止まることなくアニメーションを繰り返すコードになる。
で止まる。
今回はここまで。使ってみて実際に詰まった所は次以降に書く。
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を知ることになる
- SVG
とりあえず使ってみる
始め方
- 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ファイルを開く
実行結果
基本的な使い方
描画するHTML要素を取得するvar elem = document.getElementById('draw-shapes');
// 描画エリアのサイズを指定
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>
解説
group
// 座標(-70,0)を中心とした円を作成 var circle = two.makeCircle(-70, 0, 50); // 座標(70,0)を中心とした縦100横100の四角を作成 var rect = two.makeRectangle(70, 0, 100, 100);
// 複数の要素を束ねるグループを作成 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();
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();
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();
今回はここまで。使ってみて実際に詰まった所は次以降に書く。
コメント
コメントを投稿