<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>WebGL &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/webgl/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>WebGLの現状と未来を、Grimoire.jsを生んだスーパークリエータに聞いてきた！</title>
		<link>/shumpei-shiraishi/24589/</link>
		<pubDate>Thu, 02 Nov 2017 01:00:22 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Grimoire.js]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">/?p=24589</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (12)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (12)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、東京理科大学4年の石井翔さんです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5128.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-24605" srcset="/wp-content/uploads/2017/10/42A5128.jpg 640w, /wp-content/uploads/2017/10/42A5128-300x193.jpg 300w, /wp-content/uploads/2017/10/42A5128-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>石井さんのセッション「WebGLの今とこれから ~今のWeb開発で使うからこそ知っておきたい周辺技術~」に関するスライド資料は、こちらで公開されています。</p>

<p><a href="http://html5.grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スライド資料</a>
（注: 重いのとモバイルから見えないのはご容赦ください by 石井翔さん）</p>

<h2>WebGLの現状</h2>

<p><b class="speaker siraisi">白石:</b> 本日は取材をお受けいただいてありがとうございます！簡単に自己紹介をお願いします。</p>

<p><b class="speaker isii">石井:</b> 東京理科大学4年生の石井 翔です。昨年、私が進めている<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>（注: モバイルからだと多少レイアウトが崩れます by 石井翔さん）というプロジェクトが<a href="https://www.ipa.go.jp/jinzai/mitou/2016/20170530.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">未踏IT人材発掘・育成事業に採択され</a>、スーパークリエータに認定されました。</p>

<p><b class="speaker siraisi">白石:</b> Grimoire.jsはWebGLのライブラリですね。Grimoire.jsについてもあとでお聞かせ願いたいのですが、まずはWebGLの概要や現状についてお話いただけますか？</p>

<p><b class="speaker isii">石井:</b> WebGLは、一言で言えばWeb上で3Dコンテンツを扱うための技術です。2010年に仕様が策定されており、既に多くのブラウザで実装されている技術です。ブラウザ上でどの技術が使えるかを測定する<a href="https://caniuse.com/#feat=webgl" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Can I Use</a>での結果を見ても、92%以上のブラウザがサポートしていて、広く使える状態にあると言っていいでしょう。</p>

<p>ただこれは、WebGL 1.0の話です。<a href="https://caniuse.com/#feat=webgl2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 2.0はまだまだ</a>ですね。ChromeとFirefoxだけが対応しているという状態で、特にiOSで使えないのが厳しいです。「ブラウザを限定すれば使える」という状態です。</p>

<p><b class="speaker siraisi">白石:</b> WebGL 1.0と2.0って何が違うんですか？…ぼく、3Dプログラミングが全然わかってないので、理解できるか自信がないのですが(笑)</p>

<p><b class="speaker isii">石井:</b> 浮動小数点テクスチャなどがWebGL 2.0の主な機能ですが、3Dプログラミングの知識がない人に向けて話すのはちょっと難しいですね(笑)
とりあえず、ライブラリ作者なら知っておくべきですが、ライブラリのユーザーはそれほど気にする必要はないかと思います。
ライブラリ作者も、WebGL 2.0が使えない環境では1.0にフォールバックするように実装していることが多いでしょうし。</p>

<p><small>
（筆者注: WebGL 2.0の強化点については<a href="https://qiita.com/emadurandal/items/4c7bd2a26ef2d732d734" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Qiitaで良い記事を見つけました</a>。ぼくにはちんぷんかんぷんですが…）
</small></p>

<p><b class="speaker siraisi">白石:</b> なるほど、あまり気にしなくていいと(笑) 安心しました。</p>

<p><b class="speaker isii">石井:</b> 3Dをご存じない方にとって大事なのは、<strong>そもそもWebGLとはGPUを扱うための技術だ</strong>ということをしっかり理解しておくことです。</p>

<p>CPUは、CPUは複雑な処理を逐次的に処理することを得意としています。CPUの場合はコアの数が4とか8とかに限られていることが普通です。</p>

<p>一方GPUの場合は、「異なるデータに対して同じ処理を施す」のを並列で実行するのに特化しています。なのでGPUは、コアの数が1,000を超えることも普通です。
こうした特徴を持つGPUだからこそ、大量の頂点を移動する処理など、3Dプログラミングに必要とされる「単純な処理の並列実行」に向いているんです。</p>

<p><b class="speaker siraisi">白石:</b> こうした特徴は、最近だと機械学習の分野とかにも活かされているんですよね。単純なベクトル計算とかが多いから。</p>

<p><b class="speaker isii">石井:</b> そうです。で、WebGLってそもそもOpenGL（※）と同じなので、CGの取り扱いに関しては共通している部分がほとんどです。<strong>ただ、置かれている環境は、OpenGLネイティブのゲームやアプリとは随分違う</strong>。</p>

<p>一番違う点は、WebGLは必要とされるリソースが全部Web上にあって、ダウンロードが必要という点です。モデルデータの読み込みに時間がかかるんですよね。</p>

<p>だから今まではゲームなど、「読み込みに時間がかかりそうだ」とユーザーも了解しているコンテンツが多かったんです。でも、本来使うデータをしっかり選べば短いロード時間で使えるものも多いんですよ。シェーダーアートとか。</p>

<p><small>
※OpenGL（オープンジーエル、Open Graphics Library）は、クロノス・グループ (英: Khronos Group) が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスAPIである（<a href="https://ja.wikipedia.org/wiki/OpenGL" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wikipediaより引用</a>）
</small></p>

<p><b class="speaker siraisi">白石:</b> 確かに、WebGLでできたゲームとか、読み込みに数分待たされるものもありましたね。</p>

<p><b class="speaker isii">石井:</b> はい。モデルデータが大きいと、それだけダウンロードやデータ読み込みに時間がかかってしまう。なので、<strong>そうしたWebGLの問題を解決すべく、CGの世界にも進化が起きようとしている</strong>んです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5125.jpg" alt="" width="640" height="417" class="alignnone size-full wp-image-24608" srcset="/wp-content/uploads/2017/10/42A5125.jpg 640w, /wp-content/uploads/2017/10/42A5125-300x195.jpg 300w, /wp-content/uploads/2017/10/42A5125-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>ランタイム向け3Dデータフォーマット「glTF」</h2>

<p><b class="speaker siraisi">白石:</b> 具体的にはどのような進化ですか？</p>

<p><b class="speaker isii">石井:</b> 一つは<strong><a href="https://www.khronos.org/gltf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">glTF</a> (GL Transmission Format) と言って、汎用的な3Dアセットフォーマット</strong>です。ツールに依存しない軽量フォーマットとして、Khronosが普及を進めています。</p>

<div id="attachment_24632" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-640x334.png" alt="glTF" width="640" height="334" class="size-large wp-image-24632" srcset="/wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c.png 640w, /wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-300x157.png 300w, /wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">glTF</p></div>

<p><b class="speaker siraisi">白石:</b> ツールに依存しない、というのはどういう意味ですか？</p>

<p><b class="speaker isii">石井:</b> 以前WebGL上でモデルファイルを扱う際には、MayaやBlenderといったツールのファイルをそのまま読み込んで利用することが一般的でした。これは言わば、<strong>「Photoshopのpsdファイルはあるけど、jpgやpngなどの汎用的な画像フォーマットがない」という状況</strong>です。</p>

<p><b class="speaker siraisi">白石:</b> そんな状況だったんですね…知りませんでした。ゲームやアプリとしてひとまとめにパッケージングしてしまうから、汎用フォーマットが必要とされなかったんでしょうか。</p>

<p><b class="speaker isii">石井:</b> 概ねそういうところです。そういう状況を変えようと、<a href="https://ja.wikipedia.org/wiki/COLLADA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">COLLADA</a>という汎用フォーマットがKhronosによって提案され、一定程度普及はしています。</p>

<p>ただ、COLLADAファイルはCG編集ツール間でデータをやり取りするためのフォーマットとして設計されているため、WebGLアプリケーションが読み込んで利用するには、編集用のパラメーターなど不要な部分も多いんです。また、XML形式だというのも、ファイルサイズや解析速度の点で不利になります。</p>

<p>glTFは、COLLADAファイルから編集用のパラメータを取り除いて、JSON形式にしたものと言ってほぼ差し支えありません。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。ただ、そういうフォーマットって、普及させるのがなかなか大変な気もしますが、どうなんでしょう？</p>

<p><b class="speaker isii">石井:</b> glTFは既に様々なライブラリにもサポートされていますし、普及は中々順調と言えると思います（参考: <a href="https://github.com/cx20/gltf-test" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">glTFのライブラリサポート状況</a>）。</p>

<p><strong>glTFの面白いところは、大手ベンダーの採用意欲が高い</strong>というところです。MicrosoftやAutodeskという大手ベンダーが乗っかってきているんですよ。
Khronos自身WebGLの仕様策定元なので、この分野で発言力が強いこともあります。また、最近では<a href="https://www.apple.com/jp/apple-watch-series-3/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apple Watchのページ</a>でglTFが使われてたりもします。</p>

<p><b class="speaker siraisi">白石:</b> Apple Watchの公式サイトでもですか！それはかなりの人がアクセスしたでしょうね。確かに、これ単なる画像じゃない。スクロールと共に水滴が別々の動きをしてる…！（重いけど）</p>

<div id="attachment_24625" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-640x395.png" alt="Apple Watch Series 3のサイト" width="640" height="395" class="size-large wp-image-24625" srcset="/wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a.png 640w, /wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-300x185.png 300w, /wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-207x128.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Apple Watch Series 3のサイト</p></div>

<p><b class="speaker isii">石井:</b> glTFは「オーディオにおけるMP3, ビデオにおけるH.264、画像におけるJPEG」といったように、「3DといえばglTF」となることを目指しているとのことで、普及にかけるKhronosの意気込みも並々ならぬものがあります。
<img src="https://www.khronos.org/assets/uploads/apis/2016-gltf-jpeg-of-3d.jpg" alt="" /></p>

<h2>頂点データ専用の圧縮形式「draco」</h2>

<p><b class="speaker isii">石井:</b> もう一つ注目の技術としては、Googleがオープンソースで開発している<a href="https://github.com/google/draco" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">draco</a>という圧縮形式です。頂点データを効率よく圧縮する技術で、元々の頂点データのサイズに比べて4倍から16倍の圧縮率を誇ります。</p>

<p><img src="/wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-640x338.png" alt="" width="640" height="338" class="aligncenter size-large wp-image-24626" srcset="/wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450.png 640w, /wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-300x158.png 300w, /wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 先ほどのglTFにしか使えないんですか？</p>

<p><b class="speaker isii">石井:</b> いえ、汎用的なポリゴンデータ形式（.ply）に対応しているので、元のファイルフォーマットは選びません。</p>

<p><b class="speaker siraisi">白石:</b> ブラウザによる対応も必要なんですか？</p>

<p><b class="speaker isii">石井:</b> いえ、ブラウザがネイティブ対応するというものでもないんです。<strong>dracoによって圧縮されたポリゴンデータは、JavaScriptでデコードすることができます</strong>。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、アプリケーションが自前で圧縮データを展開するんですね。でもそれだと、デコード処理にかかる時間がちょっと心配です。</p>

<p><b class="speaker isii">石井:</b> WebAssemblyでできたデコーダーもあるし、Web Workersで展開すればUI処理を阻害することもないので、そこはあまり問題ないと思いますよ。使うブラウザを選ぶということもありませんし、Three.jsのようなライブラリに任せてしまえば、アプリケーションはデコードについて意識する必要もありません。</p>

<p><b class="speaker siraisi">白石:</b> ほかには、Webだと画像のサイズを結構気にしたりしますが、CGの世界ではどうなんでしょう？</p>

<p><b class="speaker isii">石井:</b> CGだと、テクスチャ画像のサイズを削減するという話になりますね。ただ、単に画像のファイルサイズを小さくするだけでは片手落ちなんです。
いくら元画像のファイルサイズを小さくしても、GPUに乗るときにはフルサイズにデコードされてしまうので、メモリ使用量などにすごく影響するんですね。</p>

<p>なので、GPUが直接扱えるテクスチャ圧縮形式というものがありまして、それらを利用すると、GPU上でも圧縮した状態で画像を扱うことができます。DirectXだとS3TCという形式、iOSだとPowerVR Texture Compression (PVRTC) というように、ベンダーごとに異なってくるんですが。</p>

<p><b class="speaker siraisi">白石:</b> ベンダーごとに異なるんだと、取り扱いが面倒ですね。</p>

<p><b class="speaker isii">石井:</b> はい、なのでこういうフォーマット変換はWebpackなどで自動化されるべきだと思います。このように、今まではエンジンが自動的に行なってきたことも、WebGLの場合はプログラマーが自分で意識しなくてはなりません。</p>

<p><b class="speaker siraisi">白石:</b> まとめると、3DをWeb上で行うためにはいろいろな課題があって、それが徐々に解決されつつあるということですね。汎用モデルフォーマットが普及しつつあり、頂点データの圧縮ツールも登場した。そして、テクスチャ圧縮も自動化されるだろうと。</p>

<p><b class="speaker isii">石井:</b> そうです。そもそもWebは、多様なデバイスがネットワークで繋がれていることが前提です。そういうユビキタスな環境で、3Dが自由に表現できる世界に向けて、今まさに具体的で重要な進化が起こっているということです。</p>

<p><img src="/wp-content/uploads/2017/10/42A4970.jpg" alt="" width="640" height="399" class="alignnone size-full wp-image-24613" srcset="/wp-content/uploads/2017/10/42A4970.jpg 640w, /wp-content/uploads/2017/10/42A4970-300x187.jpg 300w, /wp-content/uploads/2017/10/42A4970-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>WebGLの未来</h2>

<p><b class="speaker siraisi">白石:</b> こうした動きを踏まえて、WebGLの未来はどうなると思いますか？</p>

<p><b class="speaker isii">石井:</b> 今のコンピューターの世界は、やはり2Dを前提としているのは間違いありません。3Dが利用されるシーンは、ゲームなど、コンピューティングのごく一部に限られていました。マテリアルデザインなども、3Dの要素をうまく取り入れてはいますが、前提は2Dです。</p>

<p>ただ、今、GoogleやApple、Microsoftなどの強力なベンダーたちが、こぞってARやMRに力を入れています。このまま進めば、映画館や不動産屋さんとか、あらゆるお店の軒先にARのオブジェクトが浮いている…という世界は普通に来るんじゃないかと思っているんです。3Dがより身近になる世界です。</p>

<p>ただ、そういうのを見るために、<strong>わざわざアプリをインストールするのは面倒</strong>ですよね。近い将来、そういう面倒くささが、AR/MRの普及を妨げる大きな一因になってくるんじゃないかと思うんです。</p>

<p>しかしWebGLがそういう状況を打開できるんじゃないか、と期待しています。WebGLはWebブラウザさえあれば動きます。PCでもスマホでも動く。アプリのインストールが必要ないし、しかも安全なサンドボックス上で動きます。</p>

<p><b class="speaker siraisi">白石:</b> 確かに！もしかすると、ビーコン技術との組み合わせとか（※）で、アプリのインストールを必要とせず、気軽にバンバンARコンテンツを見るような時代が来るかもしれませんね。</p>

<p><small>
※Webとビーコン技術との組み合わせとして、<a href="https://developers.google.com/beacons/overview" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Eddystone</a>という仕組みがGoogleから考案されている
</small></p>

<p><b class="speaker isii">石井:</b> 実際、Googleが<a href="https://github.com/google-ar/WebARonTango" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebAR</a>という仕様を作ったりもしていますし、ARには各社力を入れているので、Webでも早晩ARが使えるようになるだろうと思います。</p>

