Twitterで仲良くなったスダさんという方を題材に、この1年間 #今日のスダクリエイト というハッシュタグで趣味のコンテンツを作ってきました。自分が書きたいプログラムを定期的に書くことで、業務で扱う以外の技術の勘が鈍らなくなり、作ることの喜びやモチベーションが向上し続けました。
本記事では、ES2015+、TypeScript、SVG、WebGLなどを使ったインタラクションをピックアップし、その技術的な工夫点とともに紹介します。
SVG、fetch APIで泡アニメーション
SVGの線や塗りなどの形状をJavaScriptでコントロールしようとするとSVGのインライン展開が必要ですが、HTMLのコード量が増えてしまいます。HTML内にSVGコードは書かず、Fetch APIを用いてリソースをダウンロードしてパースし、CSSアニメーションを加えたデモです。
- [デモURL](http://jsdo.it/tonkotsuboy/q1qt/fullscreen) - [ソースコード](https://github.com/tonkotsuboy/testCodes/tree/feature/svgtest/170430_svg/svg5-suda-rainbow)XHRに代わるリソース取得API「Fetch」を用いてSVGファイルをDL。テキストとして取得することで、SVGコードをインラインに展開。
— Takeshi Kano 鹿野 壮 (@tonkotsuboy_com) April 30, 2017
結果的にSVGファイルのpath属性をCSS3により操作可能になる。https://t.co/dNuHTb5EQb#javascript pic.twitter.com/bAOy3gGiEx
SVGを表示するHTMLコードは次のように、空のdiv
タグです。
<div id="container">
</div>
JavaScript(TypeScript)を用いてSVGコードをダウンロードしています。
fetch("./images/suda.svg").then((response) => {
return response.text();
});
素材の変更もすぐに可能です。
"Suda in your Dream"https://t.co/lBaNq8BnD6
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年10月14日
material : .@fabrec_jp
technology : SVG, Fetch API, TypeScript#今日のスダクリエイト pic.twitter.com/3SzY3MgUSV
SVGとCSSでTwitterのいいね風アニメーション
SVGとCSSアニメーションでTwitterのいいね風アニメーションを作成しました。レイアウトにはCSS Gridを用いています。
ものすごくいいねしたくなったので作りました。
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年9月22日
URLhttps://t.co/0ZdkKOcIbn
ソース(SVG, CSS Grid, ES 2017)https://t.co/ltfS2KEE0H#JavaScript #SVG pic.twitter.com/HMyXuZG3y7
ハート部分を「スダさん」のSVG要素に変更し、叫び声と共に爆発していくインタラクションを作りました。
泣き声とエフェクトを更新。
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年9月26日
URLhttps://t.co/YAk2spWtBd
JavaScripthttps://t.co/CGZIveXCku#今日のスダクリエイト pic.twitter.com/vIsTNExIKD
SVG要素をパスに沿って移動する
SVG要素をパスに沿って移動させるインタラクションです。注射器を押す度に注入されるSVG要素「スダさん」が、大きなパスに沿って移動します。
SVGのパスアニメーション「Suda Injection」 を作りました。
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年5月30日
※ 押すと増えますhttps://t.co/iioliftxqc#SVG #今日のスダクリエイト pic.twitter.com/4lKjBoHsdd
移動経路となるパスは次のように定義しています。
<path id="linePath" fill="none"
d="M311,159h-1s-3-10-4-17l-2-12c-2-7-6-23-12-35s-4-5-6-6l-4-3c-3-3-5-9-7-13V71c-6-14-19-23-30-30h-1c-6-4-12-7-18-9h-5c-4,0-6-1-10-4L184,7(中略)"/>
SVG時計
JavaScriptによるSVG要素の操作説明のために作った時計です。
「SVG Clock ~大きなのっぽのスダ時計~」を作りました。
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年5月19日
https://t.co/KzcVzgsq1R#SVG #TypeScript #今日のスダクリエイト pic.twitter.com/ZWsr28lWbb
TypeScriptとCreateJSでパーティクル表現
HTML5 Canvasのフレームワーク「CreateJS」を用いたパーティクル表現です。パーティクル発生時にマウスの加速度を加味しているので、マウスを早く動かすとパーティクルがより遠くに飛んでいきます。
「スダマリ」
— 鹿野壮@ICS (@tonkotsuboy_com) 2017年4月28日
こちらから試せます。https://t.co/uiLek5YBgg#今日のスダクリエイト #createjs #HTML5 pic.twitter.com/PtJKM6ebl9
パーティクル発生座標とマウス加速度を算出している部分は次のとおり。
/**
* MainLayerのtickイベント毎に実行される処理
*/
public update(goalX: number, goalY: number) {
// 発生装置はgoalに徐々に近づいていく。
let dx: number = goalX - this._emitX;
let dy: number = goalY - this._emitY;
let d: number = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); // 斜め方向の移動距離
let rad: number = Math.atan2(dy, dx); // 移動角度
this._vx = Math.cos(rad) * d * 0.1; // 速度の更新
this._vy = Math.sin(rad) * d * 0.1; // 速度の更新
this._emitX += this._vx;
this._emitY += this._vy;
// アニメーション中のパーティクルの状態を更新
this.updateParticleList();
}
WebGL(three.js)
Twitterで仲良くなった@RR2arazさんが、練習のために作ったWebGL(three.js)の3Dコンテンツ。
鹿野先生( @tonkotsuboy_com )にプルリクエストしたやつをマージしてもらったので、GitHub Pagesに反映されました。便利!
— 唐揚げになったたかはし (@RR2araz) 2017年7月3日
おかげさまで大変勉強になりました。すだころがしです。#今日のスダクリエイトhttps://t.co/DzeNuXOM9X
面白そうな素材だったので、回転率とクレイジーさをアップしました。ES2015+で記述しています。
スダさんでコンテンツを作るのは楽しい
#今日のスダクリエイトで作るコンテンツは、仕事もお金も関係のない完全に趣味のもの。しかし、「この表現はどうするんだろう?」「この技術はどう使うのかな?」と試行錯誤することで、創作の喜びに満たされていきました。引き続き、趣味の「スダさん」を作っていこうと思います。