<?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>比留間 和也 &#8211; HTML5Experts.jp</title>
	<atom:link href="/edo_m18/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>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>JSだけでVRできる！『WebVR』ことはじめ</title>
		<link>/edo_m18/18552/</link>
		<pubDate>Wed, 23 Mar 2016 00:00:08 +0000</pubDate>
		<dc:creator><![CDATA[比留間 和也]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Oculus Rift]]></category>
		<category><![CDATA[VR]]></category>
		<category><![CDATA[WebVR]]></category>
		<category><![CDATA[three.js]]></category>

		<guid isPermaLink="false">/?p=18552</guid>
		<description><![CDATA[今年はVR元年と呼ばれています。 実は過去にも何度かVR元年と呼ばれ、VRが来る、と言われていた年があります。 ですが、今年はいよいよそれが本格的になりそうな状況になってきました。 そこで今回は、「今からWebVRに備え...]]></description>
				<content:encoded><![CDATA[<p>今年はVR元年と呼ばれています。<br />
実は過去にも何度かVR元年と呼ばれ、VRが来る、と言われていた年があります。<br />
ですが、今年はいよいよそれが本格的になりそうな状況になってきました。</p>

<p>そこで今回は、「今からWebVRに備えよう！」ということで、WebVRとはなにか、それを利用して何ができるのか、利用シーンはどうか、といったことに焦点を当てたいと思います。</p>

<h2>VR元年</h2>

<p>本格的になりそうなのはなぜか。まずひとつ挙げられるのはOculus Rift（詳細は後述）に代表される、いくつかのヘッドマウントディスプレイ（以下、HMD）が比較的安価に家庭で利用できるようになったことです。<br />
今年に発売される予定のものだけでも、<a href="https://www.oculus.com/en-us/rift/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Oculus Rift</a>、<a href="http://www.htcvive.com/jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTC Vive</a>、<a href="http://www.jp.playstation.com/psvr/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PlayStation VR</a>、<a href="http://www.getfove.com/jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FOVE</a>(開発キット版)など様々なHMDが市場に登場する予定になっています。<br />
またこれらが注目される理由として、現在のPCのハードウェア性能が、HMDの必要としている要件を満たしてきた、という点も大きいでしょう。</p>

<p>しかしながら、Oculus Riftに関して言えば 2,160 x 1,200 という高解像度の画面を90FPS、つまり1秒間に90回もレンダリングをしなければなりません。<br />
これは最近のPCであっても、ミドルハイクラス〜ハイエンドクラスのGPUが搭載されているPCが必要であり、安価と言っても「今までに比べて」という側面があることは否めません。</p>

<p>とはいえ、一般ユーザーが手にできるPCでそれを実現できる、というのはやはり大きなポイントでしょう。<br />
現在に至るまでVRは、研究所や政府機関、あるいは財力のある企業に限定されていました。<br />
Oculus Riftの登場により、その敷居が格段に下がったのが今年、というわけです。</p>

<p>例えば今までは大きなアミューズメントパークでしか体験できなかったようなことが家庭でもできる、と考えるとその凄さが実感できるでしょう？</p>

<h2>Oculus Rift</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/03/oculus-image.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/03/oculus-image-300x159.png" alt="oculus-image" width="300" height="159" class="alignnone size-medium wp-image-18553" srcset="/wp-content/uploads/2016/03/oculus-image-300x159.png 300w, /wp-content/uploads/2016/03/oculus-image.png 640w, /wp-content/uploads/2016/03/oculus-image-207x110.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>さて、そんな話題のOculus Riftとはなにか。<br />
VRの火付け役とも言えるOculus Riftは、ヘッドマウントディスプレイ、つまり頭にかぶるようにして利用するディスプレイです。<br />
今までのHMDとの大きな違いは、その視野の広さとヘッドトラッキング／ポジショントラッキング機能が搭載されたことです。</p>

<p>これらがなにをもたらしてくれるか。それは、圧倒的な没入感です。<br />
視野の広さにより、目に映るVRの世界はとても広く、「本当にそこにいるように」感じることができます。<br />
さらに、ヘッドトラッキング／ポジショントラッキングの機能により、右を向いたり、左を向いたり、当然上下も見ることができ、360度の世界を「見渡す」ことが可能となります。<br />
これらの機能によって圧倒的な没入感が生まれ、3D空間に入り込んでしまったような感覚を味わうことができるのです。</p>

<p>とはいえ、VRを説明する上で一番むずかしいのは、この没入感はHMDの機能によって「脳に錯覚」させている点です。<br />
つまりVRを体験したことがない人に言葉や動画だけではすべてを説明することができません。<br />
百聞は一見にしかず、という言葉が本当にぴったりです。</p>

<p>しかし逆を返せば、一度でも体験してもらえさえすれば、そのすごさと魅力を伝えることができるはずです。</p>

<h2>VRをWebに持ち込む意味</h2>

<p>そんな中、VRの波はWebの世界にもやって来ました。それが「WebVR」という仕様です。<br />
WebVRが何かと言うと、前述したOculus Riftに代表されるHMDをWeb上で動かそう、というものです。<br />
そうです。つまりOculus RiftをJavaScriptで動かすことができるのです。</p>

<p>WebVRの仕様や使い方についてはもう少しあとでお話しましょう。<br />
まずはVRをWebの世界に持ち込むことの意味を、筆者の考えを元に説明したいと思います。</p>

<h3>URLだけでコンテンツをシェアすることができる</h3>

<p>VRに限らず、Webのいいところはアプリなどのインストールなしに、ブラウザでアクセスするだけでコンテンツが体験・利用できるところです。<br />
これはVRについても同様のことが言えます。<br />
WebVRを利用したサイトとしては、<a href="http://mozvr.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MozVR</a>という、Mozillaの運営するサイトがWebVRを用いて実装されています。<br />
（Oculus Riftをお持ちの方は、アクセスしてみるとすぐにでも見ることができます。このように、URLをシェアするだけで体験してもらえるのも大きなポイントのひとつですね）</p>

<p>またWebということはデバイスを限定しない、という側面もあります。<br />
まぁ実際のところハードウェア性能だったり画面解像度だったり、理想と現実で違う部分もありますが、環境を限定しないようにしていく、という視点は大事なポイントでしょう。<br />
つまりなにが言いたいかと言うと、WebにVRを持ち込むことでひとつのVRコンテンツをOculus Rift向けとスマートフォン向けに提供できる、ということです。</p>

<p>実際に、筆者が勤める面白法人カヤックの<a href="http://vr.kayac.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">VR部のサイト</a>はWebGLで実装しており、Oculus Riftが接続されたPCかスマートフォンで閲覧するとVRモードで見れるようになっています。<br />
WebGLに対応したものであれば、お手持ちのスマートフォンで見ることができるのでぜひ見てみてください。</p>

<h2>WebVRをどうコンテンツに活用するか</h2>

<p>では実際に、VRをどうWebコンテンツにしていったらいいのでしょうか。<br />
正直なところを書いてしまうと、いかようにでもできる、というのが現時点での感想です。<br />
VRは3D空間に入り込んだように見せることができるため、本当に様々な分野に活用されています。<br />
ゲームはもちろんのこと、介護や医療などにも応用されています。</p>

<p>また最近では、VR空間上でコミュニケーションできる「<a href="http://shiropen.com/2016/03/12/14183" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BigScreen</a>」というソーシャルVRアプリが発表されました。<br />
FacebookもソーシャルとVRについて注目しています。<br />
個人的には、Skypeなどで行っている動画チャットによる会議なども、VRにすることでより自然な形で、オンライン上のやりとりができると考えています。</p>

<p>VRミーティングみたいなものはWebと相性のいい例です。なにせ、URLをシェアしてそこにアクセスするだけでミーティングが始められるわけですから。</p>

<p>以上のように、VRは様々な活用方法があり、あとはアイデア次第でいかようにもできる、というポテンシャルを秘めていると考えています。</p>

<h2>今からでもできる！　スマホVR</h2>

<p>さて、ではいよいよWebVRの仕様や使い方について解説していきます。</p>

<p>実のところ、スマホでのVRはWebVRはまったく関係ありません。<br />
というより、スマホにはVRコンテンツを表示する上で必要な機能がすでに備わっています。<br />
スマホには</p>

<ul>
<li>高解像度の画面</li>
<li>ジャイロセンサーによる頭の向きのトラッキング</li>
<li>VRコンテンツを表示するための高性能なCPU／GPU</li>
</ul>

<p>つまり、制作者側が準備さえすれば、すでにVRを体験する土台は整っている、というわけです。<br />
（実際のところはやはりそれなりのハードウェア性能が求められるので、iPhone6などの最近の端末が必要になることは否めませんが）</p>

<p>ある程度ユーザー環境を限定してしまうものの、Oculus RiftなどのHMDデバイスを持っていないユーザーに対して、それも圧倒的多数のユーザーに対してVRコンテンツを届けられるのは事実です。<br />
ただ一点だけ、解決しなければならない問題があります。<br />
それは、例えVRコンテンツを表示する準備ができたとしても、それを立体視する道具がなければ意味を成さないことです。</p>

<p>しかしご安心を。<a href="https://www.google.com/get/cardboard/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GoogleのCardboard</a>や<a href="http://hacosco.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ハコスコ</a>に代表される、段ボール製のゴーグルも最近では活発に発表されています。<br />
また、「<a href="http://www.amazon.co.jp/s/ref=nb_sb_noss_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;url=search-alias%3Delectronics&amp;field-keywords=VR%E3%82%B4%E3%83%BC%E3%82%B0%E3%83%AB" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">VRゴーグル</a>」などで検索してみると、プラスチック製の比較的しっかりしたゴーグルも様々なものが発売されていることも分かります。<br />
そしてどれもが1000〜3000円以内で購入することが可能です。</p>

<p>このように、圧倒的に安価にVRを始められるのもスマホVRのメリットです。</p>

<h2>実際にスマホVRを作ってみよう</h2>

<p>安価に体験できることは分かりました。しかしまだ読者の方の中には「でも作るのは大変なんでしょ？」と思われている方がいらっしゃるかもしれません。<br />
しかし、それも心配無用です。</p>

<p>WebVRの波に乗るように、すでにいくつかのフレームワークが登場しています。<br />
今回紹介するのは「<a href="https://github.com/borismus/webvr-boilerplate" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebVR Boilerplate</a>」です。</p>

<p>これを使えば、非常に手軽にWebVR（とスマホVR）の環境を構築することができます。<br />
このフレームワークはWebGLのライブラリとして有名な<a href="http://threejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Three.js</a>をベースに構築されています。</p>

<p>Three.jsに触れたことがある読者の方であれば、いくつかのスクリプトを読み込ませ、数行書き出すだけですぐにでもWebVRに対応させることが可能です。<br />
今回はこれを使って、ごく簡単なシーンのセットアップコードを見ながら、実際にVRコンテンツが手軽に作れることを実感してもらいたいと思います。<br />
（もしすでにThree.jsでコンテンツを作ったことがある方は、ぜひご自分のコンテンツをWebVR化してみてください）</p>

<h2>シーンの構築</h2>

<p>まずはThree.jsを使ってシーンを構築していきます。<br />
今回は長くなってしまうのでThree.jsの使い方などについての説明は割愛します。<br />
が、ごく簡単なシーンですので使ったことがない方でも、なんとなくどんなことをやっているかは分かるかと思います。</p>

<p>ちなみに今回のデモは<a href="https://github.com/edom18/html5-exp-webvr-demo" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Githubにソースコード</a>をアップしています。<br />
また<a href="http://edom18.github.io/html5-exp-webvr-demo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">実際に動くものも公開</a>しているので、どんなものかをすぐ見ることができます。</p>

<p>スマホで実際に実行した状態は以下のようになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/03/demo-image.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/03/demo-image-300x166.png" alt="demo-image" width="300" height="166" class="alignnone size-medium wp-image-18555" srcset="/wp-content/uploads/2016/03/demo-image-300x166.png 300w, /wp-content/uploads/2016/03/demo-image.png 640w, /wp-content/uploads/2016/03/demo-image-207x115.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a>
<a href="https://gyazo.com/d63bd8da3db4703b6600c71b73be6248" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">アニメーションgif</a></p>

<p><code>
// WebGLレンダラを生成
var renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setPixelRatio(window.devicePixelRatio);</p>

<p>// CanvasをDOMツリーに追加
document.body.appendChild(renderer.domElement);</p>

<p>// シーンを生成
var scene = new THREE.Scene();</p>

<p>// カメラを生成
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 10000);</p>

<p>// VR用コントローラを生成
var controls = new THREE.VRControls(camera);</p>

<p>// VR用エフェクトを生成（2分割の画面を構築する）
var effect = new THREE.VREffect(renderer);
effect.setSize(window.innerWidth, window.innerHeight);</p>

<p>// VRマネージャの生成
var manager = new WebVRManager(renderer, effect);
</code></p>

<p>まずはシーンのベースを構築します。<br />
シーンオブジェクト、カメラオブジェクト、あとはそれらをコントロールするコントローラにマネージャ、と名前を見ればなんとなくどんなことをやってくれるかが分かるオブジェクトたちをセットアップしています。<br />
Three.jsを触ったことがある人であれば何度も目にしている記述とほぼ同じことが分かると思います。</p>

<p>さて、土台を作ったらシーンの登場人物たちを作ります。<br />
冒頭で説明した通り、今回は宇宙空間に地球が浮いているようなものを想定しているのでそれらを作っていきます。</p>

<p><code>
// Skysphereの生成（星空）
var skysphereLoader = new THREE.TextureLoader();
skysphereLoader.load('img/bg_skyplane.png', onSkysphereTextureLoaded);
function onSkysphereTextureLoaded(texture) {
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;
    texture.repeat.set(4, 4);</p>

<pre><code>var geometry = new THREE.SphereGeometry(5000, 128, 128);
var material = new THREE.MeshBasicMaterial({
    map: texture,
    color: 0xffffff,
    side: THREE.BackSide
});

var skysphere = new THREE.Mesh(geometry, material);
skysphere.position.z = 0;
scene.add(skysphere);
</code></pre>

<p>}</p>

<p>// 地球オブジェクトの生成
var earth = new THREE.Object3D();
var earthLoader = new THREE.TextureLoader();
earthLoader.load('img/earth.jpg', onEarthTextureLoaded);
function onEarthTextureLoaded(texture) {
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;</p>

<pre><code>var geometry = new THREE.SphereGeometry(0.3, 32, 32);
var material = new THREE.MeshLambertMaterial({
    map: texture,
    color: 0xffffff
});

earth = new THREE.Mesh(geometry, material);
earth.position.z = -1;
scene.add(earth);
</code></pre>

<p>}</p>

<p>// ライトの生成（地球を斜め上から照らしたような演出にします）
var light = new THREE.DirectionalLight(0xffffff);
light.position.set(1, 1, 1);
scene.add(light);
</code></p>

<p>これで宇宙（星空）と地球、そして太陽に照らされているような演出ができあがりました。<br />
現時点で実行して見ると宇宙空間に地球が浮いている様子が描画されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/03/earch-capture.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/03/earch-capture-300x233.png" alt="earch-capture" width="300" height="233" class="alignnone size-medium wp-image-18556" srcset="/wp-content/uploads/2016/03/earch-capture-300x233.png 300w, /wp-content/uploads/2016/03/earch-capture.png 640w, /wp-content/uploads/2016/03/earch-capture-207x160.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>さぁ、いよいよ最後の部分です。<br />
VRモードで見るにはジャイロで動かして、さらに立体視できるように画面を分割して表示する必要があります。</p>

<p>ジャイロで動かしたり、地球を回転させたり、といったことを実現するにはそのためのループ処理（アニメーションループ）を実装します。<br />
そのループ処理の中で地球の回転や、ジャイロをカメラに伝える処理を記述します。<br />
それを実現するのが以下の記述です。</p>

<p><code>// アニメーションループ
var lastRender = 0;
function animate(timestamp) {
    var delta = Math.min(timestamp - lastRender, 500);
    lastRender = timestamp;</p>

<pre><code>earth.rotation.x += delta * 0.000015;
earth.rotation.y += delta * 0.000025;

// VRコントローラのupdate
controls.update();

// VRマネージャを通してシーンをレンダリング
manager.render(scene, camera, timestamp);

// アニメーションループ
requestAnimationFrame(animate);
</code></pre>

<p>}</p>

<p>// アニメーションの開始
animate(performance ? performance.now() : Date.now());</code></p>

<p>アニメーションループ部分です。<br />
どうですか？　拍子抜けしましたか？<br />
見てみるとアニメーションのループの中で実際になにかしら計算っぽいことをしているのは、地球を回転させる処理だけです。<br />
それ以外はすべて、VRコントローラとマネージャが引き受けてくれます。</p>

<p>あとはこれを実際に実行してみれば、冒頭で紹介したデモと同じ状態が再現されます。</p>

<p>いかがでしょうか。こうしたフレームワークを使うことで、WebVRとスマホVRは驚くべき手軽さで実現することができるのです。</p>

<h2>WebVRでOculus Riftを動かそう！</h2>

<p>前述まででいかに手軽にスマホVRが制作できることが分かっていただけたかと思います。<br />
さて、だいーぶ前置きが長くなってしまいましたが、ここから本題です。</p>

<p>WebVRのAPIを利用してOculus Riftを動かすところを見てみましょう。<br />
実のところ、このAPI自体も自分自身で触ることはほぼないでしょう。<br />
前述したWebVR BoilerplateにはWebVRをラップしたいくつかの便利ライブラリが含まれています。</p>

<p><strong>※ 現時点の最新仕様はWebVR1.0となっており、執筆時点ではまだ正式対応がされていないようですが、WebVR1.0向けのブランチが存在しているので、そちらをダウンロードしてきて利用してもいいでしょう。</strong></p>

<p>WebVR Boilerplateを使って実装した上記の地球デモはすでにWebVRのAPIに対応した状態になっています。<br />
（ただし、上でも触れた通り、Oculus Riftの最新のRuntimeが入った状態だと、masterブランチのものでは動作しません。また、WebVR1.0に対応したブランチであっても、WebVR1.0に対応しているのはChromiumの専用ビルドだけなので注意してください）</p>

<p>ごく簡単なセットアップだけでOculus RiftとスマホVRに両対応できるのはとてもメリットです。</p>

<p>ではいよいよWebVRのAPIを説明していきましょう。<br />
・・・といきなり言われても、おそらくOculus Riftを持っている方のほうが少ないでしょう。<br />
（なんせ製品版は10万円近くもしますからね）</p>

<p>なので今回は、WebVRのAPIがどんなものなのか、それをどう使うのか、ということを解説したいと思います。<br />
最初に断っておくと、WebVRのAPI自体はとても簡単なものです。<br />
事実、APIから取得できる頭の位置、回転の情報を取得してそれをThree.jsのカメラの位置や回転に変換して適用してやるだけです。<br />
極論な例を挙げるなら、ジャイロセンサーの値をなにかしらのスマホコンテンツに利用するのとほぼ同じことと言えます。</p>

<p>デバイスから値を取り出し、それを使う。</p>

<p>本当にただこれだけです。</p>

<p>しかしVRを表現する上でスクラッチで書くには大変な部分もあります。<br />
下のキャプチャのように、中央から半分に分割されたVRの動画や画像をよく見かけると思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/03/oculus-scene.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/03/oculus-scene-300x187.gif" alt="oculus-scene" width="300" height="187" class="alignnone size-medium wp-image-18557" srcset="/wp-content/uploads/2016/03/oculus-scene-300x187.gif 300w, /wp-content/uploads/2016/03/oculus-scene-207x129.gif 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>画面を半分にし、それぞれの視点（左右の目）から見た状況をレンダリングする必要があるのです。<br />
（上の画像をよーく見ると、若干左右の画面に違いがあるのが分かると思います）</p>

<p>しかし今回は、WebVR APIの使い方のイメージを掴んでいただくために、上記のレンダリングについては触れません。<br />
これをスクラッチでやろうとすると、行列の知識や3Dの表現方法についての前提知識が必要となってしまい、説明するにはさらに多くの文章を必要としてしまうため、今回は割愛させていただきます。<br />
ただ上でも書いた通り、このあたりの処理を自前で書く、ということはほぼゼロと言っていいでしょう。</p>

<p>そのため、内部的にどういう動作をしているか、を理解するにとどめておくだけで十分だと考えています。</p>

<p>今回はThree.jsのリポジトリに含まれている、VRControlsの実装を参考に、WebVR1.0に対応させたコードを紹介します。</p>

<p><code>
var vrDisplay;</p>

<p>// VR Displayオブジェクトを取得
navigator.getVRDisplays().then(function (displays) {
    if (displays.length === 0) {
        console.log('WebVR API is not supported.');
        return;
    }</p>

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

<p>});</p>

<p>// VRモードに移行
function toVRMode() {
    var canvas = document.getElementById('canvas');
    vrDisplay.requestPresent({
        source: canvas
    });
}</p>

<p>//////////////////////////////////////////////////</p>

<p>// カメラの位置、回転を制御
(function loop() {
    // VRDisplayに実装されている<code>requestanimationframe</code>を利用する
    vrDisplay.requestAnimationFrame(loop);</p>

<pre><code>var pose = vrDisplay.getPose();

var orientation = pose.orientation;
camera.quaternion.fromArray(orientation);

var position = pose.position;
camera.position.fromArray(position);
</code></pre>

<p>}());
</code></p>

<p>とてもざっくりですが、WebVRのAPIを使った処理になります。</p>

<p><code>navigator.getVRDisplays</code>メソッドを利用してVRデバイスオブジェクトを取得します。<br />
基本的にこのオブジェクトを介して処理を進めていくことになります。</p>

<p><strong>注意</strong>
先にも書きましたが、<code>getVRDisplays</code>はWebVR API1.0の仕様であり、それ用にビルドされたChromiumでしか動きません。（執筆時：2016.03.15）<br />
FirefoxもWebVRに対応していますが、以前の仕様で実装されており、<code>getVRDevices</code>メソッドがその役割になります。<br />
しかし、取得できるデバイスオブジェクト自体が異なるため、今回紹介した方法では動きません。</p>

<p>上記で利用しているメソッドは以下です。</p>

<ul>
<li>requestPresent</li>
<li>requestAnimationFrame</li>
<li>getPose

<ul>
<li>pose.position</li>
<li>pose.orientation</li>
</ul></li>
</ul>

<p><code>requestPresent</code>メソッドはその名の通り、VRモードを表示するメソッドです。<br />
フルスクリーンになり、上のほうで掲載した歪んだ画面を表示するためのものです。</p>

<p><code>requestAnimationFrame</code>は<code>window</code>に生えているものとは別のものになります。<br />
というのも、<code>window</code>に生えているものは基本的に60Hzで動作するのに対し、VRではさらにその上の、90〜120Hzが要求され、frame数が合わないためです。<br />
なので、VRモードではこちらを利用します。</p>

<p>一番注目してもらいたいのが<code>getPose</code>で取り出される値です。<br />
読んで字のごとく、HMDの姿勢（pose）を取得するものです。</p>

<p>ここに、HMDがトラッキングした位置と回転情報が格納されています。<br />
これをそのままカメラの制御に利用すれば、HMDの情報がそのままカメラに伝播し、結果としてVR空間を好きなように見渡すことが可能になる、というものです。</p>

<p>Three.jsを利用すれば、こうしたカメラなどが抽象化され、3Dに対しての知識があまりなくても実装することが可能です。<br />
Oculusを持っている方はぜひ、簡単なサンプルでも構わないので作ってみてみてください。<br />
自身が作ったものが目の前で動いているのは、どんなにシンプルなものでも感動するはずです。</p>

<p>コードを見てもらうと気づくと思いますが、カメラやエフェクトの部分以外はWebGLでコンテンツを作ることとまったく同じです。<br />
あとはこれらを組み合わせてなにを作るか。アイデアさえ出てくれば、きっと様々なVRコンテンツを作ることができることと思います。<br />
ぜひ、これを機会にVRコンテンツ制作に手を出してみてください。</p>

<p>ちなみに、WebVR1.0の実装についてもっと詳しく知りたい方は、<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>にセットアップから実行までの解説が載っているので参考にしてください。（<a href="https://mozvr.github.io/webvr-spec/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様はこちら</a>）</p>

<h2>最後に</h2>

<p>いかがだったでしょうか。<br />
VRと言っても、コンテンツの作り方はWebGLとそう大きくは変わりません。<br />
コンテンツの良し悪しはWebGLでのコンテンツの良し悪しに直結します。</p>

<p>ただVRならではの問題もあり、例えば目の前を覆ってしまうため、キーボードやマウスなどのデバイスを使っての操作はあまり向かないでしょう。<br />
ゲームパッドのようなものはまだ大丈夫かもしれません。<br />
そのため、UIに関してはまだまだこれだ、という状況になっておらず、今後も様々な研究結果が出てくるものと思われます。</p>

<p>ただどちらにせよ、UIの作り方自体はWebGL（3D）上での話になるため、制作過程についてはVRのために、というよりもWebGLでどう作るか、を学ぶことで解決できると思います。</p>

<p>VRという新しい技術をどう活かすか。それは制作者である読者の方の考え方次第で無限に広がっていくと思っています。<br />
ぜひこの機会にVRコンテンツの制作を開始してみてください。<br />
（例えばモデルルームをVRで観ることができる、というものは実際に行っている例があります）</p>

<p>筆者はスマホVRが市場を牽引してくれると信じています。<br />
さらに言えば、Webで展開されるスマホVRがよりその力が強いでしょう。</p>

<p>しかしそのためにはみなさんの力が必要です。<br />
ぜひいろいろなVRコンテンツを世に広め、VRを体験したことがある人を増やせるようにしていただけると幸いです。</p>
]]></content:encoded>
			</item>
		<item>
		<title>RAIZIN Coolで学ぶ、イマドキのWebサイトの作りかた</title>
		<link>/edo_m18/991/</link>
		<pubDate>Wed, 24 Jul 2013 20:00:01 +0000</pubDate>
		<dc:creator><![CDATA[比留間 和也]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[グラフィカルWeb]]></category>

		<guid isPermaLink="false">/?p=991</guid>
		<description><![CDATA[連載： イマドキのWebアプリの作りかた (3)HTML5 Canvasを利用した冷気の演出が話題となった「RAIZIN JAPAN」のデモサイト。エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/app-lobo/" class="series-150" title="イマドキのWebアプリの作りかた" data-wpel-link="internal">イマドキのWebアプリの作りかた</a> (3)</div><p>HTML5 Canvasを利用した冷気の演出が話題となった<a href="http://raizin-japan.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「RAIZIN JAPAN」</a>のデモサイト。エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ第二弾は、RAIZIN Coolの実装を徹底解説します。</p>

<!-- more -->

<h1>HTML5 Canvasを利用した簡易的な冷気の演出</h1>

<p>最近の仕事で実装したものが海外の、しかも<a href="http://techwave.jp/archives/raizin_cool_use_canvas_viporeffect.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">米シリコンバレーで話題</a>になりました。<br />
社内でもそうした簡単にできる（けど簡単そうに見えない）簡易的な実装に注目が集まり、ちょっとした話題になったので解説しつつ紹介したいと思います。</p>

<p>※今回の解説用に、jsdo.itに実際に動くサンプルをアップしました。<br />
さらに今回の解説用に特別に動作が分かりやすくなるオプションも追加しています。↓
(invalid jsdo.it code)</p>

<p>今回紹介するのは<a href="http://raizin-japan.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RAIZIN</a>というエナジードリンクの新バージョン<a href="http://raizin-japan.com/cool/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「Cool」のLP</a>です。<br />
当初はとても時間がタイトで限られた予算での実施ということもあり、まったく動きのないペライチにしようという話になっていました。</p>

<p>しかしそれだとどうしてもインパクトが出ない。<br />
<strong>「時間と予算が限られた中で、それでも少しでもインパクトのあるものが作りたい」</strong><br />
とエンジニアとデザイナーで話し合いました。</p>

<p>あ、ちなみにこの記事を書いているのは私ですが、方向性、実装方法などおおまかに話したあとは<strong>実装は社内の別のエンジニアが行なっています</strong>。</p>

<h2>どこに人はリアリティを感じるか</h2>

<p>話し合いは、まずはどうしたらリアリティが出るか、という話をメインに行いました。<br />
話し合い時点である程度デザインはでき上がっていたので、それを元にどうしたらリアリティが出るか、どういう演出が考えられるかを話し合いました。</p>

<p>最初に着目したのは冷気。まぁここは当然ですね。なにはなくとも冷気がなければ冷えている感、Cool感は出ません。問題はこれをどう動かすか、でした。<br />
当然、高度な物理演算を用いて冷気をリアルに動かす、ということも考えましたが、当然時間が足りない。（それこそ、1～2日くらいしか時間が残されていなかった）</p>

<p>みんなであれこれ話していて、冷気の動きは実は3種類くらいしかないのでは、とひらめきました。</p>

<ul>
<li>缶から出て下に落ちる縦の動き</li>
<li>それが地面に到達してわだかまり、渦を巻いている状態</li>
<li>たまった冷気が缶から離れていく横の動き</li>
</ul>

<p>おおまかに動きを分解すると、この3つの動きだけで実装できそうだと気づきました。<br />
閃いてからは話は早く、あとはそれをどう実装するか、という話になります。</p>

<h2>Canvas要素を使って冷気表現</h2>

<p>今回選択したのはHTML5から定義されたCanvas要素。<br />
冷気の動きには回転を含んでいたのと、冷気同士の色みを合成することを考えて選択しました。</p>

<p>実際に実装を始めてみるといくつか問題がありました。</p>

<ul>
<li><strong>冷気の画像は左右で対象なので同じタイミングで出すとバレる</strong><br />違う画像をデザイナーに頼もうかと思いましたが、時間も素材を用意できるか微妙だったので、左右で煙の出るタイミングをずらしたらほとんど目立たなくなりました。</li>
<li><strong>回転する冷気は縦横に比べて速度を落とす</strong><br />回転する冷気は、縦と横で動いている冷気よりも目立ってしまったので、回転速度をだいぶ遅くしたら違和感がなくなりました。</li>
<li><strong>冷気の最初はグラデーションマスク</strong><br />縦に動く画像の出始めの部分は、缶から冷気が出ているというより空中から出ているようになるので、上からグラデーションで透明にしたマスクを置きました。</li>
</ul>

<p><img src="/wp-content/uploads/2013/07/mask.png" alt="マスク画像" /></p>

<p>最終的には冷気の出現の仕方・速度を調整することでだいぶリアリティのあるものができました。<br />
やはり、予算や時間がタイトな案件は多くあるもの。その中でどうしたら表現したいものに最大限近づけることができるか。<br />
本当に計算をして表現する以外に方法がないか模索してみるといいと思います。</p>

<h2>構造を分解</h2>

<p>今回作成したものは上記で書いた通り比較的簡易な表現になっています。<br />
そのため、レイヤー構造もとてもシンプル。<br />
おおまかに構造を分解したものが以下の画像です。</p>

<p><img src="/wp-content/uploads/2013/07/explanation.jpg" alt="仕組みの分解解説" /></p>

<h3>全体は3つのレイヤーのみ</h3>

<p>見てもらうと分かる通り、メインとなる缶の画像を含めても3つのレイヤーしかありません。<br />
構造は</p>

<ul>
<li>メインの缶画像レイヤー</li>
<li>冷気を表現するCanvasレイヤー</li>
<li>マスクレイヤー</li>
</ul>

<p>の3つです。</p>

<p>DOM要素的にはもっとありますが、レイヤーとしては3つです。</p>

<h3>Canvas内のレイヤーも3つ</h3>

<p>さらに演出のメインとなるのはCanvas要素のみです。<br />
そのCanvas要素内で動いているものも3つのレイヤーからなっています。</p>

<p>冒頭に書いた<strong>「気付き」</strong>を元に構成したものです。つまり、「縦・横・回転」の3レイヤーです。　　
これをそれぞれ個別にアニメーションさせながら今回の演出を表現しています。</p>

<p>アニメーション自体は実にシンプルで、縦・横ともにひとつのPNG画像をうまくループするように配置しアニメーションさせるだけです。<br />
回転に関してはさらにシンプルで、移動はせず、単純に配置された場所でゆっくりと回転させるだけです。Canvasアニメーションを実装したことがある人ならそれこそものの数分で作れる演出です。</p>

<p>それぞれのアニメーションで使用した画像は以下の3つだけです。</p>

<p><img src="/wp-content/uploads/2013/07/sample-raizin-side.png" alt="縦演出用冷気画像" /><br />
縦にループさせている画像</p>

<p><img src="/wp-content/uploads/2013/07/sample-raizin-under.png" alt="横演出用冷気画像" /><br />
横にループさせている画像</p>

<p><img src="/wp-content/uploads/2013/07/sample-raizin-corner.png" alt="回転演出用冷気画像" /><br />
回転させている画像</p>

<h2>jsdo.itのサンプルを動かして理解しよう</h2>

<p>冒頭でも書きましたが、今回制作したものがどういう仕組で動いているのか確認できるものを<a href="http://jsdo.it/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">jsdo.it</a>にアップしました。<br />
各項目をOn/Offすることで動作がどういうものか理解できるかと思います。参考にしてみてください。</p>

<p>ちなみに3Dをオンにしたあとはさらに<strong>ドラッグで回転</strong>することができます。<br />
どういう構造になっているのかを理解するのに役立つと思うのでそちらも参考にしてみてください。<br />
<strong>※jsdo.it上にアップしたサンプルは、実際のサイトに公開されているものとは別物です。<br />
動作確認がしやすいように、処理を最適化しています。</strong></p>

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

<h2>話題にされた記事</h2>

<ul>
<li><a href="http://techwave.jp/archives/raizin_cool_use_canvas_viporeffect.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「RAIZIN JAPAN」HTML5 CANVASを使用した冷気の表現が話題に 【@maskin】</a></li>
<li><a href="http://www.ideaxidea.com/archives/2013/07/canvas_frozen.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5で冷気を表現したサイトがすごいな</a></li>
<li><a href="http://squeeze.jp/blog/web-design/making-of-canvas-frozen/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「HTML5で冷気を表現したサイトがすごいな」を分解してみた！</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[イマドキのWebアプリの作りかた]]></series:name>
	</item>
	</channel>
</rss>