<p><b class="speaker siraisi">白石:</b> でも実際、要素技術が揃っているだけでは世の中変わらない…という現実もあるかと思います。WebGLも、実際には随分前から使えるようになっていたわけですし。こういう「要素技術が揃っているだけでは越えられない壁」は、どうやったら超えられると思いますか？</p>

<p><b class="speaker isii">石井:</b> 難しい問題ですが、一つは3Dコンテンツの制作コストが高いというのも、普及を妨げる要因にはなるのかなと思います。ただそれは、「人が作る」ことを前提とするからコストが高くつくんだと思うんですよね。</p>

<p>そういう点では、2Dに関しては既に<a href="https://paintschainer.preferred.tech/index_ja.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PaintsChainer</a>（AI技術を使い、線画を自動で着色するサービス）や<a href="http://make.girls.moe/#/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MakeGirlsMoe</a>（AIで自動的に萌えキャラを作成するサービス）のようなサービスが出てきています。同様に、自動で3Dコンテンツを生成するようなサービスも近いうちに登場して、コンテンツの制作コストが劇的に下がるんじゃないでしょうか。</p>

<p><b class="speaker siraisi">白石:</b> <strong>AIサービスでコンテンツの制作コストが激減する</strong>というのは面白い発想ですね〜</p>

<p><b class="speaker isii">石井:</b> <a href="https://www.adobe.com/jp/sensei.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Adobe Sensei</a>も最近話題になっていますし、デザインの一部をAIに任せるというトレンドが来つつあるのは確実かなと思いますね。</p>

<h2>Grimoire.jsは、WebGLをWebエンジニアにとっての「筆」にする</h2>

<p><b class="speaker siraisi">白石:</b> では最後に、開発を進めていらっしゃる<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>についても、簡単にご紹介頂けますでしょうか？Three.jsなどのライブラリとは何が違うんでしょう？</p>

<p><img src="/wp-content/uploads/2017/10/grimoire-logo-640x172.png" alt="" width="640" height="172" class="aligncenter size-large wp-image-24627" srcset="/wp-content/uploads/2017/10/grimoire-logo.png 640w, /wp-content/uploads/2017/10/grimoire-logo-300x81.png 300w, /wp-content/uploads/2017/10/grimoire-logo-207x56.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker isii">石井:</b> Grimoire.jsはWeb開発の中でWebGLを扱うためのフレームワークです。<a href="http://threejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Three.js</a>や<a href="http://www.babylonjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Babylon.js</a>は、発想がCG中心なんですよね。画面全体をCGで構築するようなコンテンツにはいいのですが、Webコンテンツと混在させて、相互がやり取りするようなプログラムを作るには適していないんです。<strong>CGとWebには大きな隔たりがある</strong>。それに決められた構造を両者に与えて橋をかける必要があった。</p>

<p>この隔たりは、プログラミングスタイルにも大きく表れてきます。</p>

<p>CGの場合は、フレームごとにグラフィックを変更させていく、いわば<strong>フレーム指向</strong>です。<br />
一方でWebの場合は、イベントに応じて処理を行うのが普通ですよね。いわば<strong>イベント指向</strong>です。<br />
こうした隔たりがあるせいで、CG側とWeb側が、お互いにどうデータを受け渡しすればいいか、正解がないというのが今の状況です。</p>

<p>Grimoire.jsは、CG側とWeb側の、2つのAPIを提供することで、両者がシームレスに同居するようなアプリケーションを簡単に作ることができるように設計されています。</p>

<p><b class="speaker siraisi">白石:</b> 具体的にはどのようなコードになるんでしょう？</p>

<p><b class="speaker isii">石井:</b> Grimoire.jsは、GOMLという専用のマークアップ言語でCGを記述することができます。そして、GOMLの要素を変更することで、簡単にCGを変更できるんです。例えば、立方体にテクスチャを貼り付けて、自動的に回転するようなCGは以下のようなマークアップで簡単に実現できます。</p>

<p><img src="/wp-content/uploads/2017/10/cube-640x541.png" alt="" width="640" height="541" class="aligncenter size-large wp-image-24634" srcset="/wp-content/uploads/2017/10/cube.png 640w, /wp-content/uploads/2017/10/cube-300x254.png 300w, /wp-content/uploads/2017/10/cube-207x175.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;goml&gt;
  &lt;scene&gt;
    &lt;camera&gt;&lt;/camera&gt;
    &lt;mesh texture="logo.png" geometry="cube"&gt;
      &lt;mesh.components&gt;
        &lt;Rotate speed="1,1,1" /&gt;
      &lt;/mesh.components&gt;
    &lt;/mesh&gt;
  &lt;/scene&gt;
&lt;/goml&gt;</pre><p></p>

<p>そして例えば、マウスが重なった時だけこの立方体が2倍の大きさになる…という処理は、以下のようなJavaScriptで実現できます。</p>

<p></p><pre class="crayon-plain-tag">gr(function() {
  var mesh = gr('#simple .canvas')('mesh')
  mesh.on('mouseenter', function () {
    mesh.setAttribute('scale', '2.0')
  })
  mesh.on('mouseleave', function () {
    mesh.setAttribute('scale', '1.0')
  })
})</pre><p></p>

<p><b class="speaker siraisi">白石:</b> おお、簡単ですね！これならWebエンジニアでも簡単に扱えそうです。</p>

<p><b class="speaker isii">石井:</b> はい、そうなんです。イベントを受けてパラメーターを書き換えるという流れは、今のWebアプリケーションフレームワークなどの潮流を見れば古い感じを受けるかもしれませんが、結局のところこれだけあればいくらでもラップすることができます。そのようなモダンなWeb開発の環境でもシームレスに環境を選ばず導入できるんです。Grimoire.jsの目標は「<strong>WebGLを、Webエンジニアにとっての『筆』にする</strong>」ことなんです。</p>

<p>一方で、CG側にはUnityに近いようなインターフェースのAPIが提供されています。TypeScriptで記述できるビルド環境が提供されているので、Webに疎いCGサイドでもすぐにWebエンジニアの使う筆を作ることができます。再利用可能で、最終的なパラメーター調整などをWeb側が簡単に行えるわけです。実際、そのためにChrome拡張でWebGLの空間をそのまま操作できる<a href="https://chrome.google.com/webstore/detail/grimoirejs-devtool-20/clioppdjbagckdddfdhpollnkbpepkhn" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">インスペクタ</a>も提供しています。</p>

<div id="attachment_24628" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/inspector-640x257.png" alt="Grimoire.js Inspector" width="640" height="257" class="size-large wp-image-24628" srcset="/wp-content/uploads/2017/10/inspector.png 640w, /wp-content/uploads/2017/10/inspector-300x120.png 300w, /wp-content/uploads/2017/10/inspector-207x83.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Grimoire.js Inspector</p></div>

<p>WebエンジニアにとってCGをより身近にすること、そしてCGがより一般的な世界にすることを目指しています。</p>

<p><b class="speaker siraisi">白石:</b> とても期待しています！本日はWebGLの基本的な事柄から<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>まで、いろいろ教えていただいてありがとうございました。</p>

<p><b class="speaker isii">石井:</b> 1.0リリースを年内に行いたいと思っています。興味がある方がいたら公式サイトから開発チームのSlackなどに入ると新しい様々な情報が拾えるかと思います。またいくつかの例も載っているのでご覧いただけると幸いです。</p>

<p><DIV align=right>（撮影：刑部友康 写真提供：html5j HTML5 Conference 2017事務局）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>Web技術者よ、Unityを始めよう！Unity WebGL入門──HTML5 Conference 2016セッションレポート</title>
		<link>/ivoryfunc/21688/</link>
		<pubDate>Fri, 11 Nov 2016 11:15:56 +0000</pubDate>
		<dc:creator><![CDATA[池和田有輔]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">/?p=21688</guid>
		<description><![CDATA[連載： HTML5 Conference 2016 特集 (9)HTML5 Conference 2016特集・第5弾は、「Unity WebGL入門」です。WebGL正式対応により、ゲームをはじめとしたブラウザコンテン...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2016/" class="series-403" title="HTML5 Conference 2016 特集" data-wpel-link="internal">HTML5 Conference 2016 特集</a> (9)</div><p><a href="https://html5experts.jp/series/html5-conf2016/" target="_blank" data-wpel-link="internal">HTML5 Conference 2016特集</a>・第5弾は、「Unity WebGL入門」です。WebGL正式対応により、ゲームをはじめとしたブラウザコンテンツ制作ツールとして広く使われるようになったUnityの概要及びWebGLへの書き出しについて解説します。</p>

<p><img src="/wp-content/uploads/2016/10/roomD.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-21526" srcset="/wp-content/uploads/2016/10/roomD.jpg 640w, /wp-content/uploads/2016/10/roomD-300x169.jpg 300w, /wp-content/uploads/2016/10/roomD-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>WebGLにも対応したUnityのいま</h2>

<p>Unityは統合的なインタラクティブコンテンツ制作ツールです。</p>

<p>無料で使えるPersonalから文字通りプロフェッショナルのためのProまで3つのサブスクリプション・プランを用意していますが、根幹となるUnityエディタの機能はどのプランも同一のものとなっており、対応プラットフォームにも違いがありません。つまり、Personalでも強力な3D表現が実現できてしまうのです。</p>

<p>そして2015年末にリリースされたバージョン5.3より、Unityは正式にWebGLに対応し、ゲームを始めとしたブラウザ上でのリッチコンテンツの作成環境として広く使われるようになりました。その後も着実に進化を続け、次期バージョンである5.5ではWebAssembly対応による飛躍的なパフォーマンスの向上が見込まれています。本稿ではUnityのWebGLの概要に始まり、実際にコンテンツ開発を始めるにあたって注意すべき点などを紹介します。</p>

<h2>パフォーマンス</h2>

<p>Unityをコンテンツ開発の選択肢に挙げるにあたりユーザー最も気にするのは「どの程度のものが作れるのか」という話ではないでしょうか。結論から言うと、iOSやAndoriodなどのUnity製のモバイルネイティブアプリと概ね近しいクオリティが得られます。</p>

<p>特にグラフィックの表現力はWebGL2.0をブラウザでの正式対応に先んじてサポートしており、Unity内で一般的な3Dオブジェクトに使われるStandard Shaderでの描画能力はモバイルよりもデスクトップに近く、ソフトシャドウを使うことも可能です。</p>

<p><img src="/wp-content/uploads/2016/11/unity-1.jpg" alt="" width="640" height="324" class="alignnone size-full wp-image-21693" srcset="/wp-content/uploads/2016/11/unity-1.jpg 640w, /wp-content/uploads/2016/11/unity-1-300x152.jpg 300w, /wp-content/uploads/2016/11/unity-1-207x105.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>反面、マルチスレッド非対応やヒープ領域の制限、ファイルシステムを持たないなどの理由によりCPUとメモリはボトルネックになりやすく、パフォーマンスを引き出すためにはそれらを考慮した実装を考える必要があります。</p>

<p>また、スマートフォンなどのモバイル版ブラウザは現在のところ未対応となっており対応時期も未定です。シンプルなプロジェクトであれば大きな支障なく動作することもありますが、「まあ動くこともある」程度に捉えていただくのが無難です。</p>

<h2>Unity WebGLを支える技術</h2>

<p>WebGLで実行するためにはコードがJavascriptで書かれている必要がありますが、UnityはEmscripten コンパイラーツールチェーンを使用し、CおよびC++で記述されているUnityのランタイムコードをビルド時にasm.js JavaScript にクロスコンパイルしています。</p>

<p>ams.jsとは高速化を目的としたJavaScript言語仕様のサブセットであり、事前コンパイル（AOT）された形で実行されます。過去にはFireFoxのみに対応していたこの技術も今や多くの主要ブラウザが対応しており、ブラウザ間でのパフォーマンスの差は徐々に埋まりつつあります。また非対応のIEではパフォーマンスに大きな難を抱えています。</p>

<p><img src="/wp-content/uploads/2016/11/unity-2.jpg" alt="" width="640" height="141" class="alignnone size-full wp-image-21695" srcset="/wp-content/uploads/2016/11/unity-2.jpg 640w, /wp-content/uploads/2016/11/unity-2-300x66.jpg 300w, /wp-content/uploads/2016/11/unity-2-207x46.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>では、開発者が記述することになるユーザーコードはどうでしょうか。Unityは.Net互換のMono環境で実行されるので、ユーザーはC#あるいはUnity独自の言語であるUnity Scriptでの開発がメインとなります。</p>

<p>Unityはビルドする際、通常は書き出されたCIL（中間言語）をmonoのランタイムにより各プラットフォームのネイティブコードに変換するわけですが、WebGLをターゲットとした場合はUnityの独自技術であるIL2CPPにより一旦C++に変換し、その後はUnityのランタイムコードと概ね同じ手順でJavascriptに変換されます。</p>

<p><img src="/wp-content/uploads/2016/11/unity-3.jpg" alt="" width="640" height="134" class="alignnone size-full wp-image-21697" srcset="/wp-content/uploads/2016/11/unity-3.jpg 640w, /wp-content/uploads/2016/11/unity-3-300x63.jpg 300w, /wp-content/uploads/2016/11/unity-3-207x43.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>IL2CPPはUnityが多くのプラットフォームに展開、そして最適化するための重要な技術です。</p>

<h2>Unityでの設定のポイント</h2>

<p>WEBコンテンツである以上、ビルドサイズを少しでも削減することは大きな課題と言えるでしょう。</p>

<p>エンジンコード、及びユーザーの記述したコードについてはリリースビルドとして書き出すことで縮小化、gzip圧縮され、ダウンロード後にブラウザ上で解凍、及びパージングして実行されます。さらにStrip Engine Codeオプションにより使用しないエンジンの機能をあらかじめ削除しておくことができます。</p>

<p>シーンファイル及びシーン内で使用されるアセットはアーカイブデータとして通常1ファイルにまとめられます。</p>

<p>サーバからは上記同様gzip圧縮したものをブラウザ上で展開し、得られたファイルはさらにLZ4形式で圧縮されています。ブラウザのタブを閉じるまでメモリ内にストックされ、使用すべきアセットがロードするときだけ解凍される仕様です。</p>

<p>しかし2種類の圧縮がかかっているとはいえ大量のテクスチャやサウンドを含むデータをコンテンツ開始時に一度にロードさせ、メモリ内に保持し続けることは得策ではありません。ダウンロード時間とメモリ使用量の削減を両立させるためにはhtmlから直接参照されるアセットを最小限に留め、それ以外をAsset Bundleで提供することが望ましいと言えます。</p>

<p>Asset Bundleは簡単に言うとアセットをシリアライズしたアーカイブファイルです。実行時にサーバからダウンロードして利用するため読み込みのタイミングを管理し、必要なくなったタイミングで破棄し、メモリを解放することができます。使用の際は通常アセット同様にチャンクベースの圧縮形式LZ4が多くのケースで有用です。</p>

<h2>Unityの提供するサービスとの連携</h2>

<p>前述した通り、WebGLへのビルドは複雑な手順で行われており、他のプラットフォームに比べ時間を要します。CIサーバを用意して自動化するという解決法もありますが、もっと手軽な方法としてUnityはクラウド上でビルドを行うサービスを提供しており、サービス内容に差はあるものの全てのプランで無料提供されています。</p>

<p>GitやSubversionなど広く使われるソースコントロールであればリポジトリを更新するだけで自動的に行われ、書き出されたURLを伝えればどこからでも確認できるようになります。またAssetBandleのビルドもサポートしており、開発効率を上げるためには欠かせないサービスとなっています。</p>

<p>その他にもユーザーの環境や動向を分析するUnityアナリティクスや、Unityエディタに統合された簡易的なソースコンントロールであるUnityコラボレイトなど、Unityの提供するサービスは広がり続けています。</p>

<h2>まとめ</h2>

<p>冒頭でも述べましたが、Unityは統合的なインタラクティブコンテンツ制作ツールであり、WebGLを構築するためのJSライブラリ等とはアプローチが大きく異なります。</p>

<p>特に3Dビューに慣れていない方は最初は戸惑われるかもしれません。しかしユーザー数やコミュニティに後押しされる形で多くの情報をWebで手軽に入手できるほか、チュートリアルや入門書籍なども充実しています。一度是非お試しください。</p>

<p><a href="http://japan.unity3d.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Unity &#8211; Game Engine</a></p>

<p>当日の資料と動画は下記で公開されていますので、こちらも参照してください。</p>

<ul>
<li><a href="https://github.com/momdo/talk/blob/master/webtalk_2016-09-03.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">講演資料</a></li>
</ul>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe src="https://www.youtube.com/embed/RP96J1hbl6c" frameborder="0" 0="allowfullscreen" width="100%" height="500" scrolling="yes" class="iframe-class"></iframe>

]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2016 特集]]></series:name>
	</item>
		<item>
		<title>VR成功の鍵はWebVRにあり！？ ── HTML5 Conference 2016セッションレポート</title>
		<link>/edo_m18/21153/</link>
		<pubDate>Thu, 20 Oct 2016 00:00:07 +0000</pubDate>
		<dc:creator><![CDATA[比留間 和也]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[WebVR]]></category>

		<guid isPermaLink="false">/?p=21153</guid>
		<description><![CDATA[連載： HTML5 Conference 2016 特集 (3)セッション内容を講演者自らが解説するという「HTML5 Conference 2016特集」の第三弾。今回のテーマは「Webのグラフィックス後編: WebG...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2016/" class="series-403" title="HTML5 Conference 2016 特集" data-wpel-link="internal">HTML5 Conference 2016 特集</a> (3)</div><p>セッション内容を講演者自らが解説するという「<a href="https://html5experts.jp/series/html5-conf2016/" data-wpel-link="internal">HTML5 Conference 2016特集</a>」の第三弾。今回のテーマは「<a href="http://events.html5j.org/conference/2016/9/session/#session_id_b3" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webのグラフィックス後編: WebGL2、そしてWebVR</a>」。<br />
すでに策定が始まっている次期バージョンWebGL2.0のお話や、WebでVRを実現する「WebVR API」を用いてVRコンテンツの実装の仕方を解説します。</p>

<p><img src="/wp-content/uploads/2016/10/DSC06585.jpg" alt="" width="600" height="388" class="aligncenter size-full wp-image-21443" srcset="/wp-content/uploads/2016/10/DSC06585.jpg 640w, /wp-content/uploads/2016/10/DSC06585-300x194.jpg 300w, /wp-content/uploads/2016/10/DSC06585-207x134.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<h2>VRとは？</h2>

<p>今年、2016年はVR元年と言われ、様々なVRデバイス、VR関連ガジェット、VRコンテンツが世に生み出されています。  しかし、VR発祥は意外と古く、遡ること1960年代にVRの基礎となる理論、デバイスが発表されています。</p>

<p>ただ当時は個人で手が出るものではなく、体験自体はデパートのアトラクションとして登場するなど、体験は限定的でした。</p>

<p><img src="/wp-content/uploads/2016/10/352930-sensorama-1962-242x300.jpg" alt="352930-sensorama-1962" width="242" height="300" class="alignnone size-medium wp-image-21157" srcset="/wp-content/uploads/2016/10/352930-sensorama-1962-242x300.jpg 242w, /wp-content/uploads/2016/10/352930-sensorama-1962-167x207.jpg 167w, /wp-content/uploads/2016/10/352930-sensorama-1962.jpg 400w" sizes="(max-width: 242px) 100vw, 242px" /><br />
<a href="http://www.pcmag.com/slideshow/story/321996/12-vr-headsets-that-predate-oculus-don-t-tell-facebook/1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">参考</a></p>

<p>時を戻して2016年。世界が動き出します。<br />
2016年6月時点のGoogle検索トレンドでは、検索回数が飛躍的に伸びているのが見てとれます。</p>

<p><img src="/wp-content/uploads/2016/10/unnamed-640x228.png" alt="unnamed" width="640" height="228" class="aligncenter size-large wp-image-21159" srcset="/wp-content/uploads/2016/10/unnamed.png 640w, /wp-content/uploads/2016/10/unnamed-300x107.png 300w, /wp-content/uploads/2016/10/unnamed-207x74.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>きっとこれを読まれている方も、周りで「VR」というワードを聞くことが増えてきたのではないでしょうか。そしてこの波に乗るように、VRについてもWebでの体験を可能にする技術が公開されています。</p>

<h2>WebVRは体験の話ではない</h2>

<p>WebでのVR技術、それが「WebVR」です。<br />
取りざたされているVRを手軽にWebで体験できるもの。それが「WebVR」。</p>

<p>…ではなく。<br />
あくまでWebVRはイチ仕様に過ぎません。<br />
つまり、WebVRに対応したからといって、即座にWeb上でVRコンテンツを提供できる、という類のものではないということです。</p>

<h2>WebVRはAPIの仕様</h2>

<p>誤解を恐れずに言えば、WebVRはセンサーからの情報を扱うためだけのAPIです。<br />
要は、HMD（ヘッドマウントディスプレイ）からの位置、回転、視野情報など様々な、ハードウェアの情報を取り扱うAPIということです。もっと言ってしまえば、モバイルで利用しているジャイロセンサーとなんら変わることはない、ということです。</p>

<p>事実、WebGLの仕様と比べると格段に少ない内容の仕様となっています。（<a href="https://w3c.github.io/webvr/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様はこちら</a>）</p>

<h2>VRコンテンツの構築</h2>

<p>Webで手軽に体験できるVRコンテンツ、と書きましたが提供する側が同じく手軽であるとは限りません。<br />
（とはいえ、その他のネイティブなVRコンテンツと比較すると格段に手軽だと思いますが）</p>

<p>WebVRはただのAPIだと書きました。<br />
つまり、VRコンテンツ自体は別のAPI、具体的にはWebGLを利用して3Dコンテンツを制作する必要があります。事実、VRコンテンツの制作について既存の3Dコンテンツの制作と違いはほとんどありません。</p>

<p>WebGLコンテンツでは通常、requestAnimationFrameなどを利用して、一定時間置きに画面を更新しアニメーションやインタラクションを実現します。ジャイロセンサーを使ったコンテンツの制作を行ったことがある方であれば、どういったコンテンツが制作できるのかのイメージがわくでしょう。</p>

<p>そして上でも書いたように、ジャイロセンサーで行っていたような処理をWebVR APIに替えて画面を更新してやればいいのです。</p>

<p>ただし、（当然ではありますが）通常のWebGLコンテンツとWebVRコンテンツでは決定的に違うところがあります。それは「VR体験を作り上げる必要がある」という点です。</p>

<p>具体例を上げましょう。<br />
今までの3Dコンテンツはカメラの位置は製作者側で制御可能でした。<br />
ということはつまり、都合の悪い、カメラの後ろ側を映さないようにカメラを制御することができた、ということです。
しかし、VRコンテンツはそのカメラの操作はユーザーの視点という形で使われるため、当然、その後ろ側を見られる可能性があります。<br />
（というより、ほとんどの場合、ユーザーはあたりを見渡すでしょう）</p>

<p>このように、裏側が見られてしまうということは、悪く言えば手抜き、よく言えば無駄を省いた部分までもしっかりと作り込まないとならないということを意味しています。</p>

<h2>基本的なセットアップ方法</h2>

<p>さて、それではざっくりとですが、WebVR APIを使ったセットアップのコードを紹介しましょう。<br />
本コードは<a href="https://hacks.mozilla.org/2016/03/introducing-the-webvr-1-0-api-proposal/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのサイトのサンプル</a>を引用させていただいています。</p>

<p><strong>▼ HMDハードウェアの参照を取得する</strong></p>

<p><code>navigator.getVRDisplay().then(function (displays) {
    if (!displays.length) {
        return;
    }</p>

<pre><code>vrDisplay = displays.length[0];
</code></pre>

<p>}).catch(function (err) {
    console.error('Could not get VRDisplay', err.stack);
};</code></p>

<p><br /></p>

<p><strong>▼ 描画対象として必要なサイズを取得する</strong></p>

<p><code>var eyeParameter = vrDisplay.getEyeParameters('left');
var width = eyeParameter.renderWidth;
var height = eyeParameter.renderHeight;
</code></p>

<p><br /></p>

<p><strong>▼ WebGLのCanvasおよびVRモード移行のための処理を記述</strong>
<code>var webglCanvas = document.querySelector('#webglcanvas');
var enterVRBtn = document.querySelector('#entervr');</p>

<p>enterVRBtn.addEventListener('click', function () {
    vrDisplay.requestPresent({source:webglCanvas});
}, false);</p>

<p>vrDisplay.exitPresent();</code></p>

<p><br /></p>

<p><strong>▼ 画面のアニメーションループを処理する</strong>
<code>var id = vrDisplay.requestAnimationFrame(onAnimationFrame);</p>

<p>function onAnimationFrame() {
    id = vrDisplay.requestAnimationFrame(onAnimationFrame);
}</p>

<p>vrDisplay.cancelRequestAnimationFrame(id);</code></p>

<p><br /></p>

<p><strong>▼ HMDのセンサーからの値を取り出す</strong>
<code>var pose = vrDisplay.getPose();</p>

<p>var orientation = pose.orientation;</p>

<p>var position = pose.position;</code></p>

<p><br /></p>

<p><strong>▼ ハードウェアに設定された個々の設定を読み取る（瞳孔間距離など）</strong>
<code>var eyeParameters = vrDisplay.getEyeParameter('left');</p>

<p>var eyeOffset = eyeParameters.offset;</p>

<p>var eyeMatrix = makeProjectionMatrix(vrDisplay, eyeParameters);</code></p>

<p><br /></p>

<p><strong>▼ 取得した情報から、プロジェクション行列を生成する</strong>
<code>function fieldOfViewToProjectionMatrix (fov, zNear, zFar) {
    var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);
    var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);
    var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);
    var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);
    var xScale = 2.0 / (leftTan + rightTan);
    var yScale = 2.0 / (upTan + downTan);</p>

<pre><code>var out = new Float32Array(16);
out[0] = xScale;
out[1] = 0.0;
out[2] = 0.0;
out[3] = 0.0;
out[4] = 0.0;
out[5] = yScale;
out[6] = 0.0;
out[7] = 0.0;
out[8] = -((leftTan - rightTan) * xScale * 0.5);
out[9] = ((upTan - downTan) * yScale * 0.5);
out[10] = -(zNear + zFar) / (zFar - zNear);
out[11] = -1.0;
out[12] = 0.0;
out[13] = 0.0;
out[14] = -(2.0 * zFar * zNear) / (zFar - zNear);
out[15] = 0.0;

return out;
</code></pre>

<p>}</code></p>

<h2>Three.jsを使えばお手軽</h2>

<p>WebGLといえばThree.js、というくらいデファクトスタンダードなライブラリとなったThree.js。<br />
実はThree.jsのリポジトリにはWebVRに対応するためのプラグインがすでに存在しています。</p>

<p>それは VRControl.js と VREffect.js の2種類です。<br />
これはどちらもThree.jsでVRを実現するのを手助けしてくれるプラグインです。<br />
VRControl がHMDのセンサーの処理を、 VREffect.js がフルスクリーンモードへの移行や、VRモードの表示を手助けしてくれます。</p>

<p>基本的に、Three.jsを使った3Dコンテンツ制作の方法はVR化すると言っても大きな違いはありません。<br />
その証拠に、VR化するためのコード断片は以下のようにとても短いものとなります。</p>

<p><code>var controls = new THREE.VRControls(camera);
var effect = new THREE.VREffect(renderer);</p>

<p>// clickイベントなどのユーザ操作のタイミングで実行される関数
function toVRMode() {
    effect.requestPresent();
}</code></p>

<h2>対応ブラウザ</h2>

<p>対応ブラウザは、執筆時点（2016/09/28）ではまだ限定的にしか存在していません。<br />
安定版で動作するものは今のところないのが現状です。</p>

<p>対応状況は以下のサイトから確認することができます。<br />
<a href="https://iswebvrready.org/#webvr-enthusiasm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Is WebVR Ready?</a></p>

<h2>VR成功の鍵を握るのはWebVR</h2>

<p>個人的な見解ですが、VR成功の鍵をにぎるのはWebVRにあると思っています。<br />
その理由はいくつかあります。</p>

<p>一つ目が、プラットフォーム（Oculus Rift、HTC Viveなど）に依存しないこと。<br />
つまり今までのWebアプリと同様に、モバイル、PCなどのプラットフォームに依存しないコンテンツ展開ができることです。</p>

<p>二つ目に、インストールが不要なこと。ネイティブアプリにしてしまうとどうしてもこの「インストール」という手順が必要になってしまいます。しかし、WebVRであればWebサイトに訪れたユーザが、VRモードの開始ボタンを押すだけでVR体験をすることが可能になります。</p>

<p>そして最後の三つ目として、「ちょっとだけVR」が使えること。<br />
例えばECサイトの商品をVRで見てみる、例えば不動産サイトの部屋の感じをVRで体験してみる、などなど、VRが活用できればユーザの利便性が上がることはたくさんあります。</p>

<p>しかし、例えばこれらを、アプリをインストールしたのちにしか行えないとしたら大部分の人はそれを倦厭するでしょう。</p>

<p>またコンテンツ制作側からしても、そんなちょっとしたVRアプリだけをプラットフォームに載せて配信する、というハードルの高さも出てくるでしょう。</p>

<p>こうしたように、今までの「Webならではの良さ」がそのままVRにも当てはめることができると考えています。そしてこれが結局、VRとユーザの接点となり、より多くの人にVRとはなにか、VRでどんなことができるかを広める機会になると考えています。</p>

<h2>まとめ</h2>

<p>まとめると、</p>

<ul>
<li>WebVRはAPIの名称</li>
<li>WebVR APIがやってくれるのはセンサーの値を取るなどの最低限の処理のみ</li>
<li>Three.jsを使えば手軽にVRコンテンツの制作が可能</li>
<li>とはいえまだサポートブラウザが（ほぼ）ない</li>
<li>しかし、Webでの活用はまだまだ（いい意味で）未知数</li>
</ul>

<p>ということです。<br />
詳細については<a href="http://www.slideshare.net/hirumakazuya/webvr-65665803" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">カンファレンスで使用したスライド</a>がアップされているので、そちらを参照ください。</p>

<p>当日の動画は下記で公開されていますので、こちらも参照してください。（編集部注：動画は3：26：10あたりから比留間さんの講演となります）</p>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2Fj44z1KIgpvjxeF&amp;url=http%3A%2F%2Fwww.slideshare.net%2Fhirumakazuya%2Fwebvr-65665803&amp;image=http%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fwebvr-160903231346-thumbnail-4.jpg%3Fcb%3D1472944881&amp;key=internal&amp;type=text%2Fhtml&amp;schema=slideshare" scrolling="no" frameborder="0" 0="allowfullscreen" width="100%" height="500"></iframe>



<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe src="https://www.youtube.com/embed/UQGmbabnUBY" frameborder="0" 0="allowfullscreen" width="100%" height="500" scrolling="yes" class="iframe-class"></iframe>

]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2016 特集]]></series:name>
	</item>
		<item>
		<title>HTML5の技術だけで実装！「YouTubeみたいなWebGLプレーヤー」とは？</title>
		<link>/mitsuhide/10115/</link>
		<pubDate>Tue, 09 Sep 2014 23:50:15 +0000</pubDate>
		<dc:creator><![CDATA[松田光秀]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[FullScreen API]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[jThree]]></category>

		<guid isPermaLink="false">/?p=10115</guid>
		<description><![CDATA[連載： HTML5 Japan Cup 特集 (7)この記事では、HTML5 Japan Cup 2014で優秀賞を頂いた「YouTubeみたいなWebGLプレーヤー」で利用されている技術を解説します。 はじめに 「Yo...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/5jcup-2/" class="series-207" title="HTML5 Japan Cup 特集" data-wpel-link="internal">HTML5 Japan Cup 特集</a> (7)</div><p>この記事では、<a href="https://5jcup.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Japan Cup 2014</a>で優秀賞を頂いた「YouTubeみたいなWebGLプレーヤー」で利用されている技術を解説します。</p>

<h2>はじめに</h2>

<p>「<a href="http://jthree.jp/" title="jThree公式サイトで見る" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">YouTubeみたいなWebGLプレーヤー</a>」はコンテンツそのものとは分離された、オープンソースJavaScriptライブラリ「jThree」のプラグインです。オープンソースとして公開していますので、誰でも自身の作品に差し替えてブログなどに掲載することができます。WebGLの描画部分は全てjThreeで管理しています。この記事では、プレーヤーで採用している2つのHTML5 APIとjThreeの概要をご紹介します。</p>

<h2>プレーヤーの機能</h2>

<p>このプレーヤーは、まるで動画のごとくWebGLコンテンツを楽曲付きで再生できます。動画との違いはコンテンツ内のオブジェクトを自由に操作できることです。私が作ったものはカメラのアングルを操作するだけですがJavaScriptでできることなら実装可能です。
Oculus Rift表示に切り替えるボタンが標準搭載されておりVR体験を楽しむこともできます。</p>

<h2>SVGで作成した再生ボタン</h2>

<p>プレーヤーの中央に表示される赤い再生ボタンは、インラインSVGで描画しています。CSSを合わせても600バイト以下で画像よりデータ量を抑えられたのがポイントでした。WebGLに対応しているブラウザは、全てSVGをサポートしているので惜しみなく使うことができます。</p>

<p><a href="http://jthree.jp/" title="jThree公式サイトで見る" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/1.png" alt="1" width="567" height="374" class="alignnone size-full wp-image-10116" srcset="/wp-content/uploads/2014/08/1.png 567w, /wp-content/uploads/2014/08/1-300x197.png 300w, /wp-content/uploads/2014/08/1-207x136.png 207w" sizes="(max-width: 567px) 100vw, 567px" /></a></p>

<p>再生ボタンのHTMLは以下の通りです。</p>

<p></p><pre class="crayon-plain-tag">&lt;svg viewBox="0 0 77 54"&gt;
	&lt;rect fill="#1f1f1f" width="77" height="54" ry="15" /&gt;
	&lt;polygon fill="#fff" points="30.3,39.4 30.3,15.75 53,27.6"/&gt;
&lt;/svg&gt;</pre><p></p>

<h2>Fullscreen APIで全画面表示機能を実現</h2>

<p>プレーヤー右下の全画面表示ボタンを押すと、Fullscreen APIによってブラウザの枠も越えて、PC画面いっぱいにコンテンツが表示されます。プレーヤーはVRデバイスのOculus Riftにも対応しているため、より高い没入感を得るために必須の機能です。</p>

<p><a href="http://jthree.jp/" title="jThree公式サイトで見る" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/2.png" alt="2" width="567" height="319" class="alignnone size-full wp-image-10117" srcset="/wp-content/uploads/2014/08/2.png 567w, /wp-content/uploads/2014/08/2-300x168.png 300w, /wp-content/uploads/2014/08/2-207x116.png 207w" sizes="(max-width: 567px) 100vw, 567px" /></a></p>

<p>全画面表示を切り替えるJavaScriptのコードは以下のとおりです。</p>

<p></p><pre class="crayon-plain-tag">function requestFullscreen( target ) {

	if (target.webkitRequestFullscreen) {
		target.webkitRequestFullscreen(); //Chrome15+, Safari5.1+, Opera15+
	} else if (target.mozRequestFullScreen) {
		target.mozRequestFullScreen(); //FF10+
	} else if (target.msRequestFullscreen) {
		target.msRequestFullscreen(); //IE11+
	} else if (target.requestFullscreen) {
		target.requestFullscreen(); // HTML5 Fullscreen API仕様
	} else {
		alert("ご利用のブラウザはフルスクリーン操作に対応していません");
		return;
	}

}</pre><p></p>

<p></p><pre class="crayon-plain-tag">function exitFullscreen() {

	if ( document.exitFullscreen ) {
		document.exitFullscreen(); //HTML5 Fullscreen API仕様
	} else if ( document.cancelFullScreen ) {
		document.cancelFullScreen(); //Gecko:FullScreenAPI仕様
	} else if ( document.webkitCancelFullScreen ) {
		document.webkitCancelFullScreen(); //Chrome, Safari, Opera
	} else if ( document.mozCancelFullScreen ) {
		document.mozCancelFullScreen(); //Firefox
	} else {
		document.msExitFullscreen();
	}

}</pre><p></p>

<h2>オープンソースJavaScriptライブラリ「jThree」</h2>

<p>今回の作品のベースとなっているオープンソースJavaScriptライブラリ「jThree」についてご紹介します。今回紹介したプレーヤーとそれで再生するコンテンツ（WebGL）は「jThree」を使うことで、jQueryによく似た記法で操作・作成することができます。</p>

<p>「jThree」は8/31に「jThree v2」をリリースしました。これまで外部XMLファイルに記述していたWebGL描画タグをHTMLに埋め込めるようになりました。つまり、jThree v2は「インラインWebGL」を実現したのです。外部ファイルに頼らずHTMLファイル1つだけで描画することが可能で、当然アニメーションさせる前段階の静的な描画処理にはJavaScriptを一行も書く必要がありません。</p>

<p>jQuery関数の代わりにjThree関数を使ってDOMを操作することにより、動的な描画処理ができる点は従来通りです。さらに、これまでjThreeはMMD（.pmx/.vmd）のデータにしか対応していませんでしたが、v2からはプラグインによってあらゆるファイル形式を読み込めるようにもなりました。</p>

<p>jThree v2公開と同時にthree.js用JSON（.json/.js）・DirectX（.x）・Collada（.dae）・STL（.stl）の各ファイルに対応したプラグインを公式で用意しています。OBJ（.obj）とMTL（.mtl）ファイルにも順次対応予定です。</p>

<p></p><pre class="crayon-plain-tag">&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;style&gt;
body {
	position: fixed;
	width: 100%;
	height: 100%;
	margin: 0;
}
&lt;/style&gt;
&lt;script type="text/goml"&gt;
&lt;goml&gt;
	&lt;head&gt;
		&lt;rdr /&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;scene&gt;
			&lt;camera style="camera-far: 8000; position: 0 20 30; lookAt:0 15 0;" /&gt;
			&lt;light type="Amb" /&gt;
			&lt;light type="Dir" style="light-color: #bfbfbf; position:-14 28 60;" /&gt;
			&lt;obj model="town/ゲキド街Ver2.x" style="scale: 10;" /&gt;
		&lt;/scene&gt;
	&lt;/body&gt;
&lt;/goml&gt;
&lt;/script&gt;
&lt;script src="jQuery.js"&gt;&lt;/script&gt;
&lt;script src="jThree.js"&gt;&lt;/script&gt;
&lt;script src="jThree.XFile.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p><a href="http://jthree.jp/" target="_brank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/39ca614fcbd978cb3b908958ac5476ff.png" alt="街" width="600" height="426" class="alignnone size-full wp-image-10454" srcset="/wp-content/uploads/2014/08/39ca614fcbd978cb3b908958ac5476ff.png 600w, /wp-content/uploads/2014/08/39ca614fcbd978cb3b908958ac5476ff-300x213.png 300w, /wp-content/uploads/2014/08/39ca614fcbd978cb3b908958ac5476ff-207x146.png 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>詳しい「jThree」の解説は、私が執筆した<a href="http://codezine.jp/article/corner/522" title="Codezineで解説を見る" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Codezineさんの記事</a>をご覧ください。</p>

<p>※ jThree v2に対応したプレーヤーはありません。公式サイトでの配布も終了するのでプレーヤーを使ってみたい方はCodezineさんの第6回記事からサンプルファイルをDLしてお使いください。
<a href="http://codezine.jp/article/detail/7865" target="_brank" data-wpel-link="external" rel="follow external noopener noreferrer">jThreeプレーヤープラグインの使い方</a></p>

<h2>最後に</h2>

<p>今回は、「jThree」のプラグインとして開発した「YouTubeみたいなWebGLプレーヤー」の要素技術について解説しましたしました。最優秀賞を獲れなかったことは非常に残念ですが、誰もがこのプレーヤーのように手軽にWebで3DCGを楽しめる世界を実現することを目指し、開発を続けていきます。</p>

<p><a href="http://jthree.jp/" title="jThree公式サイトで見る" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/3.png" alt="3" width="567" height="319" class="alignnone size-full wp-image-10118" srcset="/wp-content/uploads/2014/08/3.png 567w, /wp-content/uploads/2014/08/3-300x168.png 300w, /wp-content/uploads/2014/08/3-207x116.png 207w" sizes="(max-width: 567px) 100vw, 567px" /></a></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Japan Cup 特集]]></series:name>
	</item>
		<item>
		<title>WebGLとWebSocketによる3Dオンラインレースゲーム「JS-Racing」の全て！（前編）</title>
		<link>/knockknockjp/10226/</link>
		<pubDate>Fri, 29 Aug 2014 00:00:58 +0000</pubDate>
		<dc:creator><![CDATA[西田慎吾]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=10226</guid>
		<description><![CDATA[連載： HTML5 Japan Cup 特集 (5)今回はHTML5JapanCup2014にてWebGL賞と優秀賞を受賞したオンラインレースゲーム、JS-Racingの技術解説を書かせていただきます。 このコンテンツは...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/5jcup-2/" class="series-207" title="HTML5 Japan Cup 特集" data-wpel-link="internal">HTML5 Japan Cup 特集</a> (5)</div><p>今回は<a href="https://5jcup.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">HTML5JapanCup2014</a>にて<strong>WebGL賞</strong>と<strong>優秀賞</strong>を受賞したオンラインレースゲーム、<a href="http://js-racing.knockknock.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JS-Racing</a>の技術解説を書かせていただきます。</p>

<p><img src="/wp-content/uploads/2014/08/img03.jpg" alt="JS-Racing" width="630" height="397" class="alignnone size-full wp-image-10255" srcset="/wp-content/uploads/2014/08/img03.jpg 630w, /wp-content/uploads/2014/08/img03-300x189.jpg 300w, /wp-content/uploads/2014/08/img03-207x130.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>このコンテンツは<strong>WebGLの3D表現を活かした3Dレースゲーム</strong>です。<br>
また、<strong>WebSocketを使用しサーバを介して、複数のクライアントでの同時走行が可能なオンラインゲーム</strong>になっています。同時に、ソケット通信時に発行されるソケットIDをPCとスマートフォンで共有することで、<strong>スマートフォンからPC上の車を操作することも可能</strong>です。</p>

<p><img src="/wp-content/uploads/2014/08/img04.jpg" alt="JS-Racing" width="630" height="500" class="alignnone size-full wp-image-10264" srcset="/wp-content/uploads/2014/08/img04.jpg 630w, /wp-content/uploads/2014/08/img04-300x238.jpg 300w, /wp-content/uploads/2014/08/img04-207x164.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<h2>クライアントサイドの使用技術</h2>

<p>クライアントサイドの構築において、目的・用途に応じて使用した言語やライブラリに関して解説します。</p>

<h3>TypeScriptによるクラス設計</h3>

<p>クライアントサイドのメインとなるロジックを<a href="http://www.typescriptlang.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">TypeScript</a>を使用して設計しました。TypeScriptはマイクロソフトによって開発されたフリーでオープンソースのプログラミング言語です。<strong>大規模JavaScriptアプリケーションに向けて開発</strong>されたTypeScriptは、これまでのJavaScriptにはない以下の機能を有しています。</p>

<ul>
    <li><strong>型注釈とコンパイル時の型チェック</strong></li>
    <li><strong>クラス</strong></li>
    <li><strong>インターフェイス</strong></li>
    <li><strong>モジュール</strong></li>
</ul>

<p>TypeScriptはコンパイルして最終的にJavaScriptに出力することができます。今回のように多くの機能の実装が必要になるWebアプリケーションでは、クラスベースのオブジェクト指向言語的な特徴を持つTypeScriptは、設計しやすく非常に有効なものになります。</p>

<p>ActionScript3と同じように、1つのTSファイル（TypeScriptファイル）にクラスを1つだけ記述して、ファイル名とクラス名を一致させました。また、モジュール毎にディレクトリを作成して、クラスを格納しています。これにより<strong>機能毎にモジュールとクラスを整理</strong>する事ができ、再利用しやすく見やすいコードになりました。最終的には、クラス毎に作成したTSファイルを、クラス毎のJavaScriptファイルに出力（コンパイル）し、<a href="http://gruntjs.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Grunt</a>で結合、圧縮して、実際に読み込むJavaScriptファイルにしています。</p>

<p><img src="/wp-content/uploads/2014/08/img05.gif" alt="img05" width="630" height="670" class="alignnone size-full wp-image-10419" /></p>

<p>今回の場合、モジュールの分け方は、まず表示要素とロジックにモジュールを分けました。表示要素はゲームの各シーンや、3D描画、画面下部のランキング表示というように、表示要素単位でさらにモジュールを細分化していきます。ロジックは、イベントや値管理、定数、ユーティリティ、コースデータ管理、物理演算、リアルタイム通信といった、機能単位でモジュールを細分化していきます。このようにモジュールを分けていくことで、大規模なコンテンツ開発の際には、<strong>各クラスの責任範囲が明確化でき、バグが発生した際にも、原因を特定しやすく、さらには仕様変更にも強く</strong>なります。</p>

<p>TypeScriptは大規模開発においては、非常に設計しやすく、クラスベースのオブジェクト指向言語のメリットを最大限に享受できるものだと思います。ただその分、設計における手間と、なによりコード記述量が多くなります。中規模以下の案件では、最低限の設計で手軽に構築できる<a href="http://coffeescript.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">CoffeeScript</a>も、よい選択肢ではないかと思います。</p>

<h3>Box2DJSを使った2D物理演算</h3>

<p>車を走らせたり、障害物と衝突したりといった、ゲームの中核となるロジックは<a href="http://box2d-js.sourceforge.net/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Box2DJS</a>を使用しています。Box2DJSは、<strong>質量・速度・摩擦をシミュレーションするJavaScriptの2D物理演算エンジン</strong>です。</p>

<p>表現方法自体は3Dですが、物理演算エンジンは2Dを使用しました。今回のようなシンプルなゲームを作るには、3Dの物理演算エンジンより、2Dの物理演算エンジンの方が、ゲームバランスや操作感において向いていると感じます。コンシューマーゲームなどの本格的なゲームとなると、3D物理演算エンジンによる処理は、必要不可欠なものだとは思いますが、その分、マシンへの負荷も高くなります。</p>

<p>物理演算に関しては、別途サンプルを作成して、チューニングしていきました。ゲームの中核となる部分ですので、まずこのサンプルで楽しいと思えるかどうかで、最終的なゲームのゴールが見えてくると思います。可能な限りゲーム性向上のためのチューニングしていくことが大切です。</p>

<p><a href="http://www.knockknock.jp/sample/20140127/02/index.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/img06.gif" alt="img06" width="630" height="473" class="alignnone size-full wp-image-10421" /></a></p>

<p>初期段階のモックアップのイメージですが、まずはこのようにBox2Dを使って、2Dレースゲームを構築しました。この2Dレースゲームの情報を3D表示部分や情報部分（スピードメーター等）やコースデータ管理ロジック、リアルタイム通信ロジックに渡します。</p>

<p>物理演算クラス<code>imjcart.logic.physics.Physics</code>にて、マップ情報を元に<code>new Car</code>で車インスタンスを生成し、車の状態が変更したイベント<code>CHANGE_CAR_CONDITION_EVENT</code>をキャッチして、イベントを発行します。</p>

<p></p><pre class="crayon-plain-tag">public createCar() {
    // マップ情報を元に車を生成
    var x = 0;
    var y = 0;
    var i, j, max, max2;
    for (i = 0, max = imjcart.logic.map.value.MapConst.MAP.length; i &amp;amp;amp;lt; max; i = i + 1) {
        for (j = 0, max2 = imjcart.logic.map.value.MapConst.MAP[i].length; j &amp;amp;amp;lt; max2; j = j + 1) {
            if (imjcart.logic.map.value.MapConst.MAP[i][j] == imjcart.logic.map.value.MapConst.MAP_KEY_CAR_START_POSITION) {
                y = imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE * i;
                x = imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE * j;
                break;
            }
        }
    }
    this._car = new Car(this._context, this._world, x, y);
    // 車状態変更イベント
    this._car.addEventListener(event.PhysicsEvent.CHANGE_CAR_CONDITION_EVENT, (evt) =&amp;amp;amp;gt; {
        this.dispatchEvent(imjcart.logic.physics.event.PhysicsEvent.CHANGE_CAR_CONDITION_EVENT, {
            x: evt.x,
            y: evt.y,
            bodyAngle: evt.bodyAngle,
            wheelAngle: evt.wheelAngle,
            speed: evt.speed,
            power: evt.power,
            gear: evt.gear,
            direction: evt.direction
        });
    });
}</pre><p></p>

<p><code>imjcart.logic.physics.Car</code>クラスでは、<code>update</code>関数が実行されると、入力されている値をホイールに反映し、車の状態に変化を与えます。変化した車の情報を付加して、車の状態が変更したイベント<code>CHANGE_CAR_CONDITION_EVENT</code>を発行します。</p>

<p></p><pre class="crayon-plain-tag">public update() {
    // ホイールに力を適応
    var i = 0, max;
    for (i = 0, max = this._frontWheels.length; i &lt; max; i = i + 1) {
        var wheel = this._frontWheels[i];
        var direction = wheel.GetTransform().R.col2.Copy();
        direction.Multiply(this._enginePower);
        wheel.ApplyForce(direction, wheel.GetPosition());
    }
    // ホイールと車をつなぐジョイント部分に角度を適応
    for (i = 0, max = this._frontWheelJoints.length; i &lt; max; i = i + 1) {
        var wheelJoint = this._frontWheelJoints[i];
        var angleDiff = this._steeringAngle - wheelJoint.GetJointAngle();
        wheelJoint.SetMotorSpeed(angleDiff * this._steerSpeed);
    }
    // 車状態変更イベントの発行
    var position = this._body.GetPosition();
    var velocity = this._body.GetLinearVelocity();
    var speedX = Math.abs(velocity.x);
    var speedY = Math.abs(velocity.y);
    var speed = 0;
    if (speedX &lt; speedY) {
        speed = speedY;
    } else {
        speed = speedX;
    }
    this.dispatchEvent(imjcart.logic.physics.event.PhysicsEvent.CHANGE_CAR_CONDITION_EVENT, {
        x: position.x,
        y: position.y,
        bodyAngle: this._body.GetAngle(),
        wheelAngle: this._frontWheelJoints[0].GetJointAngle(),
        speed: speed,
        power: this._enginePower,
        gear: this._gear,
        direction: this._engineDirection
    });
}</pre><p></p>

<p><code>dispatchEvent</code>メソッドは、イベントを発行する<code>lib.event.EventDispacher</code>クラス（オリジナルで作成）に定義されたメソッドです。表示要素のクラスはこの<code>lib.event.EventDispacher</code>クラスを継承しています。</p>

<h3>three.jsの3D表現</h3>

<p>WebGLを使った3D表示部分には<a href="http://threejs.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">three.js</a>を使用しています。three.jsは、<strong>WebGLを扱うライブラリとしては、最もよく使われているJavaScriptライブラリ</strong>です。</p>

<p><a href="http://www.blender.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Blender</a>というオープンソースの3次元コンピュータグラフィックスソフトウェアを使って、3Dモデルの作成を作成し、three.jsで読み込んで表示しています。Blenderで作成する3Dモデルデータ（今回のモデルデータはOBJ形式）は、ジオメトリ（形状）とUVテクスチャのみで、three.jsを使って、質感などの調整をしています。</p>

<p><img src="/wp-content/uploads/2014/08/img07.jpg" alt="img07" width="630" height="380" class="alignnone size-full wp-image-10422" srcset="/wp-content/uploads/2014/08/img07.jpg 630w, /wp-content/uploads/2014/08/img07-300x180.jpg 300w, /wp-content/uploads/2014/08/img07-207x124.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>また、今回のように実行環境が制限しづらいWebアプリケーションでは、なるべく多くのユーザーが利用できるように、マシンへの負荷は極力減らさないといけません。特にレースゲームは、現在走っているコースの先が見える必要があり、視野を広くしなければならないために、処理するデータ量が増え、より負荷がかかってしまいます。この<strong>負荷軽減</strong>のために、以下のことを考慮しています。</p>

<ol>
    <li><strong>ポリゴンが少なくても成り立つデザイン</strong></li>
    <li><strong>影をつけない</strong></li>
    <li><strong>ジオメトリ（形状）の結合</strong></li>
    <li><strong>負荷の少ないマテリアル（質感）を選択</strong></li>
</ol>

<p>1つめの<strong>ポリゴンが少なくても成り立つデザイン</strong>に関しては、下のタイヤのサンプルで、左のタイヤはポリゴン数を極端に減らしていますので、光や深度の計算が少なくなり、マシンへの負荷も小さくなります。右のタイヤはリアルなタイヤを再現したために、ポリゴン数も多く、マシンへの負荷も大きくなります。配置する量が少数ならそれほど問題になりませんが、コースデータに沿って多数配置する障害物ですので、マシン負荷は大きくなります。ただ、ポリゴン数が少ない分、リアルな表現からは遠く離れてしまっています。コース全体のデザインも含めてですが、リアルな表現を求めないポップなデザインを採用することで、低ポリゴンでも違和感のないようにしています。</p>

<p><img src="/wp-content/uploads/2014/08/img10.jpg" alt="img10" width="630" height="247" class="alignnone size-full wp-image-10425" srcset="/wp-content/uploads/2014/08/img10.jpg 630w, /wp-content/uploads/2014/08/img10-300x117.jpg 300w, /wp-content/uploads/2014/08/img10-207x81.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>2つめの<strong>影をつけない</strong>ですが、下のキャプチャを見ていただければ、影がない左側のキャプチャと影がある右側のキャプチャでは、3D空間としての説得力にだいぶ違いが出てしまっているかと思います。ここは苦渋の決断ですが、影をつけることはthree.jsではとても負荷のかかる処理なので、より多くのユーザにストレスなく遊んでもらうためにも影をつけない方を採用しました。</p>

<p><img src="/wp-content/uploads/2014/08/img08.jpg" alt="img08" width="630" height="227" class="alignnone size-full wp-image-10423" srcset="/wp-content/uploads/2014/08/img08.jpg 630w, /wp-content/uploads/2014/08/img08-300x108.jpg 300w, /wp-content/uploads/2014/08/img08-207x74.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>ちなみに影を出すには、レンダラーの<code>shadowMapEnabled</code>を<code>true</code>にして、光源の<code>castShadow</code>を<code>true</code>にします。そして影を作る側の物体の<code>castShadow</code>を<code>true</code>にして、影を受ける側の物体の<code>receiveShadow</code>を<code>true</code>にします。デフォルトでは<code>false</code>のため影が出ません。</p>

<p></p><pre class="crayon-plain-tag">// レンダラー
renderer.shadowMapEnabled = true;
// 光源
light.castShadow = true;
// 影を作る側
mesh.castShadow = true;
// 影を受ける側
mesh.receiveShadow = true;</pre><p></p>

<p>3つめの<strong>ジオメトリの結合</strong>に関してですが、WebGLコンテンツの様にGPUを使用するコンテンツは、ジオメトリの数だけGPUに対してドローコール（描画命令）をします。このドローコールの回数はパフォーマンスに大きく影響します。ジオメトリを<code>THREE.GeometryUtils.merge(geometry, mesh)</code>メソッドで結合することで、不要なドローコールの発生を少なくすることができます。注意点としては、結合したものは個別に動かすことや、マテリアルを個別に設定することはできませんので、今回は壁やコースなど、個別に動くことのない、大量に描画する必要のある要素に対してジオメトリの結合をしています。</p>

<p></p><pre class="crayon-plain-tag">var geometry = new THREE.Geometry(); // 空のジオメトリを作成
var meshArr = [];
// モデルデータとマテリアルを読み込む
var loader = new THREE.OBJMTLLoader();
loader.load("models/block03/block03.obj", "models/block03/block03.mtl", (object) =&gt; {
    object.traverse(function (child) {
        if (child instanceof THREE.Mesh) {
            child.material = new THREE.MeshLambertMaterial(child.material);
            child.material.ambient = new THREE.Color(imjcart.display.main.view3d.value.View3dConst.AMBIENT_COLOR);
            meshArr.push({
                mesh: child,
                material: child.material
            });
        }
    });
    // 読み込んだモデルデータをマップデータに沿って、クローンして配置。
    var i, j, max, max2;
    for (i = 0, max = imjcart.logic.map.value.MapConst.MAP.length; i &lt; max; i = i + 1) {
        for (j = 0, max2 = imjcart.logic.map.value.MapConst.MAP[i].length; j &lt; max2; j = j + 1) {
            if (imjcart.logic.map.value.MapConst.MAP[i][j] == imjcart.logic.map.value.MapConst.MAP_KEY_BLOCK) {
                var tagX = imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE * j + (imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE / 2);
                var tagY = 1;
                var tagZ = imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE * i + (imjcart.logic.map.value.MapConst.MAP_BLOCK_SIZE / 2);
                var mesh = meshArr[1].mesh.clone();
                mesh.position.set(tagX, tagY, tagZ);
                THREE.GeometryUtils.merge(geometry, mesh); // 空のジオメトリにマージして結合していく
            }
        }
    }
    this._block = new THREE.Mesh(geometry, meshArr[1].material);
    this._scene.add(this._block);
});</pre><p></p>

<p>最後に4つめの<strong>負荷の少ないマテリアル（質感）の選択</strong>は、表面の質感を上げるマテリアルを選択すると、その分マシンへの負荷が上がるということです。マテリアルの種類は代表的なもので、以下のメリットがあります。</p>

<ol>
<li><strong>MeshBasicMaterial</strong> : 光の影響を受けない
<li><strong>MeshLambertMaterial</strong> : 影や光の反射などを描画できる（ランバート反射モデル）
<li><strong>MeshPhongMaterial</strong> : 影や光の反射などをより綺麗に描画できる（フォンシェーディング）
</ol>

<p>マシンへの負荷に関しては1、2、3の順に次第に高くなります。選択したマテリアルの違いもマシン負荷への影響は大きいですが、マテリアルにバンプマップを使うかどうかもマシン負荷への影響は大きくなります。バンプマップは表面に細かな凹凸を表現します。下のキャプチャはアスファルトにバンプマップを適応したもの（右）と、適応していないもの（左）の違いです。表現力を上げるためには、バンプマップを採用したいところですが、ここでもマシン負荷を考慮してバンプマップを使っていません。</p>

<p><img src="/wp-content/uploads/2014/08/img09.jpg" alt="img09" width="630" height="400" class="alignnone size-full wp-image-10424" srcset="/wp-content/uploads/2014/08/img09.jpg 630w, /wp-content/uploads/2014/08/img09-300x190.jpg 300w, /wp-content/uploads/2014/08/img09-207x131.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>リアルな表現に近づければ近づけるほど、マシンへの負荷が増えてしまいます。ある程度の表現力は確保しながら、どれだけ負荷を減らせるかの調整は、これくらいのスペックなら問題なく表示できるようにしたいというターゲットとなるマシンを決めて、そのマシンで最低限確保したいフレームレートを決めます。あとは都度、フレームレートを確認しながら調整するということの繰り返しになります。マシンスペックだけでなく、ブラウザによっても表示速度に差異があることを意識していなければなりません。</p>

<h3>HTML5のAPIによる新しい表現力</h3>

<p>WebGL以外のHTML5の要素も、それぞれの特徴にあわせて適宜使用しています。</p>

<ul>
    <li>Canvas：コースマップ（コース縮尺図）</li>
    <li>SVG：スピードメーター</li>
    <li>WebFont：タイトルやテキスト全般</li>
    <li>CSS3：角丸やドロップシャドウやボタンデザイン</li>
</ul>

<p><img src="/wp-content/uploads/2014/08/img11.jpg" alt="img11" width="630" height="336" class="alignnone size-full wp-image-10446" srcset="/wp-content/uploads/2014/08/img11.jpg 630w, /wp-content/uploads/2014/08/img11-300x160.jpg 300w, /wp-content/uploads/2014/08/img11-207x110.jpg 207w" sizes="(max-width: 630px) 100vw, 630px" /></p>

<p>WebGLによる3D表示をしているCanvasの上に、各要素を配置していますが、上に乗っかっている要素を動かしたり、形状を変更させる場合には、背景に不透明な物を敷くなどの工夫が必要になります。そうしないと上に乗っかっている要素に変更があるたびに、下のCanvas全体まで、不要な再描画処理がかかってしまい、描画のパフォーマンスを著しく低下させてしまいます。</p>

<h2>まとめ</h2>

<p>以上が今回作成したJS-Racingで利用した、主なクライアントサイド技術になります。</p>

<p>3D表現として利用したWebGLは、IE11の対応によって最新のモダンブラウザでは、ほぼ実行可能な環境が揃ってきていると思います。</p>

<p>ユーザーのマシンスペックや、WebGL対応ブラウザの普及率を考えると、まだある程度ユーザーをしぼる必要がありますが、最近では話題を呼んでいる3Dコンテンツも次第に増えてきたように感じます。</p>

<p>次回は<strong>サーバサイドの使用技術</strong>と、その他の<strong>技術トピック</strong>に関して解説する予定です。</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Japan Cup 特集]]></series:name>
	</item>
		<item>
		<title>WebGLを活用した3D Web ゲーム『翠星のガルガンティア～キミと届けるメッセージ～』</title>
		<link>/ykasugai/7743/</link>
		<pubDate>Tue, 01 Jul 2014 04:00:20 +0000</pubDate>
		<dc:creator><![CDATA[春日井 良隆]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[ゲーム]]></category>

		<guid isPermaLink="false">/?p=7743</guid>
		<description><![CDATA[Production I.Gと日本マイクロソフトのコラボレーションによる3D Webゲーム『翠星のガルガンティア　～キミと届けるメッセージ～』が、Internet Explorerのデモサイト「Rethink」シリーズの...]]></description>
				<content:encoded><![CDATA[<p>Production I.Gと日本マイクロソフトのコラボレーションによる3D Webゲーム『<a href="http://fly.gargantia.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">翠星のガルガンティア　～キミと届けるメッセージ～</a>』が、Internet Explorerのデモサイト「<a href="http://fly.gargantia.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Rethink</a>」シリーズの日本発コンテンツとして、6月18日に公開されました。</p>

<p><img src="/wp-content/uploads/2014/07/Gargantia-Game-A-Japanese.jpg" alt="Gargantia Game A" width="640" height="320" class="alignnone size-full wp-image-7750" srcset="/wp-content/uploads/2014/07/Gargantia-Game-A-Japanese.jpg 640w, /wp-content/uploads/2014/07/Gargantia-Game-A-Japanese-300x150.jpg 300w, /wp-content/uploads/2014/07/Gargantia-Game-A-Japanese-207x103.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このゲームはアニメ『翠星のガルガンティア』から生まれたスカイアクションゲームで、この作品のためにシナリオを書き下ろし、アニメ本編の声優はフルボイスで出演、そして世界中のファンが楽しめるように、日本語と英語のキャプションを用意するなど、ゲームそのものに気合いが入っているだけでなく、開発者向けにはソースコードの一部と3Dモデルを公開し、WebGLの裾野を広げることも目的にしています。</p>

<iframe width="560" height="315" src="//www.youtube.com/embed/hJ5WfTDyuPY" frameborder="0" allowfullscreen></iframe>

<p><br></p>

<h2>Web 表現の限界に挑戦</h2>

<p>大いに自慢したいのが、そのWebGLの表現力と応答性です。大きな入道雲や飛行ルートを邪魔する気流、すれ違うカモメの群れ。いずれもリアルタイムに美しく描画しているだけでなく、ゲームの爽快感を損なわないように滑らかに軽快にレンダリングされています。</p>

<p>このゲームはInternet Explorer 11のタッチ操作に最適化されていますが、マウスとキーボードでも遊ぶことができます。さらに<a href="http://msdn.microsoft.com/en-us/library/ie/dn743630(v=vs.85).aspx" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Gamepad API</a>にも対応。ゲームパッドコントローラでも遊べます。また、レスポンシブWebデザインを反映して、プレイできるエリアはディスプレイの解像度に合わせて自動的に調整されるようになっています。</p>

<p><img src="/wp-content/uploads/2014/07/Gamepad-API-1.jpg" alt="" width="550" height="183" class="alignnone size-full wp-image-7752" srcset="/wp-content/uploads/2014/07/Gamepad-API-1.jpg 550w, /wp-content/uploads/2014/07/Gamepad-API-1-300x99.jpg 300w, /wp-content/uploads/2014/07/Gamepad-API-1-207x68.jpg 207w" sizes="(max-width: 550px) 100vw, 550px" /></p>

<h2>オープンソースのTurbulenzエンジンで構築</h2>

<p>ガルガンティアでは、開発者がより効率的に3DのWebコンテンツが作れるようなリファレンスになることも目標の一つです。今回はイギリスに本拠地を置くゲームデベロッパー、<a href="https://ga.me/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Turbulenz</a>と連携し、オープンソースの<a href="https://github.com/turbulenz/turbulenz_engine" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Turbulenz Engine</a>を使って開発しています。</p>

<p><img src="/wp-content/uploads/2014/07/turbulenz.jpg" alt="turbulenz" width="640" height="253" class="alignnone size-full wp-image-7754" srcset="/wp-content/uploads/2014/07/turbulenz.jpg 640w, /wp-content/uploads/2014/07/turbulenz-300x118.jpg 300w, /wp-content/uploads/2014/07/turbulenz-207x81.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Turbulenz EngineはJavaScriptとTypeScriptで実装された2D/3Dゲーム開発エンジンです。ハイパフォーマンスな物理エンジン、高品質なビジュアルエフェクト、パーティクルシミューレション、アニメーションエンジンといった豊富な機能を提供し、ゲーム技術の広い範囲をカバーしています。</p>

<p>Turbulenz Engineは無料で<a href="https://github.com/turbulenz/turbulenz_engine" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GitHub</a>からダウンロードできます。</p>

<p>さらに、ゲームの一部のソースコードと3Dモデルも公開しています（アドベンチャーパート、ボイスデータ、BGMデータは含まれません）。こちらも<a href="https://github.com/turbulenz/turbulenz_engine" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GitHub</a>からダウンロードできますので、読者の皆さんもぜひお試し下さい。ソースの入手とWebサーバーへの配置については、弊社のエバンジェリスト物江がブログ「<a href="http://blogs.msdn.com/b/osamum/archive/2014/06/18/iis-gargantia.aspx" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ゲーム『翠星のガルガンティア』のソースの入手とIISへの配置方法</a>」で紹介しています。</p>

<p><img src="/wp-content/uploads/2014/07/0574_image_23F9B0F4.jpg" alt="0574_image_23F9B0F4" width="640" height="342" class="alignnone size-full wp-image-7756" srcset="/wp-content/uploads/2014/07/0574_image_23F9B0F4.jpg 640w, /wp-content/uploads/2014/07/0574_image_23F9B0F4-300x160.jpg 300w, /wp-content/uploads/2014/07/0574_image_23F9B0F4-207x110.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>IE9で掲げた「Same Markup」と同様に、いまもIEの開発ではWeb標準への準拠をなによりも大切にしています。この『<a href="http://fly.gargantia.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">翠星のガルガンティア　～キミと届けるメッセージ～</a>』もWebGLに対応したほかのブラウザでもお楽しみいただけます。今後、新しい面が追加されていきます。お楽しみに！</p>
]]></content:encoded>
			</item>
		<item>
		<title>初心者でも絶対わかる、WebGLプログラミング＜three.js最初の一歩＞</title>
		<link>/yomotsu/5225/</link>
		<pubDate>Fri, 07 Feb 2014 02:00:07 +0000</pubDate>
		<dc:creator><![CDATA[小山田 晃浩]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[3DCG]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[three.js]]></category>

		<guid isPermaLink="false">/?p=5225</guid>
		<description><![CDATA[連載： WebGLプログラミング (2)WebGLはとても高度な技術である一方、APIは低レベルであるためそのまま使うにはどうしても冗長な準備を行う必要があります。一方で、JavaScriptライブラリーを通して高レベル...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webgl-news/" class="series-154" title="WebGLプログラミング" data-wpel-link="internal">WebGLプログラミング</a> (2)</div><p>WebGLはとても高度な技術である一方、APIは低レベルであるためそのまま使うにはどうしても冗長な準備を行う必要があります。一方で、JavaScriptライブラリーを通して高レベルなAPIとしてWebGLを利用する方法があります。こうしたJavaScriptライブラリーとしてはthree.js、Away3D.js、Babylon.jsなどが有名です。その中でも特に人気があるthree.jsを通して、WebGLを利用する方法を解説します。(three.jsのリビジョンは執筆現在の最新であるr65を利用します)</p>

<p><span id="more-5225"></span></p>

<h2>three.jsを手に入れる</h2>

<p>three.jsは<a href="http://threejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://threejs.org/</a>から手に入れることができます。downloadから、zipファイルを手に入れましょう。</p>

<p>ダウンロードしたファイルを展開すると多くのファイルが格納されていますが、必要なライブラリー本体はbuildフォルダ内にthree.min.jsとして配置されています。three.min.jsのみを取り出しましょう。three.min.js以外のファイルは不要です。</p>

<p><img src="/wp-content/uploads/2014/02/1.png" alt="" /></p>

<h2>three.jsにおける抽象化された概念</h2>

<p>まずは、基本的なコードを書きながらthree.jsにおける概念を知りましょう。ここでは皆さんの理解が深まるように図を見ながらコードの解説を進めます。</p>

<h2>コードを書き始める</h2>

<p>HTMLファイルを新規作成し、three.min.jsを読み込みます。合わせて、あなたがコードを書いていく場所も用意しましょう。今回はこれをmainという名前の関数とし、DOM構築完了を待ってから実行します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;get started with three.js&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;script src="three.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
var main = function () {
  // ここにあなたのコードを書いていきます
};

window.addEventListener( 'DOMContentLoaded', main, false );
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<h2>シーンを作る</h2>

<p>まずはシーンを作ります。シーンはこれからあなたが作る3Dの世界となります。ただし、この段階ではシーンの内容は空の状態です。</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  var scene = new THREE.Scene();
};</pre><p></p>

<p><img src="/wp-content/uploads/2014/02/2.png" alt="" /></p>

<h2>カメラを作る</h2>

<p>シーンの状態を撮影するカメラを作ります。カメラに写った内容が最終的にブラウザー上で表示されることになります。</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  var scene = new THREE.Scene();

  var width  = 600;
  var height = 400;
  var fov    = 60;
  var aspect = width / height;
  var near   = 1;
  var far    = 1000;
  var camera = new THREE.PerspectiveCamera( fov, aspect, near, far );
  camera.position.set( 0, 0, 50 );
};</pre><p></p>

<p>PerspectiveCameraは4つの引数が必要です。これらは、カメラが写す範囲を示しています。</p>

<ul>
<li>fovは画角を示します。</li>
<li>aspectは撮影結果の縦横比を示します。</li>
<li>nearはニアークリップの距離を示します。nearより近い領域は表示されません。</li>
<li>farはファークリップの距離を示します。farより遠い領域は表示されません。</li>
</ul>

<p><img src="/wp-content/uploads/2014/02/3.png" alt="" /></p>

<p>つまり、指定した画角と縦横比によって作られる四角錐の内、nearからfarまでの間が表示されるわけです。</p>

<p>このあと3Dオブジェクトを追加することを考え、カメラの位置を中心から少し手前に引いておきます。カメラインスタンスはpositionという位置を示すプロパティーがあり、positionはx、y、zの3つのプロパティーを持っています。初期ではx、y、zの値は全て0です。この値を変更するにはsetメソッドを利用します。setメソッドの引数はx, y, zの3つを順に渡します。上記のコードではset( 0, 0, 50 )としているので、カメラはzの正方向、つまり手前に50の位置に設置されるわけです。</p>

<p><img src="/wp-content/uploads/2014/02/4.png" alt="" /></p>

<p>※ 古いリビジョンのthree.jsでは、作成したカメラインスタンスをscene内に追加する必要がありましたが、現在はその必要がありません。</p>

<h2>レンダラーをDOM上に設置する</h2>

<p>ここまでで基本状態が用意できました。ただし、この状態ではHTMLと紐づいておらず表示結果を求めることができません。three.jsでは、レンダラーをDOMに設置することでこれを実現します。</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  //ここまでの内容は省略

  var renderer = new THREE.WebGLRenderer();
  renderer.setSize( width, height );
  document.body.appendChild( renderer.domElement );
};</pre><p></p>

<p>レンダラーのサイズとして渡しているwidthとheightは、先ほどカメラのアスペクトを求める際に利用した値を流用します。これでbody要素内に、横600px縦400pxのレンダラーを展開することができます。</p>

<h2>光源を追加する</h2>

<p>ここまでのコードでは空（から）のシーンとそれを写すカメラを用意できています。ここに光源を追加してみましょう。three.jsでは様々なタイプの光源を利用できますが、今回は平行光源を追加します。</p>

<p>平行光源はインスタンスを作る際に2つの引数を渡します。第一引数は光の色、第二引数はオプションで光の強さを渡します。この例では第一引数に0xffffffを渡し、白色の光としています。</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  //ここまでの内容は省略

  var directionalLight = new THREE.DirectionalLight( 0xffffff );
  directionalLight.position.set( 0, 0.7, 0.7 );
  scene.add( directionalLight );
};</pre><p></p>

<p>平行光源は光の角度を変えることができます。その場合、positionプロパティーで光源の角度を決定します。directionalLight.position.set( 0, 0.7, 0.7 )であれば上方向と手前方向、つまり斜め上前からの光となるわけです。</p>

<p><img src="/wp-content/uploads/2014/02/5.png" alt="" /></p>

<h2>物体を追加する</h2>

<p>物体を追加してみましょう。今回は箱を設置します。three.jsでは、原始的な図形を作成するためのクラスがいくつか用意されています。もちろん、3Dモデリングツールでつくった3Dモデルを読み込むこともできますが、自作のモデルを読み込む方法はまたの機会に解説します。</p>

<p>three.jsではジオメトリー(形状)とマテリアル(表面素材)を用意した上で、メッシュ(物体)を作成するという手順が必要です。</p>

<p><img src="/wp-content/uploads/2014/02/6.png" alt="" /></p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  //ここまでの内容は省略

  var geometry = new THREE.CubeGeometry( 30, 30, 30 );
  var material = new THREE.MeshPhongMaterial( { color: 0xff0000 } );
  var mesh = new THREE.Mesh( geometry, material );
  scene.add( mesh );
};</pre><p></p>

<p>まずはジオメトリーを作ります。箱型のジオメトリーはCubeGeometryクラスで作成可能です。横幅、高さ、奥行きの順に数値で引数を渡します。</p>

<p>次に、マテリアルを作ります。three.jsでは様々なタイプのマテリアルが用意されていますが、今回はフォンシェーディングで表示できるMeshLambertMaterialを利用します。引数には色やカラーテクスチャ、光沢などをオブジェクトで指定することができます。今回は赤色（0xff0000）のカラーのみを指定します。</p>

<p>そして、ジオメトリーとマテリアルからメッシュを作成し、メッシュをシーンに追加します。</p>

<p><img src="/wp-content/uploads/2014/02/7.png" alt="" /></p>

<h2>表示する</h2>

<p>これで、シーン、カメラ、レンダラーを用意しシーンの中には光源と物体がある状態ができました。これをレンダリング（表示）してみましょう。</p>

<p>レンダラーインスタンスはrenderというメソッドを持っており、ここに任意のシーンとカメラを渡すことで、該当のシーンをレンダリングします。</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  //ここまでの内容は省略

  renderer.render( scene, camera );
};</pre><p></p>

<p>レンダリング結果は次の通りです。</p>

<p>(invalid jsdo.it code)</p>

<p>これを見ただけでは3Dには感じられないかもしれませんね。しかし、この状態でしっかりと3Dで赤色の箱が<strong>真正面から</strong>静止した状態で表示されています。</p>

<h2>回転アニメーション</h2>

<p>止まった状態で正面からレンダリングしても面白い結果にはなりませんでした。3Dのよさを引き出すために、箱を少しずつ回転させながら、レンダリングを繰り返してみましょう。こうすることでアニメーションで表示されます。</p>

<p>(invalid jsdo.it code)</p>

<p></p><pre class="crayon-plain-tag">var main = function () {
  //ここまでの内容は省略

  ( function renderLoop () {
    requestAnimationFrame( renderLoop );
    mesh.rotation.set(
      0,
      mesh.rotation.y + 0.01,
      mesh.rotation.z + 0.01
    )
    renderer.render( scene, camera );
  } )();
};</pre><p></p>

<p>名前付きの即時実行関数を用意し、requestAnimationFrameで自分自身を呼び出し続けることで、レンダリングを繰り返すことができます。</p>

<p>関数内部ではmesh、つまり箱のrotationプロパティーの値を少しずつ変え、直後にレンダリングを行います。これにより箱が回転するアニメーションとなるわけです。rotationプロパティーはpositionプロパティーと同様にsetメソッドで内容を変更することができます。</p>

<h2>まとめ</h2>

<p>最後にコード全文を示します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;get started with three.js&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;script src="three.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
var main = function () {
  var scene = new THREE.Scene();

  var width  = 600;
  var height = 400;
  var fov    = 60;
  var aspect = width / height;
  var near   = 1;
  var far    = 1000;
  var camera = new THREE.PerspectiveCamera( fov, aspect, near, far );
  camera.position.set( 0, 0, 50 );

  var renderer = new THREE.WebGLRenderer();
  renderer.setSize( width, height );
  document.body.appendChild( renderer.domElement );

  var directionalLight = new THREE.DirectionalLight( 0xffffff );
  directionalLight.position.set( 0, 0.7, 0.7 );
  scene.add( directionalLight );

  var geometry = new THREE.CubeGeometry( 30, 30, 30 );
  var material = new THREE.MeshPhongMaterial( { color: 0xff0000 } );
  var mesh = new THREE.Mesh( geometry, material );
  scene.add( mesh );

  ( function renderLoop () {
    requestAnimationFrame( renderLoop );
    mesh.rotation.set(
      0,
      mesh.rotation.y + .01,
      mesh.rotation.z + .01
    );
    renderer.render( scene, camera );
  } )();
};

window.addEventListener( 'DOMContentLoaded', main, false );
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>three.jsでは、今回解説した流れが最も基本であり、お決まりです。この抽象化された概念とシーン構築から表示までの流れを覚えておきましょう。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebGLプログラミング]]></series:name>
	</item>
		<item>
		<title>初心者でも絶対わかる、WebGLプログラミング＜基礎知識編＞</title>
		<link>/yomotsu/2897/</link>
		<pubDate>Tue, 15 Oct 2013 22:00:12 +0000</pubDate>
		<dc:creator><![CDATA[小山田 晃浩]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[3DCG]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[three.js]]></category>

		<guid isPermaLink="false">/?p=2897</guid>
		<description><![CDATA[連載： WebGLプログラミング (1)HTML5に関連する技術のひとつに、WebGLがあります。WebGLは、ブラウザー上で3DCGプログラミングを実現できる技術です。今回のレポートでは、WebGLプログラミングの基礎...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webgl-news/" class="series-154" title="WebGLプログラミング" data-wpel-link="internal">WebGLプログラミング</a> (1)</div><p>HTML5に関連する技術のひとつに、WebGLがあります。WebGLは、ブラウザー上で3DCGプログラミングを実現できる技術です。今回のレポートでは、WebGLプログラミングの基礎知識についてご紹介します。</p>

<p><span id="more-2897"></span></p>

<h2>WebGLって？</h2>

<p>WebGLでどんなことができるのか──百聞は一見にしかず。まずは例を見てみましょう。demo内のスライダー部分をドラッグすることでカメラの位置などを任意に変更できますので、リアルタイムでレンダリングされていることがわかるでしょう。</p>

<p>(invalid jsdo.it code)</p>

<p>このように、ブラウザー上で<strong>プラグインに頼ることなく</strong>、なめらかな表面、自然な影、高FPSでのリアルタイムレンダリング（アニメーション）など、まるで最近の家庭用ゲーム機にも匹敵する高度な3DCG表現ができるわけです。</p>

<p>WebGLは2013年10月現在、Chrome、Firefox、Operaで標準対応されており、加えてIE11でも対応される予定です。また、Safariも現状では設定が必要なものの、WebGLを利用する準備は整っており、WebGLは多くの環境で利用できるようになりつつあります。</p>

<p><img src="/wp-content/uploads/2013/09/1.jpg" alt="when can i useのキャプチャ" />
<a href="http://caniuse.com/webgl" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Can I use WebGL?</a>より</p>

<p>WebGLの仕様自体は、クロノスグループから<a href="http://www.khronos.org/registry/webgl/specs/latest/1.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 1.0</a>が2011年3月に正式リリース（W3Cでいう勧告）されています。従って今後APIが変更されることはなく、またWebGLのAPIはブラウザ上で「<code>WebKit</code>」や「<code>Moz</code>」といったような接頭辞なしで利用することができます。さらに2013年9月には<a href="http://www.khronos.org/registry/webgl/specs/latest/1.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 2.0</a>の仕様策定が開始されています。</p>

<p><img src="/wp-content/uploads/2013/09/2.png" alt="WebGL 1.0" /></p>

<hr />

<h3>【コラム】WindowsなのにOpenGL系?</h3>

<p>WebGLはその名前の通り、OpenGL由来のAPIです。一方で、Windowsの一般的なグラフィックAPIはOpenGLではなく、DirectXです。しかし安心してください。Windows上でのWebGLは、最終的にDirectXに自動翻訳されて実現しています。つまり、WindowsでもMacでもAndroidでも、WebGLはプラットフォームの垣根を気にせず利用できる、共通のグラフィックAPIというわけです。</p>

<p>例えば、以下はWindows IE11におけるWebGLの仕組みです。なお、Windows用のChromeやFirefoxでも、ブラウザー内部に組み込まれた<a href="https://code.google.com/p/angleproject/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ANGLE</a>というライブラリにより、IE11と似た仕組みでWindows上のWebGLを実現しています。</p>

<p><img src="/wp-content/uploads/2013/09/3.png" alt="" />
<a href="http://channel9.msdn.com/Events/Build/2013/4-072" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Hyper-Fast Web Graphics with WebGL</a>より</p>

<hr />

<h2>WebGLプログラミングで実現できること</h2>

<p>WebGLはJavaScriptから利用するAPIです。Web開発者はJavaScriptを書くことで、閲覧者のOSに関係なくブラウザーを通してデバイスのGPU（CPUと対となる、描画処理を専門に行うためのハードウェア）にアクセスすることができます。これによりWebGLは高度な3DCG表現を実現できるわけです。</p>

<p><img src="/wp-content/uploads/2013/09/4.jpg" alt="" />
筆者のPC内に搭載されているGPU、Geforce GTX 760。ノートPCなどではGPUがCPUに内蔵されている場合も多い。</p>

<p>さて、WebGLはGPUにアクセスできるという点に少し注目してみましょう。非Web技術の話になりますが、PCで動作する3Dのオンラインゲームなどは、ネイティブのグラフィックAPIを通して、GPUでその描画を行っています。一方で、ブラウザー上で動くWebGLも同様にGPUでその描画を行います。つまりデバイスのGPUの性能にも依存しますが、WebGLは近年のPC用3Dオンラインゲームと同じレベルの描画ができるということになります。</p>

<p>例えば以下は2013年5月に公開された<a href="http://www.unrealengine.com/html5/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Epic Citadel HTML5</a>というデモで、WebGLで動いています。(
「Firefoxに最適化されている」と表示されますが、Chromeでも問題なく動作します)</p>

<p><img src="/wp-content/uploads/2013/09/5.jpg" alt="PCgameのキャプチャ" /></p>

<p>もし今あなたがモバイル端末などでこの記事を読んでいてWebGLを再生できない場合は、以下の動画を見てみるといいでしょう。</p>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="//www.youtube.com/embed/XsyogXtyU9o" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>


<p>また、WebGLの実態はJavaScriptと先に少し触れましたが、これはWebGLが他のWeb標準技術との相性がいいということを意味します。XHRでデータを取得したり、HTMLで用意したボタンやinput要素で3Dモデルを操作したり、JavaScriptのイベントを利用したり、といった応用が可能なのです。これにより、ただ表示するだけではなく、さまざまなWebアプリケーションへの応用も期待できます。</p>

<p>例えば、地図に利用したり、教育目的に利用したり、あるいはWebの技術でゲームを作ったりすることも可能です。</p>

<p><img src="/wp-content/uploads/2013/09/6.jpg" alt="" />
現在プレビュー版として提供中の<a href="http://www.google.com/maps/about/explore/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">新しいGoogleマップ</a>でもWebGLが使われている。東京都庁周辺の様子を見ると、高層ビル群が立体的に表示されている。</p>

<p><img src="/wp-content/uploads/2013/09/7.jpg" alt="" />
<a href="http://stations.aeracode.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ロンドンの地下鉄マップ</a>。3Dで表現するなら、複雑な立体構造の情報も提供しやすい</p>

<p><img src="/wp-content/uploads/2013/09/8.jpg" alt="" />
<a href="http://workshop.chromeexperiments.com/stars/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">銀河の観察</a>。WebGLは、教育目的のWebアプリケーションにも応用できるだろう</p>

<h2>WebGLは難しい？</h2>

<p>ここまで「WebGLはJavaScript」と繰り返しましたから、Web制作者にとって、WebGLを利用するための敷居が低く感じるかもしれませんね。しかし実際のところ、WebGLを利用するにはとても冗長な手順を踏む必要があります。さらに加えて、3DCGプログラミング（OpenGLやDirectX）の基礎知識、行列やベクトルといった線形代数学の知識、GLSLという言語の知識など、これまでWeb制作者にとってほとんど馴染みがなく、かつ学習コストの高いさまざまな知識を要します。</p>

<p>WebGLを利用する手順を図にしてみました。これを見るとWebGLの冗長さがわかるでしょう。</p>

<p><img src="/wp-content/uploads/2013/09/9.png" alt="WebGLのフロー" /></p>

<p><strong>しかし安心してください</strong>。こうした、手間のかかるところ、難しいところを吸収し、より直感的にJavaScriptでWebGLを扱うためのライブラリーがあります。</p>

<h2>WebGLのラッパーライブラリー「three.js」</h2>

<p><a href="http://threejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">three.js</a>は、現在最も有名なWebGLのラッパーライブラリーです。WebGL界のjQueryのような存在です。WebGLを採用した多くのプロジェクトは、既に当たり前のようにthree.jsを利用しています。</p>

<h3>three.jsの事例</h3>

<ul>
<li><a href="http://www.findyourwaytooz.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Find Your Way to Oz</a></li>
<li><a href="http://www.chromeweblab.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Lab</a></li>
<li><a href="http://www.pajamaclubmusic.com/3d/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pajama Club : 3D</a></li>
</ul>

<p>Web制作者は、OpenGLのお作法、GLSLという未知の言語、線形代数学などのWebGLのための学習コストが高い関連知識がなかったとしても、JavaScriptと、わずかな3Dの基礎知識さえあればthree.jsを利用し、WebGLをコントロールすることができます。もしあなたがWebGL初心者であるならば、three.jsを利用してみるといいでしょう。</p>

<p>three.jsはWebGL上級者にも愛されているライブラリーです。行列計算のためのAPI、自身で用意した頂点データをVBOに適用するAPI、自作のGLSLをシェーダーに適用するAPIなども備えています。</p>

<p>また、<a href="http://www.webgljobs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">海外のWebGL関連のジョブボード</a>を見てみても、three.jsがWebGL界のディファクトスタンダードライブラリーという裏付けにもなります。いくつかのWebGL関連の求人では、three.jsの経験が求められています。</p>

<p><img src="/wp-content/uploads/2013/09/10.png" alt="" /></p>

<p>three.js本体の開発はGitHubで管理されており、three.js制作者であるMr.doob氏が中心となり、世界中の多くのコミッターに支えられています。このこともthree.jsがディファクトスタンダードなライブラリーとして支持される理由でしょう。</p>

<p>こうしたさまざまな背景もあるので、もしあなたがWebGLに興味を持ったのなら、まずはthree.jsを使ってみることをおすすめします。</p>

<h2>まとめ</h2>

<p>今回はWebGLがいかに汎用的であるか、そしてそのWebGLをより簡単に利用するための手段となる、three.jsの存在についてレポートしました。
また近いうちに、three.jsの実際の利用方法についてご紹介していきます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebGLプログラミング]]></series:name>
	</item>
		<item>
		<title>ブラウザで3Dグラフィックを扱うWebGL、最新版 2.0のドラフト版が公開</title>
		<link>/masuidrive/2520/</link>
		<pubDate>Tue, 17 Sep 2013 10:57:11 +0000</pubDate>
		<dc:creator><![CDATA[増井 雄一郎]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=2520</guid>
		<description><![CDATA[2013/9/16、WebGL Working Groupはブラウザで3Dグラフィックを扱うWebGLの最新版 WebGL 2.0のドラフト版が公開しました。 WebGL 2 Specification WebGL 2の...]]></description>
				<content:encoded><![CDATA[<p>2013/9/16、WebGL Working Groupはブラウザで3Dグラフィックを扱うWebGLの最新版 WebGL 2.0のドラフト版が公開しました。</p>

<ul>
<li><a href="http://www.khronos.org/registry/webgl/specs/latest/2.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 2 Specification</a></li>
</ul>

<p>WebGL 2の最大の特徴は、2012年10月に標準化された組み込み向け3DグラフィックAPIのOpenGL ES 3.0の機能をベースにしているところです。</p>

<p>OpenGL ESは3DグラフィックをサポートするためのAPIで、WebGLではこの機能をブラウザ内で使えるようにすることで、ゲーム機の3Dグラフィックのような高度な3D表現をJavascriptから操作することが可能になります。</p>

<p>既に多くのブラウザではWebGL 1をサポートしており、すでにゲームを中心に使われる様になってきました。ChromeのCMでも使われていた<a href="http://chrome.com/maze/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome World Wide Maze</a>で使われていたので、実はWebGLを見たことがある人は多いと思います。(本記事ではWebGL 1.0をWebGL 1と表記します)</p>

<p>WebGL 2では、WebGL 1をベースに上位互換性を保ちつつ、さらなるパフォーマンス向上と多くの機能強化を行ってきました。</p>

<h2>WebGL 2の特徴</h2>

<p>WebGL 2はOpenGL ES 3.0をベースとしているため、その特徴をそのまま引き継いでいます。
大きな特徴は、陰影処理やマッピングなどの高度な表現の最適化です。3Dグラフィックでもリアリティある表現が多く求められるようになり、そのような複雑な処理を行いやすくする機能が充実しています。</p>

<p><a href="https://plus.google.com/101501294230020638079/posts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brandon Jones氏</a>は、<a href="http://blog.tojicode.com/2013/09/whats-coming-in-webgl-20.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TojiCode: What&#8217;s coming in WebGL 2.0</a>にて、WebGL 2の特徴と新機能を次のようにまとめています。各項目の詳細については元記事を参照してください</p>

<h3>特徴</h3>

<ul>
<li>Multiple Render Targets &#8211; 陰影処理などの遅延を行うDeferred Shadingの基礎技術</li>
<li>Instancing &#8211; 同じオブジェクトが沢山ある処理を早くする</li>
<li>Vertex Array Objects &#8211; 頂点計算の処理をまとめて行う</li>
<li>Fragment Depth &#8211; フラグメントのデプス値をサポート</li>
</ul>

<h3>新機能</h3>

<ul>
<li>Multisampled Renderbuffers</li>
<li>3D Texture</li>
<li>Sampler Objects</li>
<li>Uniform Buffer Objects</li>
<li>Sync Objects</li>
<li>Query Objects</li>
<li>Transform Feedback</li>
</ul>

<h2>実装状況</h2>

<p>WebGL 2は、Firefoxで実装が進められており、現在公開されている<a href="http://nightly.mozilla.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Nightly build</a>で動かすことができます。</p>

<p><a href="https://wiki.mozilla.org/Platform/GFX/WebGL2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mozilla WikiのWebGL2ページ</a>では、サンプルコードも掲載されており、自分で試すことができます。</p>

<p>まとまったデモのソースコードなどはまだ公開されていませんが、下記の多くのオブジェクトを影付きで動かすデモがYoutubeで公開されています。</p>

<p><iframe width="420" height="315" src="http://www.youtube.com/embed/_DuHAQuEJKE?feature=oembed&#038;wmode=opaque" frameborder="0" allowfullscreen></iframe></p>

<p>今後、Web上でも3D表現を使ったゲームやコンテンツが増えていくと予想されます。</p>

<p>WebGLの最大の問題は、Internet Explorerではサポートされていないことだと言われてきましたが、現在ベータ版のInternet Explorer 11からWebGL 1のサポートを開始しました。これによりさらにWebGLによる開発が活発化していくでしょう。</p>

<p>3Dグラフィックの分野は、まだまだ発展中の分野で新機能やパフォーマンスの向上が継続的に行われています。</p>

<p>WebGL 2はOpenGL ES 3.0という最新の3Dグラフィック環境を、ブラウザとJavascriptで試すことができるため、3Dプログラミングに興味のある方は注目してみると面白いのではないでしょうか。</p>
]]></content:encoded>
			</item>
		<item>
		<title>斉藤祐也の海外WEBテク定点観測＜Issue.5: 2013/08/31-2013/09/13＞</title>
		<link>/cssradar/2463/</link>
		<pubDate>Mon, 16 Sep 2013 22:00:17 +0000</pubDate>
		<dc:creator><![CDATA[斉藤 祐也]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[W3C仕様]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=2463</guid>
		<description><![CDATA[プログレッシブ・エンハンスメントに対する熱い議論、Steve Losh氏による技術文書の正しい書き方、JavaScript本の名著であるEloquent JavaScript2版のクラウドファンディングなど、14日間（8...]]></description>
				<content:encoded><![CDATA[<p>プログレッシブ・エンハンスメントに対する熱い議論、Steve Losh氏による技術文書の正しい書き方、JavaScript本の名著であるEloquent JavaScript2版のクラウドファンディングなど、14日間（8/31～9/13）のWeb開発最新ニュース合計18件を紹介します！</p>

<p><span id="more-2463"></span></p>

<h2>注目ニュースピックアップ</h2>

<h3>プログレッシブ・エンハンスメントはもう過去の話なのか?</h3>

<p><img src="/wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595.png" alt="progressive-enhancement:-zed’s-dead,-baby-:-tom-dale-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2490" srcset="/wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595.png 300w, /wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>この14日間はプログレッシブ・エンハンスメントについて多くの議論が行われた。</p>

<p>事の発端はDaniel Mall氏が始めた<a href="http://sighjavascript.tumblr.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sigh, JavaScript</a>という様々なWebサイトで、JavaScriptをオフにした際の状態をキャプチャしてリストするというTumblr。<br />
それに対して、Ember.jsのメンテナーであるTom Dale氏が<a href="http://tomdale.net/2013/09/progressive-enhancement-is-dead/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progressive Enhancement: Zed’s Dead, Baby</a>と題した記事で「プログレッシブ・エンハンスメントはもう終わったアプローチである」と宣言した。<br />
そのTom Dale氏の記事に、Jake Archibald氏が<a href="http://jakearchibald.com/2013/progressive-enhancement-is-faster/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progressive enhancement is faster</a>にて反論。
そして、Daniel Mall氏も<a href="http://danielmall.com/articles/progressive-enhancement/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">“Progressive Enhancement. Still Alive &amp; Kickin’.</a>でSign, JavaScriptを始めた理由を説明した。
これらの反論に対して、Tom Dale氏は<a href="http://tomdale.net/2013/09/maybe-progressive-enhancement-is-the-wrong-term/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Maybe Progressive Enhancement is the Wrong Term</a>にてプログレッシブ・エンハンスメントという言葉の意味は範囲を再確認している。
技術者的な視点だけではなく、デザイナからの視点でもこのトピックに対して様々な記事があがったりと、プログレッシブ・エンハンスメントそのものに対する興味関心の高さが分かるすばらしい議論となった。</p>

<h3><a href="http://stevelosh.com/blog/2013/09/teach-dont-tell/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">効果的なドキュメンテーションの作り方について &#8211; Steve Losh</a></h3>

<p><img src="/wp-content/uploads/2013/09/steve-losh-1024x768.png" alt="-steve-losh-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2477" srcset="/wp-content/uploads/2013/09/steve-losh-1024x768.png 300w, /wp-content/uploads/2013/09/steve-losh-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Teach, Don&#8217;t Tell</p>

<p>Steve Losh氏によるテクニカル文書、主にプログラミング言語やライブラリなどのドキュメンテーションの書き方について、7つのアンチパターンを通して、よりよいドキュメントを書くために覚えておきたいことをまとめている。<br />
自分でオープンソースとしてライブラリなどを公開している方はもちろん、会社やチームのガイドラインを作成している人にも、勉強会などでプレゼンをする人にもおすすめできるすばらしいアドバイス。</p>

<h3><a href="https://eloquentjavascript.net/2nd_edition/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Eloquent JavaScript 第二版 &#8211; Marijn Haverbeke</a></h3>

<p><img src="/wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768.png" alt="eloquent-javascript-second-edition-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2483" srcset="/wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768.png 300w, /wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Eloquent JavaScript second edition</p>

<p>JavaScriptを学ぶ上で読んでおくべき書籍は?という質問には確実に名を連ねてくるのがMarijn Haverbeke氏による「Eloquent JavaScript」。解説だけではなく、実際に手を動かすエクササイズがあったりと、当時としては画期的な書籍で、さらにクリエイティブ・コモンライセンスでオンライン版は無料で公開されている。<br />
2007年に執筆されたこの本は、現在第二版に向けて執筆を始めている。筆者はその執筆のためにクラウド・ファンディングをしているので、興味がある方はぜひファンドに協力してみてはいかがだろう。</p>

<h3><a href="http://www.miscmagazine.com/great-design-always-means-great-style/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">すばらしいデザインは常にすばらしいスタイルである &#8211; MISC Magazine</a></h3>

<p><img src="/wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768.png" alt="misc-magazine-|-great-design-always-means-great-style-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2488" srcset="/wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768.png 300w, /wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Great Design Always Means Great Style</p>

<p>Don Norman氏によるよいデザイン、よいスタイルについてのこの記事では、そもそもデザインにおけるスタイルとは単純な見た目のファッションではなく、パーソナリティのようなものではないかと説明。パーソナリティとは車でいうところのポルシェやBMV、メルセデス・ベンツのようなブランドに抱くイメージを分かりやすい例として紹介している。<br />
氏は記事を以下のように締めくくっている。
『すばらしいデザインとは常にすばらしいスタイルを意味する。正直で、理路整然としていて、一貫性があるものだ。』</p>

<h3><a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ResourcePriorities/Overview.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リソース・プライオリティ &#8211; W3C</a></h3>

<p><img src="/wp-content/uploads/2013/09/resource-priorities-1024x768.png" alt="resource-priorities-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2491" srcset="/wp-content/uploads/2013/09/resource-priorities-1024x768.png 300w, /wp-content/uploads/2013/09/resource-priorities-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Resource Priorities</p>

<p>パフォーマンスは今ではインフラ担当の人間だけの問題ではなく、もちろんフロントエンド開発者だけの問題でもなく、全員の問題だ。<br />
その全員にはもちろんW3Cも含まれる。<br />
Resource Prioritiesという仕様はまだドラフト段階ではあるが、画像やスクリプト、ビデオやオーディオに対して、lazyloadやpostponeという属性を追加できるようにするものだ。<br />
これらの属性はJavaScriptを使ってすでに解決されつつある問題ではあるが、仕様として存在する意義は大きい。</p>

<h2>海外トレンドコラム</h2>

<h3><a href="http://www.nczonline.net/blog/2013/09/10/understanding-ecmascript-6-arrow-functions/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScript 6のArrowファンクションについて &#8211; NCZOnline</a></h3>

<p><img src="/wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768.png" alt="understanding-ecmascript-6-arrow-functions-|-nczonline-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2494" srcset="/wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768.png 300w, /wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Understanding ECMAScript 6 arrow functions</p>

<p>ECMAScript 6で追加される予定のArrowファンクションについてNicolas Zakas氏による解説。<br />
Arrowファンクションはその名前の通り、関数のシンタックスを =&gt; このような矢印を使って置き換えることができるようになる。<br />
ただそれだけではなく、newができない、thisのバインディングが違うなどの点が異なる。</p>

<h3><a href="http://blogs.telerik.com/james-bender/posts/13-09-09/30-days-tdd-day-one-what-is-tdd" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">テスト駆動開発とはなにか、そしてどんなものなのか</a></h3>

<p><img src="/wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07.png" alt="30-days-of-tdd:-day-one-–-what-is-tdd-and-why-should-i-use-it?-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2478" srcset="/wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07.png 300w, /wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: 30 Days of TDD: Day One – What is TDD and Why Should I Use It?</p>

<p>テスト駆動開発にについて、30日間連続で書き続けるチャレンジの1日目。第一回目は、そもそもテスト駆動開発とはどんなものか、そして、その開発ワークフローをどうして利用するべきなのかを解説。</p>

<h3><a href="http://www.stevesouders.com/blog/2013/09/05/domain-sharding-revisited/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドメイン・シャーディングをもう一度振り返ってみよう &#8211; High Performance Web Sites</a></h3>

<p><img src="/wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768.png" alt="domain-sharding-revisited-|-high-performance-web-sites-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2482" srcset="/wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768.png 300w, /wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Domain Sharding revisited</p>

<p>パフォーマンスにおいて、SPDYやHTTP 2.0の時代が来るとアンチパターンになると言われている。だが、ドメイン・シャーディングというテクニックについて、スティーブ・サウダー氏は、そうとも言えないのではないかと話し、大抵のウェブサイトにおいては次の時代でも活用できるとしている。</p>

<h3><a href="http://www.shanehudson.net/2013/09/10/responsive-images-meeting-notes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レスポンシブ・イメージ会議メモ &#8211; Shane Hudson Dot Net</a></h3>

<p><img src="/wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768.png" alt="responsive-images-meeting-notes---shane-hudson-dot-net-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2492" srcset="/wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768.png 300w, /wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Responsive Images Meeting Notes</p>

<p>9/10にパリで開かれたレスポンシブ・イメージに関する会議のメモ。若干散文的ではあるが、会議で話された内容について大事なポイントをおさえているので、非常に参考になる。先日、webkitにてsrcsetが実装されたが、レスポンシブな環境における画像の取り扱いについて、まだまだ課題は多い。今後も目が話せないトピックだ。</p>

<h3><a href="https://github.com/andreineculau/know-your-http-well" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">いまさら聞けないHTTP</a></h3>

<p><img src="/wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae.png" alt="know-your-http-well-·-github-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2487" srcset="/wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae.png 300w, /wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Know Your HTTP Well</p>

<p>もう本当にいまさら聞けないHTTPにまつわる話を、仕様やヘッダ、メディアタイプ(今後追加される様子)、メソッド、ステータスコードなどのように区分し、それぞれ詳しく解説している。あっという間に1000スターという人気のほどなので、いまさら聞けないのは私だけではなかったようです。</p>

<h3><a href="http://dev.opera.com/articles/view/mutation-observers-tutorial/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mutation Observersの使い方 &#8211; Dev.Opera</a></h3>

<p><img src="/wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768.png" alt="getting-to-know-mutation-observers---dev.opera-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2485" srcset="/wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768.png 300w, /wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Getting to know mutation observers</p>

<p>JavaScriptが多く利用されるプロダクトの制作を行っているとあるDOMノードツリーが変わったタイミングを知りたいということはよくある。<br />
この記事で紹介をしているDOMレベル4仕様で定義されたMutation Observersは、これまで抱えてきた問題を解決してくれる。これまで利用してきたMutationEventとの違いを踏まえて、利用方法を解説。</p>

<h3><a href="http://gaslight.co/blog/does-coffeescript-have-a-future" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScriptに未来はあるのか?</a></h3>

<p><img src="/wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768.png" alt="does-coffeescript-have-a-future?-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2481" srcset="/wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768.png 300w, /wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Does CoffeeScript Have a Future?</p>

<p>CoffeeScriptはどんな役割を持った言語なのか、JavaScriptに変換される言語としてはよく使われる言語ではあるが、もしかするとJavaScriptそのものの変化にしたがって、もう必要がなくなるかも知れない。CoffeeScriptを愛してやまない著者のゆらぎを感じる非常にすばらしい記事。</p>

<h2>クローズアップ“ビデオ/スライド”</h2>

<h3><a href="http://www.youtube.com/watch?v=GNO_CYUjMK8" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGLの基礎と応用 &#8211; Steven Wittens</a></h3>

<p><img src="/wp-content/uploads/2013/09/StevenWittensMakingWebGLDance.png" alt="StevenWittensMakingWebGLDance" width="300" height="255" class="aligncenter size-full wp-image-2493" srcset="/wp-content/uploads/2013/09/StevenWittensMakingWebGLDance.png 300w, /wp-content/uploads/2013/09/StevenWittensMakingWebGLDance-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Making WebGL Dance</p>

<p><a href="https://html5experts.jp/cssradar/1995/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の本連載</a>にてピックアップしたActo.netのSteve Wittens氏による、WebGLのイントロダクションビデオ。非常にベーシックな三角形から描画し、アンチエイリアスなどから始め、徐々に3Dの世界へ導いていく。数学的なアプローチは難しい部分も多いが、最終的なアウトプットを見ると、チャレンジする価値があると思わせるプレゼンテーション。</p>

<h3><a href="http://www.youtube.com/watch?v=x0VR3lUOpdc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ジャンク・バスターズ: Google Chromeにおけるレンダリングパフォーマンスについて &#8211; Nat Duca &amp; Tom Wiltzius</a></h3>

<p><img src="/wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters.png" alt="NatDucaTomWiltziusJankBusters" width="300" height="255" class="aligncenter size-full wp-image-2489" srcset="/wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters.png 300w, /wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Jank Busters &#8211; Chrome Rendering Performance</p>

<p>GoogleのNat Duca氏とTom Wiltzius氏によるJank Bustersシリーズのアップデート版。これまで両氏は何回か同じトピックでプレゼンテーションを行ってきているが、最新版にアップデートされたもの。アニメーションだけではなく、レンダリングプロセスを最適化するために知っておいたほうがよいことばかりをコンパクトに解説している。</p>

<h2>一歩先行く“コード”</h2>

<h3><a href="http://labs.bigroomstudios.com/libraries/animo-js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">animo.js</a></h3>

<p><img src="/wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810.png" alt="animo.js-•-labs-by-big-room-studios-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2479" srcset="/wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810.png 300w, /wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>jQuery依存が気にならない、ことはないが、Dan Eden氏作の<a href="http://daneden.me/animate/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">animation.css</a>をベースに、連続したアニメーションを行うのに非常にシンプルなシンタックスで可能にしている。</p>

<h3><a href="http://snorpey.github.io/jpg-glitch/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JavaScriptでJPEG画像を壊してみよう</a></h3>

<p>原題: Image Glitch Experiment</p>

<p>正直なところ何の役に立つのかはわからないが、JavaScriptを使ってJPEG画像を破壊するツール。こういった実験的な実装は見ていて楽しいが、作るとより楽しいはず。</p>

<h3><a href="https://github.com/paulirish/frontend-feeds" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paul Irishおすすめ。フロントエンド開発者のためのフィード</a></h3>

<p><img src="/wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369.png" alt="frontend-feeds-·-github-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2484" srcset="/wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369.png 300w, /wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Frontend Feeds</p>

<p>私自身にとって、貴重な情報源であるGoogleのPaul Irish氏がまとめたフロントエンドデベロッパのためのフィード。<br />
以前にも彼はこの形式でフィードを共有していたが、今回はGitHub。Paulチョイスだけあって、非常にクオリティが高いのでおすすめ。</p>

<h2>海外で話題の“ツール”</h2>

<h3><a href="http://customelements.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Custom Element: モダンなWebアプリのためのWeb Componentsギャラリー</a></h3>

<p><img src="/wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768.png" alt="custom-elements---a-web-components-gallery-for-modern-web-apps-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2480" srcset="/wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768.png 300w, /wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Custom Elements &#8211; A Web Components Gallery for Modern Web Apps</p>

<p>まだまだ登録数は少ないが、Web ComponentsをGitHubのリポジトリから登録でき、検索可能にするギャラリーサイト。<br />
今後はコンポーネント数が増え、欠かすことができないツールになりえるかもしれない。</p>

<p>★次回の「斉藤祐也の海外WEBテク定点観測」は、9月30日にお届け予定です。★</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
