<?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>WebVR &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/webvr/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、AR、MR……各領域のプロフェッショナルが語るxR技術の最先端──Webの未来を語ろう 2018</title>
		<link>/tokutoku393/25205/</link>
		<pubDate>Mon, 19 Mar 2018 01:00:01 +0000</pubDate>
		<dc:creator><![CDATA[ちゃんとく]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[HoroLens]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Mixed Reality]]></category>
		<category><![CDATA[VR]]></category>
		<category><![CDATA[WebVR]]></category>
		<category><![CDATA[WebXR]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[three.js]]></category>

		<guid isPermaLink="false">/?p=25205</guid>
		<description><![CDATA[連載： Webの未来を語ろう 2018 (2)こんにちは、dotstudioのちゃんとくです。HTML5Experts.jpでは、昨年に引き続き新春企画として「Webの未来を語ろう 2018」を開催することになりました！...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/future-of-web-2018/" class="series-496" title="Webの未来を語ろう 2018" data-wpel-link="internal">Webの未来を語ろう 2018</a> (2)</div><p>こんにちは、dotstudioのちゃんとくです。HTML5Experts.jpでは、昨年に引き続き新春企画として「<strong>Webの未来を語ろう 2018</strong>」を開催することになりました！</p>

<p><a href="https://html5experts.jp/yoshikawa_t/25150/" data-wpel-link="internal">ブラウザ編</a>に続く第2弾の今回は、2017年初頭のHoloLens発売に始まり、ARKit/ARCoreとスマートフォン対応の拡充、各地にVR Zone誕生と話題を集め、一挙にホットトピック入りした<strong>xR技術の現在と未来</strong>について。各領域のプロフェッショナルを招き、編集長の<a href="https://html5experts.jp/shumpei-shiraishi/" data-wpel-link="internal">白石</a>氏をMCに、さまざまな立場から意見交換を行っていただきました。</p>

<p>広がるxR領域の現状と課題、そして未来への期待について、なかなか聞けない学会話や開発事情など、たっぷりとお楽しみください！</p>

<p><img src="/wp-content/uploads/2018/03/main.jpeg" alt="" width="640" height="419" class="alignnone size-full wp-image-25369" srcset="/wp-content/uploads/2018/03/main.jpeg 640w, /wp-content/uploads/2018/03/main-300x196.jpeg 300w, /wp-content/uploads/2018/03/main-207x136.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>ゲスト紹介</h2>

<h3>諸星 一行氏（いっこう氏）</h3>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/ac6195dd-0797-4d6d-dab2-54229bb00067.jpeg" width="200" height="200" class="alignleft size-medium" /><strong>Mercari, Inc. R4D</strong><br />
株式会社メルカリの研究開発組織&#8221;R4D&#8221;でVR/AR/MR領域を担当するリサーチエンジニア。
業務の傍らで&#8221;xR Tech Tokyo&#8221;や&#8221;例のハッカソン&#8221;といった勉強会やハッカソンなどのコミュニティ運営を行なっている。日本バーチャルリアリティ学会認定VR技術者。</p>

<div style="clear:both"></div>

<p><br /></p>

<h3>前本 知志氏</h3>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/0dd4dbdc-2309-afad-1f64-53cac8f4b7ad.jpeg" width="200" height="199" class="alignleft size-medium" /><strong>株式会社ホロラボ</strong> / <strong>システムフレンド Co-founder（取締られ役 兼 取締役）</strong><br />
数年前よりモーションセンサーの面白さに取りつかれKINECTを趣味で触り始め、会社にXRや医療機器開発のチームができる。 
センサー系飲み会コミュニティTMCNや、HoloLensに特化した株式会社ホロラボの立ち上げメンバー。
米国MicrosoftよりMixedReality分野のMVPとして認められている。</p>

<div style="clear:both"></div>

<p><br /></p>

<h3>千葉 慎二氏</h3>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/e40d6dee-996f-606d-9818-3b2efa598c8c.jpeg" width="200" height="200" class="alignleft size-midium" /><strong>日本マイクロソフト株式会社</strong><br />
ハドソン中央研究所でゲームのベースシステム等を開発後、Microsoftに転職。ゲーム機向けWindows OSやXbox SDKの開発などを行う。
近年はKinect、HoloLensといった新技術を啓蒙し、研究者や学生向けの支援活動を担当。</p>

<div style="clear:both"></div>

<p><br /></p>

<h2>2017年に印象に残ったxR領域のトピックは？</h2>

<p><strong>白石:</strong> 皆さま、本日はお集まりいただきありがとうございます！まずは簡単に自己紹介と、2017年のxR界隈で1番印象に残ったことを教えてください。</p>

<p><strong>いっこう:</strong> こんにちは、メルカリのいっこうです。2017年のホットトピックは、<strong>MicrosoftがxR領域に本腰を入れてきたこと</strong>ですね。HoloLens、immersiveと、デバイスをいろいろと出してきたのが衝撃的でした。</p>

<p><strong>前本:</strong> 株式会社システムフレンドや株式会社ホロラボで取り締まられ役をしている前本です。僕にとっても、<strong>HoloLensが発売されたこと</strong>は大きな出来事でした。HoloLensが出たから、ホロラボという会社も<a href="http://holomagicians.azurewebsites.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HoloMagicians</a>というコミュニティもできましたし。HoloMagiciansでのHoloLens日本発売直後のイベントで、80人もの購入者が一同に集まってみんなで繋げたワクワク感はすごかったです。</p>

<p><strong>白石:</strong> 80人×約30万……2400万円……。お金の話になるとすぐ計算しちゃう（笑）。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/46be4ac3-fcc2-a15f-f370-af68ec4ba176.jpeg" alt="DSC09322.jpg" title="DSC09322.jpg" />
▲ 発売からわずか2週間後に80人が集ったHoloMagiciansミートアップ</p>

<p><strong>千葉:</strong> Microsoftの千葉です。もともとはハドソンというゲーム会社でゲームの根底となる部分のシステム開発をしていて、Microsoftに転職してからは16年くらいずっとXboxチームにいました。HoloLensはKinectから派生してできたところがあって、Xboxチームでは一部Kinectの開発にも携わっていたので<strong>私がHoloLensのプロトタイプを見たのは実はかなり前のこと</strong>なんですよね。その頃から開発を続けて、ようやく世に出てきたな、という感覚です。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/4d92caa6-242c-6072-36cb-cdb05cc3ecb3.jpeg" alt="DSC09334.jpg" title="DSC09334.jpg" />
▲ Xboxをローンチした人にだけ配られるというジャンパーを着た千葉氏</p>

<p><strong>前本:</strong> 千葉さんのことはKinect時代から尊敬しているんですよ！僕は当時からKinectで遊んでいて、それがどんどん進化してHoloLensの形になるのを目の当たりにして、感動です。</p>

<p><strong>千葉:</strong> お二人がHoloLensをトピックに挙げてくださったように、私にとっては<strong>多くの人にHoloLensを使っていただいている</strong>ということが2017年最も印象深いことです。それとMicrosoftに勤めながら、東京女子医科大学で学生としてHoloLensを使った医療の研究をしています。業務でも研究でもHoloLensを使っています。</p>

<p><strong>白石:</strong> えーっ、じゃあ千葉さんは女子大生？周りは女子ばっかりですか？</p>

<p><strong>千葉:</strong> 私がいるのは大学院なので、おじさんばかりですよ（笑）。</p>

<p><strong>白石:</strong> ちなみに私はHTML5Experts.jpの編集長と、<a href="https://techfeed.io/main/realtime/now" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>というエンジニア向けのキュレーションサイトを作っています。私自身はWeb領域の人間でxRについては素人なので、今日はバンバン質問させていただきます！</p>

<h2>VR/AR/MRとは何か？デモで見る各領域の現在</h2>

<h3>現実と仮想が複合するMRの世界観</h3>

<p><strong>白石:</strong> 2017年のホットトピックはお三方とも「HoloLens」に関することで一致しましたね。まずはMRについて、現在の様子を伺っていきたいと思います。</p>

<p><strong>千葉:</strong> まず伺ってみたいんですが、「Mixed Reality（MR）」という言葉について正しく理解している自信があるという方？</p>

<p>（会場、手が挙がらない）</p>

<p><strong>千葉:</strong> なかなかいないですよね。それが一つ、現状の課題なんです。簡単に言うと、MRは現実の世界と仮想の世界が融合しているという形です。どう融合するかにも、現実世界の中に仮想世界を入れ込むとか、逆に仮想世界に現実世界を入れ込むとか、いろいろな考え方があります。MRは、<strong>テレビの中に入り込んで、仮想のつくられた世界を見渡すことができ、そこから現実の世界も覗くことができる</strong>、というような考え方です。</p>

<p><strong>白石:</strong> <strong>仮想と現実がMixする</strong>、という意味合いなんですね。HoloLensのデモでは、現実世界をキャラクターが動いたり、現実の壁を割っていたり、というのを見ますが、それはどちらなんですか？</p>

<p><strong>前本:</strong> その捉え方は宗教論争に近いものがあるんですよ。</p>

<p><strong>いっこう:</strong> Microsoftさんの提唱するMRと、もともと日本バーチャルリアリティ学会が学問として20年以上研究している考え方とで違う部分があるんです「VimかEmacsか」という話に近いです（笑）。</p>

<p><strong>白石:</strong> あー、よくわかりました。それは大変だ（笑）。どういう部分でお互いに違うなと思っているんですか？</p>

<p><strong>千葉:</strong> デバイスを主体で見るか、現実世界を主体で見るかなど……考え方の違いですね。揉めているわけではなく、「そういう考え方もあるよね」という感じなんですが。</p>

<p><strong>白石:</strong> なるほど。話の抽象度が高まってきたので、HoloLensの現在がわかるデモがあるといいんですが。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/8de2e5a6-237c-051a-255c-189191a7e61d.png" alt="スクリーンショット 2018-02-12 22.07.34.png" title="スクリーンショット 2018-02-12 22.07.34.png" />
▲ DNP「AR/VR/MRを活用した体感型デジタルショールーム」（<a href="https://www.youtube.com/watch?v=TNi9cK-YfJY" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">動画リンク</a>）</p>

<p><strong>前本:</strong> これはHoroLensだけでなく他のデバイスや技術を組み合わせたデジタルコンテンツエキスポでの展示なんですが、<strong>シェアリング</strong>という技術を使って同じ空間を共有する仕組みです。</p>

<p><strong>白石:</strong> これはHoloLensと、スマートフォン？</p>

<p><strong>前本:</strong> そうです。HoloLensとGoogle Tangoの技術を使って、<strong>デバイス同士がお互いの位置を認識し、他の人が操作したことを他のデバイスでも検知できる</strong>ようになっています。「いま隣の人がこの商品をいいねした」とか、「この商品を買った」とか、デバイスを介して共有できる仕組みです。</p>

<p><strong>千葉:</strong> <strong>複数の人が同じ世界をそれぞれ見ることができる</strong>、というのがシェアリングですね。</p>

<p><strong>前本:</strong> 実はtoBの事例も増えてきて、製造業とかデザインの現場とかで活用が進んでいるんですよ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/52ac2d0d-18b4-af80-82f9-2b8d3e8922ac.png" alt="スクリーンショット 2018-02-12 22.21.22.png" title="スクリーンショット 2018-02-12 22.21.22.png" />
▲ ホロラボ「AR CAD Cloud」（<a href="https://www.youtube.com/watch?v=YkCALqPSO1E" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">動画リンク</a>）</p>

<p><strong>前本:</strong> AR CAD Cloudは、CADデータをHoloLensにダウンロードしてその場ですぐに見られるサービスです。<strong>モノを作る前に、作ったらどうなるかが確認できる時代</strong>になっています。</p>

<p><strong>千葉:</strong> <strong>日本で一番最初に業務にHoloLensを取り入れた事例は、日本航空さん</strong>ですね。1つはパイロットの訓練向け、もう1つは整備士の訓練向けシミュレーションです。飛行機は飛ばしていないと利益効率があがらないので実機での練習は難しく、シミュレータも好きな時に使えるわけではなかった。新人の方なんかは、机の上に印刷した紙を広げて手を置いて、ということをしていたらしいです。</p>

<p>VRでもいいんじゃないかと思うかもしれないですが、訓練では<strong>自分の手が認識できること</strong>が重要だそうで、外の世界をシースルーで見ることができるHoloLensが向いていたようです。</p>

<p><strong>白石:</strong> MRとVRは似たようなことができそうだけど、確実な違いがあるんですね。MRのいいところは「現実世界も見えている」というところですかね。</p>

<p><strong>千葉:</strong> そうですね。VRにも現実世界を取り込むことはできるんですが、結局カメラであって目で見る現実とは違うものなんですよね。</p>

<p><strong>白石:</strong> Windows MRというのがありますけど、どういうものなんですか？</p>

<p><strong>千葉:</strong> 最初のデバイスとしてHoloLensが発売されたんですが、やはりコンシューマー向けとしては高額じゃないですか。裾野を広げたいという意図で、Windows MRと名前を変えて、HoloLensはその一つということになりました。</p>

<p><strong>白石:</strong> HoloLensはハイエンドなWindows MR対応デバイスの一つ、というところでしょうか。</p>

<p><strong>千葉:</strong> 開発者視点でいうと、HoloLensの開発ノウハウでWindows MRが開発でき、逆も然りと。デバイスも複数社から出ていて、4〜5万円程度とそれほど高額ではないので手軽さは広がったかと思います。</p>

<h3>被るだけではないVRの領域</h3>

<p><strong>白石:</strong> 続いてVRについても伺っていきたいです。</p>

<p><strong>いっこう:</strong> 実はVRの歴史は長く、日本バーチャルリアリティ学会は25年ほど、研究分野としてのVRは50年ほど前からあります。ちなみに学会的にはVRを「仮想現実」と訳すのは少しNGで、<strong>アカデミア的には「人工現実感」を推していきたい</strong>です。……細かいんですが、一応（笑）</p>

<p><strong>白石:</strong> 訳にも違いが出るんですか。いまVRではどんなことが実現できるんですか？</p>

<p><strong>いっこう:</strong> バーチャルというのは「仮想」ではなく、「姿形はそのままだけど実際にはないもの」なんです。VRというとヘッドマウントディスプレイのイメージですが、実際には被らなくてもそこにあるという捉え方です。例えばドームスクリーンとか、匂い系のデバイスとかもVRですし、舌に電気を流して味を感じるのもVRです。<strong>頭に電気を流して、幼女にビンタされる感覚を味わうというのもVR</strong>です（笑）。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/46dbb860-4bec-d181-10e6-a28290a70bfa.jpeg" alt="DSC09309.jpg" title="DSC09309.jpg" /></p>

<p><strong>白石:</strong> 世界はそんなところまで行っているんですか（笑）！？</p>

<p><strong>いっこう:</strong> 開発者レベルなんですけどね。学術としてのVRとコミュニティのVRはやや溝があり、もう少しうまく繋がったらいいなと思っています。VRはMRに比べてデバイスが多いので、一般のガジェット好きが手軽に楽しめるのがいいところかなと思います。</p>

<p><strong>白石:</strong> 先ほどMRはシースルーなところが利点という話がありましたけど、VRの利点はやはり没入するというところですかね？</p>

<p><strong>いっこう:</strong> 被るタイプのものだと完全没入型というメリットは1つ大きいですね。あとは学会的な見方ですが、<strong>VRは「3C/3E」のための道具</strong>なんです。<strong>3CはCreation（創造）、Control（制御）、Communication（通信）</strong>。3Eは、<strong>Elucidation（解明）、Education（教育）、Entertainment（娯楽）</strong>です。</p>

<p>Control（制御）はいわゆるロボット制御だけでなく、例えば人が入れない原発などを遠隔で見る、というもVRの領域です。</p>

<p>Communication（通信）というと、最近だとVirtual YouTuber（VTuber）やVRChatが流行っていますよね。VTuberではキヅナアイちゃんがいて、去年くらいから他のVTuberがどんどん出てきてかなり盛り上がっています。アイちゃんを知っている人？</p>

<p>（会場、ほとんどが挙手）</p>

<p><strong>白石:</strong> VTuber、VR Chat、初耳です……！流行っているんですね。</p>

<p><strong>いっこう:</strong> アイちゃんに関しては既にかなり稼いでいて、スタイルとして確立しているかなと。加えて、最近は割と簡単にVTuberになれる仕組みが整ってきたと思います。ちょうど先日UnityとWindows MR（Lenovo Explorer）を使って、ほぼコードを書かずにVTuberになるという記事が上がっていました。</p>

<p>⇒ 参考: <a href="https://qiita.com/platoronical/items/754a4e3712574244ea96" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">windowsMRでバーチャル生放送をするためのセットアップ</a></p>

<p><strong>白石:</strong> これは、配信をする側がデバイスを被っているということなんですか？</p>

<p><strong>いっこう:</strong> そうです。鏡を置いて、ボイスチェンジャーを使って。最近はあえて声はおっさんのままというVTuberが流行っていますが（笑）。</p>

<p><strong>白石:</strong> うーん、すごいですね。VR Chatというのは？</p>

<p><strong>いっこう:</strong> VR Chatはここ最近でグッとユーザが伸びているんですが、セカンドライフのようなイメージで、自分のアバターを使ってワールドワイドにコミュニケーションできるものです。まだ高いんですが、一般人でも自分の身体を3Dスキャンしてアバターに使う人も出てきました。</p>

<p>⇒ 参考: <a href="http://panora.tokyo/51297/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">3Dスキャンした実写アバターで「VRオフ会」する猛者が登場　これもうオフかオンかわかんねぇな……</a></p>

<p><strong>白石:</strong> これはどうやって移動するんですか？実際に歩いて動く？</p>

<p><strong>いっこう:</strong> 手に持ったコントローラが紐付いて手の動きを自然に見せてくれ、足の動きは補完されます。</p>

<p><strong>白石:</strong> なるほど。3Eの方だとどのような具体例があるんでしょうか？</p>

<p><strong>いっこう:</strong> Entertainment（娯楽）ではVR ZoneやVR PARK TOKYOなどが流行っていますし、開発者もエンタメ系の用途で使っている人が多いですよね。HoloLensでもエンタメはできるんですけど、<strong>広く受けているのは没入感の違い</strong>かなと思います。</p>

<p><strong>千葉:</strong> 現実世界から離れたいこと、ありますもんね（笑）。</p>

<h3>各OS対応で盛り上がるAR領域</h3>

<p><strong>白石:</strong> AR領域でいうと、<strong>ARKit、ARCore</strong>がすごく盛り上がりましたよね。</p>

<p><strong>千葉:</strong> GoogleのハイエンドなARプラットホームTangoは終了が決まってしまいましたね……。後続でマス向けのARCoreが発表されました。</p>

<p><strong>いっこう:</strong> ARKitの方はアップデートで、これまで<strong>水平だけだったのが垂直も検出できる</strong>ようになり、できることが増えましたね。</p>

<p><strong>白石:</strong> スマートフォンの普及率からいうと、xRの中では一般普及するのはARが早いんでしょうか？</p>

<p><strong>千葉:</strong> 手軽に使えるという意味ではそうでしょうね。</p>

<p><strong>前本:</strong> <strong>VR、MRの課題は、手軽じゃない</strong>という部分がありますからね。買わないと、被らないといけない。最近のARはARKit/ARCoreの登場で、すごく現実感が出てきました。<strong>10cm動かすと10cm動くように精度が上がって、一つ上のステージに上がったな</strong>と思います。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/7fc22d6b-6815-f48e-f579-a285983006b3.png" alt="スクリーンショット 2018-02-13 0.45.58.png" title="スクリーンショット 2018-02-13 0.45.58.png" />
▲ AR World Sharing Demo（<a href="https://www.youtube.com/watch?v=4X6FxE7aSMs&amp;feature=youtu.be" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">動画リンク</a>）</p>

<p><strong>いっこう:</strong> Web技術の文脈では、WebVR、WebARが有用ですね。これまでアプリでしかARが実現できなかったのが、<strong>ブラウザがgetUserMediaに対応して、Webベースでカメラ情報を取得して実現できる</strong>ようになったのが大きいです。MozillaさんがWebVRとWebARを統合した<strong>WebXR</strong>を推していて、W3CではWebVRは既にAPIが用意されていますが、次のバージョンアップではWebXRにしようということになっています。</p>

<p>⇒ 参考: <a href="https://immersive-web.github.io/webxr/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebXR Device API Specification</a></p>

<p><strong>いっこう:</strong> 簡単にVRアプリケーションを開発できる、WebVRフレームワークのA-Frameもかなり盛り上がっていて、コミュニティが成熟してきていますね。</p>

<p>⇒ 参考: <a href="https://aframe.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">A-Frame</a></p>

<h2>さらなる発展へ向けて技術的課題の解決が必要</h2>

<p><strong>白石:</strong> ここまではそれぞれの技術の現状を伺ってきましたが、さらなる進歩へのボトルネックや技術的な課題といった部分も聞いてみたいですね。</p>

<p><strong>千葉:</strong> <strong>デバイスの制約</strong>は一つ大きな課題ですね。例えばデバイスを被らないといけないし、デバイスの処理能力がそれほど高くないし、バッテリーの持ちの問題もある。VRでもバッテリーとは逆にケーブル接続の制約があるかと思います。</p>

<p><strong>白石:</strong> HoloLensって、実際には電池はどれくらい持つものですか？</p>

<p><strong>千葉:</strong> 通常の使い方だと3〜4時間、積極的に使っていると2時間ほどです。技術の進歩で、将来的には解決されていく課題だとは思いますが。</p>

<p><strong>白石:</strong> 逆に2012年頃に作っていたプロトタイプから考えるとどうですか？</p>

<p><strong>千葉:</strong> 当時はいろいろ剥き出しで、サイズも大きくケーブルも多く、<strong>本当に最終製品になるんだろうか？</strong>と不安でした。でもやっぱり技術の進歩があって、5年経ってわずか579グラムです。今の課題も5年後、10年後と解決されていくはずですね。</p>

<p><strong>前本:</strong> 2017年後半は開発環境の課題が多かったですね。HoloLensのアプリケーションはまずUnityで開発して、Visual Studioに書き出して、HoloLensにデプロイするという流れなんですが、それぞれのバージョンの違いで整合性が取れないようなことがあってかなりバッドノウハウが蓄積していました。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/4be0f7e1-ca5c-c2d8-5a1a-c58e0d4ef03f.jpeg" alt="DSC09318.jpg" title="DSC09318.jpg" /></p>

<p><strong>白石:</strong> 開発環境の問題があったんですね。</p>

<p><strong>前本:</strong> いまはだいぶ落ち着いて、初めての人でも開発しやすくなりました。発売当初に初めてHoloLensを触ったときは、こんなことが生きている間にあるんだ！と思ったのに、すぐに視野が狭いとか腕が疲れるとか、思うところがでてきて、終わりがないです（笑）。</p>

<p><strong>千葉:</strong> 本当ですよね。今から10年前を考えてみると、2017年にこんなデバイスがでていると想像できなかった。10年先は想像できないけど、たぶん10年後も満足していないと思います。人間の探究心って便利じゃないところを見つけてしまうので終わりはないけど、気がついたらみんな普通に使ってましたという感じになるんじゃないかと思っています。</p>

<h2>xRで盛り上がるビジネス領域</h2>

<p><strong>白石:</strong> xRの技術的な側面をたくさん聞かせてもらいましたが、実際にはxR界隈ではどういうビジネスが生まれているんでしょうか？</p>

<p><strong>いっこう:</strong> VRでいうと、アメリカのVR/AR専門ファンドの<a href="http://www.thevrfund.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Venture Reality Fund</a>が年に2回作成している<strong>VRカオスマップ</strong>が参考になります。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/7a1921d5-c872-6bd4-857e-78c0aa3dbdd9.jpeg" alt="vrf_vr_industry_q1_2017_v3-2.jpg" title="vrf_vr_industry_q1_2017_v3-2.jpg" />
▲ The Venture Reality FundによるVRカオスマップ</p>

<p><strong>いっこう:</strong> 機械、ソフト、ハードとだいぶプレイヤーが多くなっていると思います。その中で一部日本の企業も入っていて、健闘しているなあと思いますね。</p>

<p><strong>白石:</strong> 大カテゴリが「Applications/Content」「Tools/Platform」「Infrastructure」。ホロラボさんはアプリケーション領域ですよね。どういうお仕事がメインですか？儲かっていますか（笑）？</p>

<p><strong>前本:</strong> まあ、お陰様でぼちぼち……（笑）。受託で作る場合と、AR CAD Cloudのように自社パッケージとして作る場合とがあり、始めたばかりなのでなんでもアリ、という感じです。</p>

<p><strong>いっこう:</strong> ゲームカテゴリだとバンダイナムコさんが入っていますね。もともとが大きい会社ですけど、VR Zoneもかなり盛り上がっていますし、VR領域では日本で一番じゃないかなと思います。</p>

<p><strong>白石:</strong> Tools/Platformというと、去年Oculas Riftが値下げをしたじゃないですか。正直、売れてないのかな？と思ったのですが……。</p>

<p><strong>いっこう:</strong> 逆に、値下げをしたことでめちゃめちゃ売れたと思います。Windows MRも手頃な値段なので、結構売れているのではと思っています。</p>

<p><strong>千葉:</strong> そうですね、各社お互いの価格を意識しつつ値段をつけていると思います。</p>

<h2>xRでどうやって「URL」にアクセスするか</h2>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/e9d969f2-e8f9-e384-d6e4-99364dd4ddf5.jpeg" alt="DSC09342.jpg" title="DSC09342.jpg" /></p>

<p><strong>白石:</strong> 会場からも質問を受け付けてみたいと思うんですが、どうでしょうか？</p>

<p><strong>参加者:</strong> 現在のマウスとキーボードで扱うコンピュータのUIは、平面を前提にしているじゃないですか。xRのような3Dで見られるHPやメディアって、どういう形になっていくんでしょうか？例えばWebページにアクセスしたい時、URLの入力はどうするんだろうって想像がつかないんです。</p>

<p><strong>前本:</strong> 一つあるのは、<strong>リアリティがあるからといって、リアルと同じようにしないといけないと疲れる</strong>んですよね。マウスやキーボードのように、操作性を上げる入力装置があったほうがいいだろうと思います。</p>

<p><strong>いっこう:</strong> HoloLensってエアタップなど手を前に出して操作しますけど、結構腕が疲れるんですよね。VR空間の移動も、ワープ方式やコントローラを使う方式があるけど、あまりしっくり来ていなくてまだ確立していない。</p>

<p><strong>千葉:</strong> これまでのUIが生きる部分と、人間の通常の行動がそのままUIになる部分とあると思います。URLでいうと声を発したら文字になって適用されるというのも
いいかもしれない。</p>

<p><strong>いっこう:</strong> いろいろな方法を試していかないとなあというところですよね。</p>

<h2>2020年に向けた期待</h2>

<p><strong>白石:</strong> たっぷりと伺ったところで締めたいと思いますが、最後に2020年の少しだけ未来に、xRはどうなっているか想像や期待を伺わせてください。</p>

<p><strong>いっこう:</strong> 2年後かあ……。VRはハード面では一体型が出てきて、画質も上がって、さらに進歩すると思うんですけど、<strong>一般普及するのは正直まだまだかなあ</strong>と思っています。</p>

<p><strong>白石:</strong> どうしたら一般普及するんでしょうね？キラーコンテンツの登場？</p>

<p><strong>いっこう:</strong> Yahoo!BBがモデムを無料で配ってADSLが普及したように、<strong>国や機関が無料で配る</strong>くらいしないと普及しないんじゃないかと思います。</p>

<p><strong>白石:</strong> 無料で！確かにそうですね。前本さんはどうでしょう？</p>

<p><strong>前本:</strong> 現実的には通信が5Gになったり、視野が広がったりと、技術的な課題がクリアされていくと思います。期待でいうと、xRネイティブな世代が遊びとしてVRやARとAIを連携したりしていて、そういう<strong>遊びの中からすごいものが出てくるんじゃないか</strong>と密かに思っています。もしかしたら攻殻機動隊も実現するんじゃないかな。</p>

<p><strong>千葉:</strong> 技術的な進歩はもちろんですけど、私が期待したいのは「xR盛り上がっているぞ」という一体感ですね。<strong>熱量のある人が増えて、ビジネスも増えて、私自身この領域の仕事にもっともっと関われたらいいな</strong>と期待しています。</p>

<p><strong>白石:</strong> それぞれの熱いお気持ち、ありがとうございます。本日は大変勉強になりました！
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/7572978a-4f65-78e6-05b8-e912d050707f.jpeg" alt="DSC09343.jpg" title="DSC09343.jpg" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[Webの未来を語ろう 2018]]></series:name>
	</item>
		<item>
		<title>Webの過去から現在・未来まで！エバンジェリストたちが語る、最先端Web技術の世界</title>
		<link>/yoshikawa_t/25150/</link>
		<pubDate>Fri, 16 Mar 2018 01:00:13 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PWA]]></category>
		<category><![CDATA[Web Authentication]]></category>
		<category><![CDATA[Web Payments]]></category>
		<category><![CDATA[Web Share API]]></category>
		<category><![CDATA[WebAssembly]]></category>
		<category><![CDATA[WebVR]]></category>
		<category><![CDATA[WebXR]]></category>

		<guid isPermaLink="false">/?p=25150</guid>
		<description><![CDATA[連載： Webの未来を語ろう 2018 (1)HTML5 Experts.jp 副編集長兼エキスパートの吉川です。昨年好評だった「Webの未来を語ろう」企画を2018年もやります！ 今回はパネルディスカッション形式で、H...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/future-of-web-2018/" class="series-496" title="Webの未来を語ろう 2018" data-wpel-link="internal">Webの未来を語ろう 2018</a> (1)</div><p>HTML5 Experts.jp 副編集長兼エキスパートの吉川です。昨年好評だった「Webの未来を語ろう」企画を2018年もやります！</p>

<p>今回はパネルディスカッション形式で、HTML5 Experts.jp 編集長の<a href="https://html5experts.jp/shumpei-shiraishi/" data-wpel-link="internal">白石</a>が、ブラウザベンダーのGoogleのデベロッパーアドボケイトの<a href="https://html5experts.jp/agektmr/" data-wpel-link="internal">えーじさん</a>、 Microsoftのエバンジェリスト<a href="https://html5experts.jp/osamum_ms/" data-wpel-link="internal">物江さん</a>をお迎えして、興味深いお話を多数お聞きしました。</p>

<p>会場も交えたトークは、今後のWeb業界の動向を追いかける上で、重要な内容となっているので、ぜひ読んでみてください！</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5426.jpg" alt="" width="640" height="447" class="alignnone size-full wp-image-25186" srcset="/wp-content/uploads/2018/02/IMG_5426.jpg 640w, /wp-content/uploads/2018/02/IMG_5426-300x210.jpg 300w, /wp-content/uploads/2018/02/IMG_5426-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>2017年のWebで印象に残ったことは？</h2>

<p><b>白石</b>: まずは簡単な自己紹介と、2017年のWebで印象に残ったことを教えてください。</p>

<p><b>えーじ</b>: えーじです。Googleでデベロッパーアドボケイトをしています。もともとは、Google Chromeのアドボケイトという位置付けでしたが、最近はもっと広くなって、Web全体のアドボケイトを担当しています。
特にChromeだけの話に限らず、Web全般について話をしていますね。これには、我々のチームの理想として、<strong>Webすべてに貢献していこう</strong>という想いがあります。</p>

<p>2017年で印象に残ったことは、<strong>SafariがService WorkerとPayment Requestに対応すると表明したことがすごく意義深い</strong>と思っています。</p>

<p><b>物江</b>: 物江と申します。Microsoftでエバンジェリストをしています。以前はWebに軸足を置いていたんですが、現在はWebだけに限らずISV(Individual Software Vendor)、独立してサービスや製品を提供しているパートナーさん向けに様々な技術の啓発を行なっています。Webについては、個人的なものも含めていろいろ活動しています。</p>

<p>2017年に印象に残ったことは、<strong>WebAssemblyやPWA（Progressive Web Apps）などについて、ブラウザベンダーがきちんと足並みを揃えて、仕様を策定するようになった</strong>ということですね。非常にいい流れになってきていると思います。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5445.jpg" alt="" width="640" height="447" class="alignnone size-full wp-image-25188" srcset="/wp-content/uploads/2018/02/IMG_5445.jpg 640w, /wp-content/uploads/2018/02/IMG_5445-300x210.jpg 300w, /wp-content/uploads/2018/02/IMG_5445-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>左から、日本マイクロソフト株式会社 物江修さん、Google デベロッパーアドボケイト えーじさん</strong></span></p>

<p><b>白石</b>: 皆さん、ありがとうございます。ついでに私の2017年で印象に残ったこともお話ししておくと、個人的には<a href="https://dev.to/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">dev.to</a>や日本経済新聞社の<a href="https://www.nikkei.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">日経電子版</a>が爆速だったという、そういう事例が出てきたのは印象的だったなと思います。裏側でHTML5やWebの最先端技術とか、そういったものを使って1段階上のレベルの速さを実現している。</p>

<p>Webプラットフォームベンダーやコミュニティの皆さんの啓蒙活動などもあって、PWAをはじめとしたWeb技術だとかパフォーマンスだとかが、ビジネス上も重要であるというところも浸透してきている。その結果として、Webプラットフォームの機能がフル活用されつつ、パフォーマンスというところに影響がでた良い例かなと。</p>

<p>今回は、Webの過去・現在・そして未来を語るという構成で進めてみたいと思います。</p>

<h2>イントロダクション:HTML5は世界を変えたのか？</h2>

<p><b>白石</b>: 2017年以前のWebを振り返ると、ブラウザ戦争などの分断化があって、そこからHTML5のムーブメントが起こり、Webの様々な仕様が生まれてブラウザに実装されました。</p>

<p>ただ、<strong>それら「HTML5」のムーブメントは世界を変えたんでしょうか？</strong>
これまであまり、そういう振り返りをしたことがなかったので、一度やってみたいなと思っていたんです。お二人はどうお考えですか？</p>

<p><b>物江</b>: そうですね、一般ユーザーの目からすると、確かにあまり変わっていないかもしれません。例えば、YouTubeのプレイヤーは、FlashからHTML5になりましたけど、変わったって気がつく人はあまりいませんよね。普通の人は、きっとまったく意識せずに使っている。HTML5でできたことは、とっくにFlashでもできていたわけで。</p>

<p>でも、開発者にとっては大きな変化がありましたよね。結局、開発者はみなHTML5を使っています。これはなぜかというと、HTML5がシンプルだからこそだと思うんですよ。</p>

<p>エキスパートの<a href="https://html5experts.jp/takehora/" data-wpel-link="internal">竹洞さん</a>がいいことを言っていたんですけど、Webが素晴らしく進化したのはKISSの原則(*1)のおかげといっていました。つまり、誰でも簡単に使えるからこそ普及した。わざわざFlashを使わなくても、Web標準技術だけを使えばいろんなことができるようになった。それによって作り手側の裾野が広がって、以前よりもリッチなコンテンツがたくさん出るようになってきたのかなと思います。</p>

<p>*1 … &#8220;Keep it simple, stupid&#8221; （シンプルにしておけ！この間抜け）、もしくは、&#8221;Keep it short and simple&#8221; （簡潔に単純にしておけ）という経験的な原則の略語。<a href="https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wikipedia</a></p>

<p><img src="/wp-content/uploads/2018/02/IMG_5433.jpg" alt="" width="640" height="422" class="alignnone size-full wp-image-25189" srcset="/wp-content/uploads/2018/02/IMG_5433.jpg 640w, /wp-content/uploads/2018/02/IMG_5433-300x198.jpg 300w, /wp-content/uploads/2018/02/IMG_5433-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>えーじ</b>: ぼくも、世界は変わったと思います。やっぱりHTML5でWebを変えようっていうムーブメントがあったこと、それ自体が良かったと思うんですよね。良い意味でのブラウザ間の競争が起きて、どんどん新しい提案がなされて、共通して使えるものがどんどん生まれていった。</p>

<p>ちゃんと数えたことないですが、HTML5の機能でみんな当たり前に使うようになったものっていっぱいあると思うんですよ。例えば、CSS3で角丸を使うっていうのももう当たり前にみんなやっているし、それが動かないブラウザはほぼ、ない。そういうものが当たり前に使えるようになったっていうのは、一昔前からすると全然状況は異なっている。そういう意味では、相当変わったと思います。</p>

<p><b>白石</b>: そういえば、元Mozilla Japanの浅井智也さんに以前教えてもらったんですが、Web関連技術を全部まとめた図があるんです。これ、曼荼羅図みたいな感じなので、「Web曼荼羅」なんて呼ばれているそうです(笑)。</p>

<p>HTML5とその関連技術（<a href="https://dynamis.github.io/webapi.link/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webapi.link</a>）
<img src="/wp-content/uploads/2018/01/webtechnologies.jpg" alt="" width="640" height="360" class="aligncenter size-full wp-image-25159" srcset="/wp-content/uploads/2018/01/webtechnologies.jpg 640w, /wp-content/uploads/2018/01/webtechnologies-300x169.jpg 300w, /wp-content/uploads/2018/01/webtechnologies-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>こうして考えると、HTML5のムーブメントはたくさんのものを生み出しましたねえ。一般のユーザーからはあまり変わってないように見えても、「それは時間をかけて変わっているから」という面もありそうですね。</p>

<p><b>えーじ</b>: はい、そして、これだけのものがたくさん生み出された結果、Webはアプリケーションプラットフォームになった。それが、HTML5以前との大きな違いだと思いますね。</p>

<h2>Webは難しすぎる─Webプラットフォームの現状と課題</h2>

<p><b>白石</b>: では、iOSやAndroidといった他のプラットフォームとWebプラットフォームとを比較すると、Webはどういう立ち位置にあるとお考えですか？</p>

<p><b>物江</b>: Webプラットフォームは時間をかけてここまで成熟してきました。機能的な面では、他のプラットフォームにもひけをとらないというところまで来たんじゃないかと思います。</p>

<p>そして今、Progressive Web Apps (PWA)が浸透しつつあることが、今後のWebにとってはすごく意義のあることだと思っています。
<strong>PWAって、ある意味ひとつの理想の到達点だと思う</strong>んですよね。Javaなどが理想に掲げていた「Write Once, Run Anywhere」を、PWAは真の意味で実現するわけです。
これ、次のWindowsの大型アップデートでPWAがデスクトップアプリっぽく動いだり、Windowsストアからインストールできるように<a href="https://blogs.windows.com/msedgedev/2018/02/06/welcoming-progressive-web-apps-edge-windows-10/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なる</a>から言っているわけじゃないですよ(笑)。</p>

<p><b>白石</b>: そこでいつも言われているのが、Webアプリって動作が遅いんじゃないかってことですよね。</p>

<p><img src="/wp-content/uploads/2018/02/DSC09045.jpg" alt="" width="640" height="408" class="alignnone size-full wp-image-25192" srcset="/wp-content/uploads/2018/02/DSC09045.jpg 640w, /wp-content/uploads/2018/02/DSC09045-300x191.jpg 300w, /wp-content/uploads/2018/02/DSC09045-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>物江</b>: ただ、そうした問題についても、Webプラットフォームは長いこと取り組んでいて、もはやあまり問題にならないレベルじゃないかと思います。
ブラウザの実装という面でも、仕様の面でも、絶え間ない改善が続けられてきました。</p>

<p>仕様の面でそうした部分について期待できるのは、やはりWebAssemblyですね（筆者注: ブラウザが高速に実行可能な、ポータブルなバイナリ形式）。
昨年、モダンブラウザが同時にWebAssemblyのサポートを表明するということがありましたが、これでWebの速度はまた一段階アップすることが期待できます。</p>

<p>あとはやはりハードウェアの進歩が解決するものも多いでしょう。ちなみに、今のWeb技術の素晴らしいところは、ハードの性能に縛られた設計をしていないこと、どこでも同じWeb技術が動作することだとも思います。</p>

<p>例えば昔、貧弱だった携帯電話の機能に合わせた仕様で、HDMLやCHTMLというモバイル専門のタグがありましたが、今はもうほとんど残っていません。結局、性能に関わる問題は時間が解決してしまう部分も大きいんです。いま大切なことは、「いかに人間が作りやすいか、使いやすいか」が重要になってくるかなと思います。</p>

<p><b>えーじ</b>: ぼくも、パフォーマンス面は既にあまり課題とは考えていません。それよりぼくが課題だと感じているのは、開発者にとってのWeb技術はかなり複雑になってしまっていることです。</p>

<p>例えば「Extensible Web」というのを聞いたことがある方がいらっしゃると思います。これはWebの技術設計に対する、ここ数年における指針のようなもので、具体的には「標準としては、ユースケースを規定しない低レベル（低レイヤー）なAPIを提供する」というものです。</p>

<p>そうすることで、そうしたAPIを使用したハイレベルなライブラリだとかベストプラクティスが、開発者の手によって作られることを期待する。こうすることで、「ハイレベルだけど使われないAPI」が標準で規定されてしまうという問題を解決しようとしています。</p>

<p><img src="/wp-content/uploads/2018/02/DSC09086.jpg" alt="" width="640" height="423" class="alignnone size-full wp-image-25190" srcset="/wp-content/uploads/2018/02/DSC09086.jpg 640w, /wp-content/uploads/2018/02/DSC09086-300x198.jpg 300w, /wp-content/uploads/2018/02/DSC09086-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ただ今は過渡期なので、低レベルなAPIがどんどん増え、ライブラリも量産されていて、はっきり言って混沌としています。例えばService Workerもすごく低レベルなAPIで、実際に使うとなるとなかなか難しい。</p>

<p>そこにGoogleが<a href="https://workboxjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Workbox</a>というライブラリを出していたりするんですが、それを使うと簡単にServiceWorkerを使える一方で、ServiceWorkerもライブラリもどちらも学ばなくてはならない。</p>

<p>これがWeb Componentsなんかだと、仕様そのものがどんどん変わっていて、なかなか安定しない。<a href="https://www.polymer-project.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer</a>というライブラリを使おうにも、Polymerも仕様に合わせてどんどん変わっている。どの時点の仕様が正しいのか、検索したときにどれが最新なのかわかりづらい。そういうところが複雑で、開発者はみな苦労してるんじゃないかなと思います。</p>

<p>個人的には、以前Webpackにやられたことがありまして(笑) 。将来的にはES Modulesが広まれば、そういうビルドプロセスを経なくてもうまく動くようになるんだと思うんですが、今は過渡期として、やっぱりGulpなりWebpackなりRollupなりを使う必要がある。</p>

<p>ビルドツールも次々に生まれるし、フレームワークもそう。フレームワークとビルドツール、様々なライブラリも組み合わせなくちゃならないし、ベストプラクティスが簡単にはわからない。その辺がかなり複雑になっているなと感じています。</p>

<h2>各ブラウザベンダーのこれからの動向は？</h2>

<p><b>白石</b>: 
皆さんご自身の会社の立場からお聞きしたいなと思うんですけど、ブラウザベンダー各社がどういう想いで、どういう方向を向いて実装しているのかをお聞かせください。</p>

<p><b>えーじ</b>: 
会社（Google）としての方向性はもちろんですが、チーム内でWebに関する課題を共有して、その解決策を探ることは普段から行っています。</p>

<p>例えば、先ほど挙がっていたパフォーマンスを例に挙げましょう。</p>

<p>実はJavaScriptのパフォーマンスって、もうあまり問題にならなくなっているんです。むしろ悪いのはレンダリングの部分で、そこを速くするための努力はずっと続けています。</p>

<p>あと、ネットワークの遅延もすごく大きい要因なので、ServiceWorkerみたいな仕様を提供することで、スピードの課題に開発者自身が取り組みやすくする。</p>

<p>さらに、パフォーマンスに関するベストプラクティスを開発者の皆さんと共有するのも重要です。</p>

<p>このように、課題一つとってもたくさんのアプローチがある。こういう活動を、チーム一丸となって同時に取り組んでいるという状態ですね。</p>

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

<p><b>白石</b>: 
なるほど。ちなみにGoogleの中で、「今のWebはこういう課題があるね」みたいな、そういう話し合いっていうのはよくされるんですか？どんな議論がされてるのか興味があります。</p>

<p><b>えーじ</b>: 
はい、常にやってますね。世界中から集ってきた情報を、雑談ベースでやり取りするような感じです。</p>

<p>例えばこれからGoogleがインドでももっと使われるようにするためには、インドの市場を考えなきゃいけない。しかしインドは全然違う世界だと。</p>

<p>例えばネットワークにしても、今われわれが4Gは当たり前に使ってますけど、向こうの世界は2Gなんです。3Gですらない。なのに、何MBっていうファイルをダウンロードしないと見れないサイトっていうのはざらにあるわけですよ。そういったネットワーク環境の悪いところに対して、開発者の皆さんがサービスを提供しようと思った時にどうするのか。そういう課題がインドに進出しようと思っているチームから上がってきたりします。</p>

<p>他には例えば最近は、アクセシビリティにもかなり力を入れていたりもしますね。アクセシビリティに強く関心のある人たちがチームに入ったことで、Webのアクセシビリティをもっと良くするための話し合いや仕様の提案なども活発に行なっています。</p>

<p><b>物江</b>: 
Microsoft Edgeは、相互運用性とセキュリティ、アクセシビリティとパフォーマンスの4つが何においても優先されています。</p>

<p>例えば相互運用性でいうと、 <code>-webkit-text-stroke</code> というベンダープリフィックスがあります。これ、以前はWebKit系のブラウザでしか動かなかったんですが、現在はEdgeでも開発中なんです。多くのサイトで使われているような機能については、全部同じように動くようにするというのを優先的にやっています。</p>

<p>アクセシビリティに関しては、画面に表示されるすべてのテキストについて、スクリーンリーダーのような外部のプログラムを呼び出せるような仕組みが、WindowsにはOSレベルで入っています。それを使って、アクセシビリティを強化するような仕組みがEdgeに入っていたりしますね。</p>

<p>パフォーマンスについては、Chakra（EdgeのJavaScriptエンジン）のパフォーマンスアップを継続的に行っています。特に、こないだのアップデートでようやくブラウザ内部のリファクタリングが終わったようで、Edgeが出た頃からのパフォーマンスでいうと、3～4倍速くなってます。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5440.jpg" alt="" width="640" height="428" class="alignnone size-full wp-image-25195" srcset="/wp-content/uploads/2018/02/IMG_5440.jpg 640w, /wp-content/uploads/2018/02/IMG_5440-300x201.jpg 300w, /wp-content/uploads/2018/02/IMG_5440-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>白石</b>: 
リファクタリングっていうのは、Internet Explorerから引きずっているコードがかなりあるのを書き直すって話ですよね。それが行われているって話はだいぶ前に聞いていましたが、ついに終わったんですね。</p>

<p><b>物江</b>: 
はい、ほぼ全部終わったんじゃないかと。もともとEdgeのレンダリングエンジンってTrident（IEのレンダリングエンジン）から派生したものなので、20年以上前のものということで、根っこの部分で仕様が古い部分があったんですよ。その修正がようやく終わったという感じです。これから先は、Edgeの開発はどんどん加速していくんじゃないかと期待しています。</p>

<p>あとは、やはり2000年代と比較すると、ユーザーの意見をより開発に取り入れようという姿勢が顕著になったかと思います。Windowsをお使いの方はわかると思うんですが、<a href="https://www.microsoft.com/ja-jp/store/p/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%90%E3%83%83%E3%82%AF-hub/9nblggh4r32n" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">フィードバックHub</a>というのがありまして、そこでバグの報告だとか、追加してほしい機能をリクエストできるんですよ。そのリクエストのベット数が多いと優先度があがっていって、対応されるというようになっています。</p>

<p><small></p>

<p>各種ブラウザのステータスが確認できるサイト</p>

<ul>
<li><a href="https://developer.microsoft.com/en-us/microsoft-edge/platform/status/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Microsoft Edge</a></li>
<li><a href="https://www.chromestatus.com/features" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome</a></li>
<li><a href="https://webkit.org/status/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webkit</a></li>
</ul>

<p></small></p>

<h2>注目のWeb最新技術を一挙に解説！Web Payments、WebVR、AMP、PWA、WebAssembly&#8230;</h2>

<p><b>白石</b>: 
ではここからは、注目のWeb最新技術についていろいろお聞きしたいと思います。Web Payments、WebVR、AMP、PWA、WebAssemblyなどなど、仕様ごとに概要と現状をお話しください。</p>

<h3>Web Payments</h3>

<p><b>えーじ</b>: 
今までWebでお金を払うといったら、フォームを使ってクレジットカード番号を入れたりとか、どこかのサイトに飛んで、そこのサイトにあらかじめ保存してある支払い情報を使うといったことがほとんどだったと思います。Web Paymentsを使うと、ブラウザがネイティブで表示してくれるUIを使って支払いができるようになるというのが大きな特徴ですね。ちょっと見てもらうと、<a href="https://polykart.store/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PolyCart</a>というWeb Paymentsのデモサイトで確認することができます。</p>

<p><strong>Web Paymentsのデモサイト（PolyCart）</strong>
<img src="/wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a.png" alt="" width="640" height="521" class="aligncenter size-full wp-image-25171" srcset="/wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a.png 640w, /wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a-300x244.png 300w, /wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a-207x169.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ブラウザネイティブのUIを通じてクレジットカードの情報や、配送先、連絡先などの入力を促すことができます。そうして入力された情報はブラウザが記憶してくれるので、次からはクリックするだけで支払い情報を入力することができます。</p>

<p>もっとすごいのは、将来的には支払い方法を追加できるようになるんです。例えば、Apple PayやGoogle Payで支払うのも可能ですし、仮想通貨なども使えるようになるでしょう。</p>

<h3>WebVR</h3>

<p><b>物江</b>: 
以前から、「Web上でVRコンテンツを表示する」っていうのは、Three.jsなどを使って実現が可能でした。ではWebVRは何が違うかというとVRデバイスからのフィードバックを受けることができるんです。これによって、VRデバイスと深く連動したWebサイトを作ることができます。</p>

<p>それにWindows10だと、ネイティブでVRの環境をサポートしていて、WebVRに対応したWebサイトにいくと、自動的にVRゴーグル上で全画面表示してくれるようになっています。VRのビデオもそのまま見ることができるので、真の意味でシームレスにVRのコンテンツが提供できるようになっています。</p>

<p>個人的に楽しみなのは、VRをきっかけとして新しいUIが生まれてくることですね。既存のVRゴーグルを使ったことがある人はわかると思うんですけど、キーボードもマウスも何も使えないんです。そうすると新しいUIを考える必要があって、そこに新しい可能性を感じています。</p>

<p><b>えーじ</b>: 
ちなみに最近は<a href="https://github.com/mozilla/webxr-api" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebXR</a>っていうらしいですね。VR、AR、MRをコンセプトに入れた仕様を作ろうとしているという動きもありますね。</p>

<h3>AMP</h3>

<p><b>白石</b>: 
次はAMPですが、これについては既にたくさんの方がご存知でしょうから、簡潔に。主にモバイル環境で、Webページを素早く表示できるようにするための、HTMLのサブセットですね。</p>

<p><b>えーじ</b>: 
AMPの仕様自体もさることながら、AMPが基本的にWeb Componentsでできているのは興味深いです。Web Componentsの仕組みを使って独自のエレメントを定義していて、なおかつパフォーマンスも追求しているので、結果としてパフォーマンスのベストプラクティスの塊をWeb Components化したものになっている。大変面白いと思います。</p>

<h3>Progressive Web Apps</h3>

<p><b>白石</b>:
次は、恐らく今年最大の注目キーワードProgressive Web Appsですね。これは（ずっと啓蒙してきた）えーじさんに語っていただくしかないでしょう。</p>

<p><b>えーじ</b>: 
はい。とはいえPWAという言葉自体は、皆さんに意識してもらいやすくするためのマーケティング用語のようなもので、技術的な観点からはそれ自体意味がないと思っています。実際の中身はService WorkerだったりとかPush Notificationだったりとかそういう具体的な機能やAPIから構成されています。</p>

<p>日本でも、昨年後半くらいからPWAが注目されはじめました。さっきのdev.toとか日経電子版とかも、PWAの構成要素を利用することで高速化が実現できたと。PWAの中のひとつひとつの技術要素をうまく使うとここまで速くできるんだよ、といういい例ができたなと思っています。</p>

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

<p><b>白石</b>: 
ちなみに、個人的にはPWAっていまいち意味がわからないな、と思ってて。なにが「プログレッシブ」なんでしょうか？プログレッシブって、「だんだん（進化する）」って意味ですよね。</p>

<p><b>えーじ</b>: 
PWAにおける「プログレッシブ」には2つ意味があります。</p>

<p>1つは昔から言われているプログレッシブ・エンハンスメントです。古いブラウザでも見ることができる基本的なWebサイトをまずは作って、そこに、新しいブラウザで使える機能を足していくという考え方。そうすれば、クライアントの環境を最大限活かすことができます。</p>

<p><b>白石</b>: 
では、Service Workerが使えるブラウザだったらオフラインという機能が使えるけど、そういう機能が使えないブラウザにも同等のものを提供する。既存のサイトにあとからその機能を提供することも割と簡単にできますよっていうそういう思いを込めたものということですね。</p>

<p><b>えーじ</b>: そうです。もう1つが、今あるサイトに機能を付け加えていくことで、徐々にPWAに近づけていけるという意味です。PWAのためにサイトを一から作り直すとか、大幅な改修を行う必要はない。既存のサイトを徐々に拡張していけばいいんです。</p>

<p><b>白石</b>: 
なるほど、そういう意味合いだったんですね。ちなみにPWAの中では、Service Workerが代表的なAPIですよね。他には<a href="https://developers.google.com/web/fundamentals/web-app-manifest/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web App Manifest</a>とか、<a href="https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Push Notification</a>とかでしょうか。</p>

<p><b>えーじ</b>: 
そうですね。ちなみに、PWAのウリの一つに、OSのホーム画面にアイコンを追加できるというのがあるんですが、以前はただのWebアプリへのショートカットでした。でも今は違います。PWAをホーム画面に置く際、アプリのパッケージを動的に生成してインストールするので、OS上の扱いはネイティブアプリとほとんど変わりないんです。なので、プッシュ通知のオン／オフをアプリごとに設定できたり、ネイティブアプリでしかできなかったことがPWAでも同様に行えます。</p>

<h3>WebAssembly</h3>

<p><b>白石</b>: 
次はWebAssembly、物江さんご説明お願いします。</p>

<p><b>物江</b>: 
WebAssemblyは、Webブラウザ上で非常に高速に動作させることができる、デバイスに依存しないバイナリ形式です。現在は用途がある程度限られていて、DOMを操作することなどはできませんが、CPU依存の計算処理などは極めて高速に動作させることができます。
<a href="https://developer.mozilla.org/ja/docs/Mozilla/Projects/Emscripten" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Emscripten</a>などのツールを使うと、C/C++で作られたものをWebAssemblyに変換できるので、C/C++で書かれたゲームなどをWebAssemblyに移植することも比較的容易です。また現在はまだ開発中ではありますが、MonoがC#からWebAssemblyをコンパイルする<a href="https://github.com/lrz/mono-wasm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mono-wasm</a>であったり、マイクロソフトも実験プロジェクトとしてWebAssemblyを介してWebブラウザー上でC#とRazorを走らせるWeb UI framework  <a href="https://blogs.msdn.microsoft.com/webdev/2018/02/06/blazor-experimental-project/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Blazor</a>を開発していたりします。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5499.jpg" alt="" width="640" height="387" class="alignnone size-full wp-image-25198" srcset="/wp-content/uploads/2018/02/IMG_5499.jpg 640w, /wp-content/uploads/2018/02/IMG_5499-300x181.jpg 300w, /wp-content/uploads/2018/02/IMG_5499-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>（ここで会場からエキスパートである<a href="https://html5experts.jp/technohippy/" data-wpel-link="internal">あんどうやすしさん</a>から質問）</p>

<p><b>あんどうやすし</b>: 
現在のWebAssemblyって結局計算することしかできないじゃないですか、DOMもいじれないし、JavaScriptのAPI呼び出しも直接は行えない。今後もそれは変わらないんでしょうか。特にデータの渡し方に結構制限があって、使い勝手がいいものにするには難しいなと感じています。SharedArrayBufferという仕組みで一次元配列の共有はありますが、それも使いづらいし…。</p>

<p><b>物江</b>: 
それは、今の段階ではまだなんとも言えないですね。</p>

<p><b>えーじ</b>: 
ちなみにSharedArrayBufferはこないだのメルトダウンとスペクター(*2)の影響で機能が停止になります。</p>

<p><b>白石</b>: 
ありゃ、まさかそんなところにまで影響及ぶとは…(笑)。</p>

<p>*2 … CPUでの投機的実行という高速化プロセスを悪用した脆弱性</p>

<h3>Web Share API</h3>

<p><b>白石</b>: 
他には、注目のAPIとかはありますか？</p>

<p><b>えーじ</b>: 
最近追加されようとしている新しい機能に<a href="https://developers.google.com/web/updates/2016/09/navigator-share" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Share API</a>というのがあります。</p>

<p>Androidのインテントをご存知の方だったらすぐ分かる機能ですが、例えばあるサイトを「FacebookやTwitterでシェアしたい」という場合に、Web Share APIを使うと簡単に外部アプリを呼び出すことができます。</p>

<p>逆に、自身のWebアプリを「シェアする先のアプリ」として使ってもらうようにすることもできます。それが<a href="https://github.com/WICG/web-share-target" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Share Target API</a>というものです。</p>

<p>Web Share APIは既に使えるんですが、Web Share Target APIは、現在限られたサービスにしか開放されていません。このように、Chrome では一部のドメインに先行してWebプラットフォームの機能を試してもらうオリジントライアルというものをやっているのですが、現在TwitterのモバイルサイトがWeb Share Target APIを使えるようになっています。<a href="https://mobile.twitter.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mobile.twitter.com</a>で実際に試すことができますので、TwitterのPWAをまだ試したことがない方は、AndroidのChrome betaチャネルか、devチャネルを使ってインストールしてみてください。何かシェアしようとしたときに、TwitterのPWAが候補として出てきます。</p>

<h3>Web Authentication</h3>

<p><b>白石</b>: 
Web Authenticationというのもあると聞きました。</p>

<p><b>えーじ</b>: 
Web Authenticationは、実はEdgeでもう使えるんです。仕様がちょっと古いので、APIが全く異なりますが、<a href="https://github.com/MicrosoftEdge/webauthn-polyfill/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polyfill</a>もあります。Web Authenticationをひとことでいうと、セキュリティキーなどを用いた多要素認証を標準技術で扱えるようにするものです。顔認証や指紋認証と組み合わせれば、安全性の高いログインの敷居はぐっと下がると思います。</p>

<p><b>物江</b>: 
<a href="https://fidoalliance.org/?lang=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FIDO Alliance</a>という標準化団体があるんですけど、そこで生体認証などのもっと広い話をしています。既にWindowsだとWindows Helloという生体認証の仕組みがFIDOの標準で作られていますね。</p>

<p><b>えーじ</b>: 
FIDOのWeb版がWeb Authenticationになるわけです。Web Authenticationの実装はこれからどんどん出てくるでしょう。Mozillaさんもこないだ実装を開始しましたし、Chromeもそろそろ入ってくるのかなと思います。</p>

<p><b>白石</b>: 
そうすると、もしかしたら今年はWebサイトで指紋認証とか顔認証とかが一般的になってくるという可能性があるってことですかね。</p>

<p><b>えーじ</b>: 
そうですね。どの認証方式を使えるようにするかっていうのは、順番に1つずつ入れていくという話らしいので、まずはセキュリティーキーから利用できるようになって、そのうちNFC、指紋認証ができるようになっていくようです。徐々にそういったものが実装されていけば、本当にパスワードを覚えなくてもいい世界っていうのが実現できるかもしれないので、すごく楽しみにしています。</p>

<p>ちなみに、<a href="https://developers.google.com/web/fundamentals/security/credential-management/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Credential Management API</a>というIDとパスワード、いわゆる共通鍵認証をする仕様があるんですが、それとAPIのネームスペースが同じになるので、共通のAPIを使うことになります。まったく別々だった仕様が一緒になるというのも個人的には面白いと感じています。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5443.jpg" alt="" width="640" height="413" class="alignnone size-full wp-image-25199" srcset="/wp-content/uploads/2018/02/IMG_5443.jpg 640w, /wp-content/uploads/2018/02/IMG_5443-300x194.jpg 300w, /wp-content/uploads/2018/02/IMG_5443-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>エキスパートたちが見据えるWebの未来について</h2>

<p><b>白石</b>: 
最後にWebの今後について感じていることをお聞かせください。</p>

<p><b>えーじ</b>: 
ぼくらブラウザベンダーは、「こうなるといいな」というものをいろいろ作ってるんですけど、それはブラウザベンダーが勝手にやってるわけじゃなくて、開発者の皆さんの声とか、こういうWebがいいという声をもとにやっているので、フィードバックをできるだけいただいたほうが、より皆さんの理想としているWebができると思っています。</p>

<p>フィードバック方法にも今はいろいろあって、GitHub上で管理されている仕様にIssueを立てるっていうのも一つの方法ですし、一番簡単な方法です。それすらめんどくさいということであれば、ぼくに直接言っていただくとかでも構いません(笑)。そんな感じで、開発者の皆さんと一緒にWebを盛り上げていけたらいいなと思います。</p>

<p><b>物江</b>: 
個人的な思いとしては、今非常にWebって良い方向に進んでいると思っています。（お互いを傷つけ合うような）ブラウザ戦争は終わりました。今は良い意味でお互いに競争し合ったり、歩調を合わせてWebを良いものにしていこうという動きが主流になりつつ会って、とても好ましく感じています。今後もそれが続いていって、Webのテクノロジーの活用範囲が広がればいいなと思っています。</p>

<p><b>白石</b>: 
皆さん、本日は様々なお話をお聞かせいただき、ありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[Webの未来を語ろう 2018]]></series:name>
	</item>
		<item>
		<title>VR初心者にお勧め！ひらやまともよ氏が伝授する─デザイナー・プランナー向けのVR表現方法「Graphic VR」講座</title>
		<link>/miyuki-baba/24971/</link>
		<pubDate>Tue, 26 Dec 2017 01:00:28 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[VR]]></category>
		<category><![CDATA[WebVR]]></category>
		<category><![CDATA[デザイナー]]></category>

		<guid isPermaLink="false">/?p=24971</guid>
		<description><![CDATA[VR元年といわれた2016年から急激な進化を遂げ、最近ではゲームなどのエンターテイメント領域だけに留まらず、医療・教育・産業などの領域でも広がりを見せつつあるVR(仮想現実)。実際に業務でVRを取り入れたいと考えたものの...]]></description>
				<content:encoded><![CDATA[<p>VR元年といわれた2016年から急激な進化を遂げ、最近ではゲームなどのエンターテイメント領域だけに留まらず、医療・教育・産業などの領域でも広がりを見せつつあるVR(仮想現実)。実際に業務でVRを取り入れたいと考えたものの、コストや専門エンジニアのアサインが難しいなどといった問題からあきらめている人は少なくないのではないだろうか。</p>

<p>そこで今回はPC/スマホ向けにクリエイティブ業務を行っているデザイナーや、サイト・アプリ・イベントなどのプロジェクトでVRを使ってみたいと考えているディレクター向けに、マインドスケープアーキテクト・ひらやまともよ氏が「TECH PLAY CONFERENCE 2017」で語った、気軽に使えるVRの表現方法を紹介したい。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03088.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24988" srcset="/wp-content/uploads/2017/12/DSC03088.jpg 640w, /wp-content/uploads/2017/12/DSC03088-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC03088-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 80%;">▲<strong>マインドスケープアーキテクト クリエイティブディレクター/デザイナー　ひらやま ともよ氏</strong><br>グラフィックデザイナーとしてキャリアをスタートし、トヨタメディアサービス、DeNA、トランスコスモスなどの企業でデジタルコンテンツ企画、デザイン・ディレクションなど、前職のInstaVRではエバンジェリストと活躍。様々なOSでのアプリ開発、IoT、AR、VRを活用したビジネス構築、企画提案やUI設計を行っている。また、Techコミュニティのイベント運営にも参画し、VRクリエーターを増やすべく関連イベント運営やセッション登壇、講師活動も行う。</span></p>

<h2>簡単にVR画像編集ができる全天周イメージ投影法</h2>

<p>インターネットは文字の表示から始まり、写真・画像や動画、ついにVR(仮想現実)という360度の表現ができるようになった。ひらやま氏はこの表現のキャンバスが平面から360度になったことを、クリエイターとして使わないのはもったいないと考えた。</p>

<p>それは直視するだけの動画と比べ、まるでその場にいるかのような没入感のあるVRなら、よりコンテンツの世界観を実感してもらえるからだ。VRを使ったクリエイティブというと高機能なマシンや専門知識、コストが必要だと思われがちだが、Photoshopなどを活用したデザイナーならではのさまざまな“見せ方”があるという。</p>

<p>VR空間のしくみは大きく分けて、全天周イメージ投影(プリレンダリング)と、3DCG(リアルタイムレンダリング)の二つがある。3次元のイメージを常に高速でレンダリングしている3DCGは、主にゲーム制作などで使われることが多い。いろいろな表現ができるが、CGやゲームエンジンなどの専門知識やハイスペックなデバイスも必要となる。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03093.jpg" alt="" width="640" height="382" class="alignnone size-full wp-image-25004" srcset="/wp-content/uploads/2017/12/DSC03093.jpg 640w, /wp-content/uploads/2017/12/DSC03093-300x179.jpg 300w, /wp-content/uploads/2017/12/DSC03093-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>一方、全天周イメージ投影はすでにプリレンダリングされたCGや撮影済みの画像や映像を使って仮想空間を作るので、基本的な画像や映像編集の知識・経験があれば3DCGに比べて学習コストは低い。あらかじめレンダリングされているので、リアルタイムで演算を行う必要がない分、メモリの消費が抑えられてWeb上での表示も速いというメリットもある。そこで、今回は全天周イメージ投影に絞って紹介していく。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03094.jpg" alt="" width="640" height="389" class="alignnone size-full wp-image-25006" srcset="/wp-content/uploads/2017/12/DSC03094.jpg 640w, /wp-content/uploads/2017/12/DSC03094-300x182.jpg 300w, /wp-content/uploads/2017/12/DSC03094-207x126.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>全天周投影法では、エクイレクタングラー方式を使う。世界地図の投影法でも使われているもので、この投影方式を理解すれば簡単にVRコンテンツを作ることが可能だ。エクイレクタングラーの特性として画像中心の横線（地平線）に接する付近は正しく描画されるが、地平線から離れるにつれて、画像が歪んでしまう。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03097.jpg" alt="" width="640" height="379" class="alignnone size-full wp-image-25007" srcset="/wp-content/uploads/2017/12/DSC03097.jpg 640w, /wp-content/uploads/2017/12/DSC03097-300x178.jpg 300w, /wp-content/uploads/2017/12/DSC03097-207x123.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>実際にTHETAで撮影された以下の画像を見てみよう。中心部分は綺麗に描画されるが、上下は歪んでいる。その歪みも柄だと目立つが、無地はわかりにくい。</p>

<p>例えば、地平線から離れた空や海・地面などは作りやすくなる。形のハッキリしているものを配置する場合、歪みにくい中央部に置く必要があるが、VR空間で見るとオブジェクトは思ったより大きく表示される。</p>

<p>上の方に配置すると頭が疲れやすく、下の方はうつむく動作を人はあまりしないので気づかれないことが多い。従って効果的に配置するためにも、小さめに画像中心を基本とした水平に配置することが望ましい。</p>

<p>以下のようなエクイレクタングラーの特性を理解すると、デザイン表現の幅が広がる。</p>

<ul>
<li>画像の中心の横線は地平線となる</li>
<li>メインのオブジェクトは画面中心に作成する</li>
<li>ファーストビューで画面に切り取られるエリアを意識する</li>
<li>画像の上部と下部にオブジェクトを配置しない</li>
<li>配置オブジェクトは思ったより小さくて良い</li>
</ul>

<h2>エクイレクタングラーの特性を活かした全天周画像編集</h2>

<p>画像の編集はPhotoshopで行うが、エクイレクタングラー形式の全天周画像・映像の360度視聴の検証を行うためのツールを活用する。PCであればGoPro VR PLAYER、スマートフォンであればジャイロでSingle/Dual表示も見れるTHETAアプリが便利だ。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03115.jpg" alt="" width="640" height="376" class="alignnone size-full wp-image-25008" srcset="/wp-content/uploads/2017/12/DSC03115.jpg 640w, /wp-content/uploads/2017/12/DSC03115-300x176.jpg 300w, /wp-content/uploads/2017/12/DSC03115-207x122.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>実際に作ってみた画像がこちらだ。球体に壁画が立体的にレイアウトされているが、これは画像編集のみで作成しており、一切CGは使っていないという。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03119.jpg" alt="" width="640" height="375" class="alignnone size-full wp-image-25009" srcset="/wp-content/uploads/2017/12/DSC03119.jpg 640w, /wp-content/uploads/2017/12/DSC03119-300x176.jpg 300w, /wp-content/uploads/2017/12/DSC03119-207x121.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これらはPhotoshopで画像を作ることができる。まず、画像の中心に横線を引く。この中心がファーストビューになるので、最初に表示された時に目の前に見せたいものを作っていく。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03121.jpg" alt="" width="640" height="378" class="alignnone size-full wp-image-25010" srcset="/wp-content/uploads/2017/12/DSC03121.jpg 640w, /wp-content/uploads/2017/12/DSC03121-300x177.jpg 300w, /wp-content/uploads/2017/12/DSC03121-207x122.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>右端と左端が円筒になるので、シークエンスするように写真をコピーなどして画像を合成していく。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03124.jpg" alt="" width="640" height="368" class="alignnone size-full wp-image-25012" srcset="/wp-content/uploads/2017/12/DSC03124.jpg 640w, /wp-content/uploads/2017/12/DSC03124-300x173.jpg 300w, /wp-content/uploads/2017/12/DSC03124-207x119.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>上下は画像が歪んでしまうため、グラデーションで無地にする。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03127.jpg" alt="" width="640" height="396" class="alignnone size-full wp-image-25013" srcset="/wp-content/uploads/2017/12/DSC03127.jpg 640w, /wp-content/uploads/2017/12/DSC03127-300x186.jpg 300w, /wp-content/uploads/2017/12/DSC03127-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>メインのオブジェクトを中心線の位置に置く。360度画像でも人間の目に最初に映る範囲は限られているので、ファーストビューを意識したほうが良く、画像や文字は小さくても問題ないとのこと。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03132.jpg" alt="" width="640" height="390" class="alignnone size-full wp-image-25014" srcset="/wp-content/uploads/2017/12/DSC03132.jpg 640w, /wp-content/uploads/2017/12/DSC03132-300x183.jpg 300w, /wp-content/uploads/2017/12/DSC03132-207x126.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ちなみに、画像内の地平線の位置をを上げたり下げたりすると、中心の自視点に対して周りの風景が上下し、見え方が変わる。地平線を下げると自分が高いところにいるようになり、上げると自分が落とし穴のような穴の中に落ちたようにも見える。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03136.jpg" alt="" width="640" height="308" class="alignnone size-full wp-image-25015" srcset="/wp-content/uploads/2017/12/DSC03136.jpg 640w, /wp-content/uploads/2017/12/DSC03136-300x144.jpg 300w, /wp-content/uploads/2017/12/DSC03136-207x100.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br></p>

<p><img src="/wp-content/uploads/2017/12/DSC03139.jpg" alt="" width="640" height="279" class="alignnone size-full wp-image-25017" srcset="/wp-content/uploads/2017/12/DSC03139.jpg 640w, /wp-content/uploads/2017/12/DSC03139-300x131.jpg 300w, /wp-content/uploads/2017/12/DSC03139-207x90.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>実際にVRを制作する場合は、酔いを起こさせないようにすることが大事。そのためには広範囲にコンテンツを置くのを避け、頭の動きが最低限になるようにレイアウトしたい。</p>

<p>特に上下の頭の振りは左右に振る場合より負荷がかかり酔いやすい。エリアをめいっぱい使わないで360度の意味はあるの？と考えがちだが、全体の世界観や没入感、空気感を表現することに360度見渡せるVRは有効なツールで意味はある。</p>

<p>その空間の中でユーザーが快適にコンテンツを楽しむためには見せたいオブジェクトのレイアウトする位置に留意する必要があると考える。実際、多くの人はコンテンツ内の真後ろを見ることはあまりせず、ファーストビューから離れるほど滞在時間は少なくなっている。</p>

<p>しかし、見る人がいることを考えて重要なものではないが、何か遊び心をあるものを置いておくと宝物を見つけたような気持ちになり、面白いかもしれない。それもVRならではの楽しみ方である。</p>

<p>特に画面の上下にオブジェクトをレイアウトすることを避けたいその他の理由として、全天周の球体へマッピングした時に歪んでしまうので避ける必要がある。</p>

<p>ただし、どうしても上下に置きたいものがある際は、Photoshopで歪みを気にせず全天周画像が作成できる「Flexify 2」というプラグインがあるので活用しよう。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03141.jpg" alt="" width="640" height="383" class="alignnone size-full wp-image-25019" srcset="/wp-content/uploads/2017/12/DSC03141.jpg 640w, /wp-content/uploads/2017/12/DSC03141-300x180.jpg 300w, /wp-content/uploads/2017/12/DSC03141-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 80%;">▲<strong>「Flexify 2」キュービック方式からエクイレクタングラー方式に変換して出力し、上下を見せることができる。</strong></span></p>

<p>VRの画面表示には全画面で見せるSingle Viewとヘッドマウントディスプレイ（以下、HMD）用のDual Viewがある。VRのコンテンツを作る際は、両方選べるように留意して作ったほうが良い。それぞれの特徴は以下の通りだ。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03147.jpg" alt="" width="640" height="394" class="alignnone size-full wp-image-25020" srcset="/wp-content/uploads/2017/12/DSC03147.jpg 640w, /wp-content/uploads/2017/12/DSC03147-300x185.jpg 300w, /wp-content/uploads/2017/12/DSC03147-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>VRコンテンツの展開方法</h2>

<p>SNSでのVRコンテンツの展開方法として代表的、かつお手軽なのは、YouTubeとFacebookだ。どちらもアップロードするだけで世界中のユーザーに簡単にリーチできる。YouTubeは動画のみのアップロードとなるが、ジャイロやSingle View/Dual Viewの表示も可能。Facebookは360度画像・動画ともにアップロード可能だが、ジャイロとSingle Viewでの視聴となる。インタラクションはつけられない。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03148.jpg" alt="" width="640" height="389" class="alignnone size-full wp-image-25022" srcset="/wp-content/uploads/2017/12/DSC03148.jpg 640w, /wp-content/uploads/2017/12/DSC03148-300x182.jpg 300w, /wp-content/uploads/2017/12/DSC03148-207x126.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>WebはGoogleの無料フレームワーク「Google VR View」、mozillaが提供する無料フレームワーク「A-Frame」があり、どちらも数行のHTMLを書くだけでVRページができる。HTMLにあまり詳しくない人でもソースコードをコピペして埋め込むだけで簡単にVRコンテンツが作れる。回転させる動作やゲーム性を加えることも可能だ。</p>

<h4>ソースコード例（A-Frame）</h4>

<p></p><pre class="crayon-plain-tag"><!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>A-FrameSample</title>
    <meta name="description" content="A-Frame Panorama Sample">
    <script src="aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-sky src="sample-photo.jpg" rotation="0 170 0"></a-sky>
    </a-scene>
  </body>
</html></pre><p></p>

<h4>ソースコード例（Google VR View）</h4>

<p></p><pre class="crayon-plain-tag"><html>
<title>Google VR View Sample</title>
<script src="../build/vrview.min.js"></script>
<script>
    var vrView;
    window.addEventListener('load', onVrViewLoad)
    function onVrViewLoad(){
        vrView = new VRView.Player('#vrview', {
            image: 'room1.jpg',
            is_stereo: true
        });
    }
</script>
<body>
<div id="vrview"></div>
</body>
</html></pre><p></p>

<p>VRのオーサリングツールは無料から使える日本製のInstaVR、Krpanaが提供するPanotourがある。インターフェイスから操作でき、コードを見なくていいので直感的に作ることができる。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03154.jpg" alt="" width="640" height="372" class="alignnone size-full wp-image-25023" srcset="/wp-content/uploads/2017/12/DSC03154.jpg 640w, /wp-content/uploads/2017/12/DSC03154-300x174.jpg 300w, /wp-content/uploads/2017/12/DSC03154-207x120.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ゲームエンジンで代表的なのはUnity、Unreal Engine。無料のアセットやサンプルコードもあるので、ノンプログラマでも挑戦しやすい。</p>

<p>VRコンテンツの基本をまとめると、以下のようになる。</p>

<ul>
<li>傾きのあるコンテンツは酔うのでNG</li>
<li>顔の縦運動より横運動をさせる</li>
<li>360度いっぱいにものを置かない</li>
<li>ファーストビューを決める</li>
<li>配置オブジェクトは思ったより小さくて良い</li>
<li>全天周投影法では解像度を可能な限り上げることで没入感が増す</li>
</ul>

<p>これらは、「酔わない、疲れない、極力頭を動かさない」ことにつながる。</p>

<p>Adobe Stockのような画像素材サイトで「エクイレクタングラー」と探すと素材が出てくるので、これらを上手く活用しながらVRコンテンツにチャレンジしてみよう。</p>

<p><img src="/wp-content/uploads/2017/12/DSC03153.jpg" alt="" width="640" height="428" class="alignnone size-full wp-image-25032" srcset="/wp-content/uploads/2017/12/DSC03153.jpg 640w, /wp-content/uploads/2017/12/DSC03153-300x201.jpg 300w, /wp-content/uploads/2017/12/DSC03153-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>Reactといえばコンポーネント！React VRの3Dプリミティブコンポーネントを探る、触る</title>
		<link>/karad5/23945/</link>
		<pubDate>Mon, 24 Jul 2017 01:00:05 +0000</pubDate>
		<dc:creator><![CDATA[原一浩]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[GearVR]]></category>
		<category><![CDATA[React VR]]></category>
		<category><![CDATA[WebVR]]></category>

		<guid isPermaLink="false">/?p=23945</guid>
		<description><![CDATA[連載： React VR (3)前回、React VRでパノラマ写真を見るというコンテンツを作成しました。 サンプルを試していただいた方は「なんか結構できたじゃん感」を満喫できたと思います。それもそのはず、360度写真の...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/react-vr/" class="series-453" title="React VR" data-wpel-link="internal">React VR</a> (3)</div><div id="attachment_23947" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23947" srcset="/wp-content/uploads/2017/07/Hello3DObject2_AmbientLight.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">今回のサンプルの完成版。ライティングとかもやるぞ</p></div>

<p><a href="https://html5experts.jp/karad5/23885/" target="_blank" data-wpel-link="internal">前回</a>、React VRでパノラマ写真を見るというコンテンツを作成しました。<br />
サンプルを試していただいた方は「<strong>なんか結構できたじゃん感</strong>」を満喫できたと思います。それもそのはず、360度写真のみのコンテンツは、天球にパノラマ画像を貼り付けた時点で、目的の99%を達成できたといえるからです。ほとんど完成といっていい状態でしょう。</p>

<p>しかし、他のVRコンテンツを触ったことがある人間なら、少しもの足りなさを感じることと思います。一つは<strong>インタラクティブ性のなさ</strong>、そしてもう一つは<strong>モノの存在感のなさ</strong>です。</p>

<p>インタラクティブ性のなさは、イベント駆動型のVRコンテンツの作成というハードルが待っていますが、今回はそれはさておき、モノの存在感について書いていきます。</p>

<p>パノラマ画像だけで構成された世界は、「<strong>一見、目の前で展開されている感じなのに、触ることができないほど遠くに広がる世界</strong>」と言えます。目の前の芝生に近付いて触ることはできませんし、奥の人に近付くこともできません。</p>

<p>仮に頑張って、インタラクティブ性を高めて奥に進めるように作ったとしても、そこにあるのは<strong>拡大されて画素が粗くなった人のようなナニカ</strong>でしかありません。</p>

<p>VRのモノとしての存在を確固たるものにするために大事なことは、VR空間に実際にモノを置いてみるということになります。</p>

<p>ということで、今回はReact VRに用意されているコンポーネントのうち、モノとして置けるコンポーネント、3Dプリミティブについて扱っていきます。</p>

<h2>いろいろなタイプのReact VR Components</h2>

<p><a href="https://facebook.github.io/react-vr/docs/getting-started.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式ドキュメント</a>にあるReact VR Componentsの目次は下記のような構成になっています。</p>

<ul>
<li>AmbientLight</li>
<li>Box</li>
<li>LiveEnvCamera</li>
<li>Cylinder</li>
<li>CylindricalPanel</li>
<li>DirectionalLight</li>
<li>Model</li>
<li>Pano</li>
<li>Plane</li>
<li>PointLight</li>
<li>Scene</li>
<li>Sound</li>
<li>Sphere</li>
<li>SpotLight</li>
<li>Video</li>
<li>VideoControl</li>
<li>VideoPano</li>
<li>VrButton</li>
</ul>

<p>いろいろありますね。「<strong>あれ?、これだけしかないの?</strong>」という見方もあるかもしれません。主要なものを役割ごとにカテゴライズしてみましたので順に見ていきましょう。各種コンポーネントの実装コードに興味がある方は、<a href="https://github.com/facebook/react-vr/tree/master/ReactVR/js/Views" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHubのReact VRリポジトリのViews以下</a>を見てみるとよいでしょう。</p>

<h3>空間を作るタイプのコンポーネント</h3>

<p>まず、チェックしておきたいのは空間を作るタイプのコンポーネントです。</p>

<ul>
<li>VideoPano</li>
<li>CylindricalPanel</li>
<li>Pano</li>
</ul>

<p><code>Pano</code>は、既に登場しましたが、360度写真をVR空間に貼り付けるタイプのコンポーネントです。</p>

<p><code>VideoPano</code>は、Panoと同様ですが、貼り付け可能コンテンツが360度動画となります。<code>CylindricalPanel</code>は、ちょっと特殊なコンポーネントで、内側にテクスチャを貼ることができ、子コンポーネントを収録できるタイプです。今回は触れません。</p>

<h3>ビデオ・オーディオ関連のコンポーネント</h3>

<p>ビデオの話が少し出ましたが、ビデオ・オーディオ系に関係してくるコンポーネントは以下となります。</p>

<ul>
<li>Sound</li>
<li>Video</li>
</ul>

<p><code>Sound</code>は、シーンに配置するコンポーネントですが、何か形があるわけではありません。音の発生源として配置する形になります。3Dオーディオをサポートしており、ヘッドマウントディスプレイを被って顔を左右に振ったりすると、音源の場所に応じたサウンドになることが確認できます。</p>

<p><code>Video</code>は、2Dのビデオを再生するためのコンポーネントです。これをユーザーの前面に貼ると巨大なテレビが目の前に広がったような演出ができます。</p>

<h3>ユーザーインターフェースとなるコンポーネント</h3>

<p>続いて、VR世界のユーザーインターフェースとなるコンポーネントが下記2つです。</p>

<ul>
<li>VrButton</li>
<li>VideoControl</li>
</ul>

<p><code>VrButton</code>は、ボタンです。応用性が高く、使い勝手の良いコンポーネントと言えるでしょう。<code>VideoControl</code>は、ビデオをコントロールするためのユーザーインターフェースとなります。
<code>Video</code>コンポーネントと<code>VideoControl</code>コンポーネントを組み合わせると、VR空間にビデオプレーヤーを作ることができます。</p>

<div id="attachment_23948" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/ReactVR_video-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23948" srcset="/wp-content/uploads/2017/07/ReactVR_video.png 640w, /wp-content/uploads/2017/07/ReactVR_video-300x162.png 300w, /wp-content/uploads/2017/07/ReactVR_video-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Videoコンポーネントでビデオを表示させているサンプル</p></div>

<h3>形状コンポーネント</h3>

<p>そして、今回扱う形状コンポーネントです。</p>

<ul>
<li>Box</li>
<li>Cylinder</li>
<li>Plane</li>
<li>Sphere</li>
<li>Model</li>
</ul>

<p>上記のうち、Modelを除いた4つは<strong>3Dプリミティブコンポーネント</strong>と呼ばれます。<code>Box</code>は立方体や直方体などを作成することができるタイプのコンポーネントです。<code>Cylinder</code>は、円筒形の形状コンポーネントで、設定によっては円錐形の形状を作成することができます。<code>Plane</code>は、フラットな平面コンポーネントです。</p>

<p>ちなみに、<code>Model</code>は空間に配置するコンポーネントだけど、別の3Dソフトなどで作成したモデルデータを使用するためのもので、今回は一旦スキップします。</p>

<p>これ以外にもライティングに関するコンポーネントも存在しますが、実際に使うところで解説していきます。</p>

<p>では、今回は実際に3Dプリミティブコンポーネントを、シーンにいろいろと配置し、様々なライティングをしてみましょう。</p>

<h2>3Dプリミティブコンポーネントを配置してみよう</h2>

<p>さて、これから3Dプリミティブコンポーネントを配置していろいろ実験していくわけですが、その前に、何か仮想現実の実験ぽくするための会場づくりをしましょう。React VRで何も背景に敷かない場合、漆黒の空間に単なる立方体が浮かぶことになります。それでは何も趣がないですよね。</p>

<p>ということで、<strong>VR空間をホロデッキ（アメリカのTVドラマ・映画のスタートレックに登場するホログラフィックルーム）として定義</strong>してみましょう。ホロデッキってなあに？って方は、Wikipediaの<a href="https://en.wikipedia.org/wiki/Holodeck" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ホロデッキに関する説明と写真</a>をご覧ください。</p>

<p>ホロデッキは、黒い部屋に、方眼紙のような感じで黄色の線が入っている部屋です。これを実現するために<code>Pano</code>コンポーネントを使います。<code>Pano</code>コンポーネントは360度写真を閲覧するために前回使いましたが、<code>Pano</code>コンポーネントはもう一つ使い方があって、6つのテクスチャを配列で渡してあげると、立方体のの内側にテクスチャが貼られた部屋を作ることができます。</p>

<p>では、まず新規React VRプロジェクトを作成するところから始めてみましょう。</p>

<h3>1. 新規React VRプロジェクトを作成し、Panoコンポーネントで部屋を作る</h3>

<p>まずはなにはともあれ、新規ReactVRプロジェクトを立ち上げましょう。名前は<code>Hello3DObject</code>としましょう。</p>

<p></p><pre class="crayon-plain-tag">$ react-vr init Hello3DObject
$ cd Hello3DObject</pre><p></p>

<p>続いて、<code>Pano</code>コンポーネントを使って、テクスチャが貼られた立方体の空間を作っていきます。プロジェクトルートにある「index.vr.js」の<code>View</code>コンポーネント以下を編集していきます。今回<code>Pano</code>コンポーネントの内側には、前後左右上下の6面にテクスチャを貼ります。貼るテクスチャは、<a href="http://www.premiumpixels.com/freebies/20-seamless-photoshop-grid-patterns/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">フリーのグリッドパターン &#8211; 20 Seamless Photoshop Grid Patterns</a>のうち一枚をPhotoShopで修正した格子状のものです。</p>

<div id="attachment_23950" style="width: 310px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/holodeck-300x300.png" alt="" width="300" height="300" class="size-medium wp-image-23950" srcset="/wp-content/uploads/2017/07/holodeck-300x300.png 300w, /wp-content/uploads/2017/07/holodeck-150x150.png 150w, /wp-content/uploads/2017/07/holodeck-207x207.png 207w, /wp-content/uploads/2017/07/holodeck.png 500w" sizes="(max-width: 300px) 100vw, 300px" /><p class="wp-caption-text">ホロデッキっぽいテクスチャ画像</p></div>

<ul>
<li><a href="https://html5experts.jp/wp-content/uploads/2017/07/holodeck.zip" data-wpel-link="internal">こちらからダウンロードください</a></li>
</ul>

<p>上記リンク先でダウンロードしたファイルを解凍し、中に入っている「holodeck.png」を「static_assets」ディレクトリ以下に配置します。</p>

<p><code>Pano</code>コンポーネントに対して六面にテクスチャを貼るには、<code>source</code>属性に<code>uri</code>プロパティを持ったオブジェクトを6つ含んだ配列を渡します。<code>asset</code>関数は、ファイル名を渡すと<code>{uri: パス名}</code>の形式で返るので、<code>asset</code>関数をそのまま<code>source</code>属性へ渡せばいいことになります。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
              &lt;Pano source={[
                asset('holodeck.png'), // 右
                asset('holodeck.png'), // 左
                asset('holodeck.png'), // 上
                asset('holodeck.png'), // 下
                asset('holodeck.png'), // 後
                asset('holodeck.png')  // 前
              ]}
              /&gt;
            &lt;/View&gt;</pre><p></p>

<p>さて、まずはここで一旦ビルドしてみましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm start</pre><p></p>

<p>ブラウザで、<code>http://localhost:8081/vr/</code>を開いてみましょう。スタートレックのホロデッキのような空間が出現したと思います。テクスチャのつなぎ目とか細かい点はサンプルということでご容赦ください。</p>

<div id="attachment_23949" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_holodeck-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23949" srcset="/wp-content/uploads/2017/07/Hello3DObject2_holodeck.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_holodeck-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_holodeck-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">ホロデッキに入った</p></div>

<h3>2. <code>Box</code>をいくつか並べて配置してみる</h3>

<p>ホロデッキ的な空間が出来たところで、<code>Box</code>コンポーネントを配置してみましょう。<code>Box</code>コンポーネントはシンプルなコンポーネントですが、よくありがちな失敗として、<code>Box</code>コンポーネントをインポートし忘れるということがあります。これから登場する<code>Cylinder</code>や<code>Sphere</code>も同様にimportし忘れがないようにしましょう。</p>

<p></p><pre class="crayon-plain-tag">import {
  AppRegistry,
  asset,
  Pano,
  Box,
  Cylinder,
  Sphere,
  View,
} from 'react-vr';</pre><p></p>

<p>では、<code>Box</code>コンポーネントを目の前に3つ配置してみます。<code>Pano</code>コンポーネントの下に<code>Box</code>コンポーネントを下記のように3つ記述します。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
                &lt;Pano ... /&gt; 
                &lt;Box dimWidth={0.5}
                     dimDepth={0.5}
                     dimHeight={0.5}
                     style={{
                       color: '#00f',
                       transform: [{translate: [1, 0, -2]}],
                     }}
                     lit={false}
                /&gt;
                &lt;Box dimWidth={0.3}
                     dimDepth={0.5}
                     dimHeight={1}
                     style={{
                       color: '#f00',
                       transform: [{translate: [0.2, 0, -2]}],
                     }}
                     lit={false}
                /&gt;
                &lt;Box dimWidth={0.7}
                     dimDepth={1}
                     dimHeight={0.3}
                     style={{
                       color: '#0f0',
                       transform: [{translate: [-0.7, 0, -2]}],
                     }}
                     lit={false}
                /&gt;
            &lt;/View&gt;</pre><p></p>

<p><code>dimWidth</code>、<code>dimHeight</code>、<code>dimDepth</code>の各属性は、幅、高さ、奥行きのサイズに相当します。この比率を変えることで、立方体や柱のようなもの、平らな板のようなものを作り出すことができます。</p>

<p>また、<code>style</code>属性で色が定義されていることもわかります。3つの色は右から青、赤、緑の原色です。<code>style</code>属性に<code>transform</code>というプロパティが定義されていますが、ここで配置を指定しています。位置関係の変形は、<code>translate</code>で指定します。配列で指定し、左からX座標、Y座標、Z座標となります。Z座標は奥行きです。ちなみにマイナスの数値になればなるほど初期状態の位置から奥へ向かって移動する形になります。</p>

<p><code>lit</code>という属性がありますが、こちらはライティングに関するプロパティで、後ほど解説します。</p>

<div id="attachment_23952" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_box-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23952" srcset="/wp-content/uploads/2017/07/Hello3DObject2_box.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_box-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_box-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Boxコンポーネントを3つ配置した</p></div>

<p><code>Box</code>コンポーネントを配置できたところで、他のコンポーネントを配置していきましょう!</p>

<h3>3. <code>Box</code>だけでなく、<code>Cylinder</code>や<code>Sphere</code>を配置してみる</h3>

<p>さて、今度は<code>Cylinder</code>や<code>Sphere</code>もシーンに配置してみます。一旦<code>Box</code>コンポーネントのパートで作った3つのボックスは消してしまいましょう。勢いあまってホロデッキっぽくしている<code>Pano</code>まで消さないようにしてくださいね、情感がなくなってしまいますので。</p>

<p>まず、<code>Cylinder</code>コンポーネントについて。Cylinder、つまりカタカナでいうシリンダーは、円筒を意味しますが、<code>Cylinder</code>コンポーネントはプロパティ次第で円錐形にもなります。ポイントは<code>radiusTop</code>と<code>radiusBottom</code>で、<code>radiusTop</code>が小さければ山のようになっていき、<code>radiusBottom</code>が大きければ、ラッパのような形状になっていきます。どちらの値も等しい時だけ円筒形になります。</p>

<p>続いて<code>Sphere</code>コンポーネントですが、Sphereというのは球体です。<code>Sphere</code>コンポーネントはなかなか使い出があるコンポーネントで、四角形や円筒形を使う機会はそれほどないかもしれませんが、球体というのはテクスチャを貼り付ければ惑星になったりと応用性が高い3Dプリミティブコンポーネントです。下記のようにシーンに配置してみました。それぞれ一つずつ配置しています。<code>Sphere</code>コンポーネントには<code>widthSegments</code>と<code>heightSegments</code>というプロパティがありますが、これは球体を構成するセグメント（分割数）を定義しています。この数が増えるとなめらかな球体へ近づいていきます。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
                &lt;Pano ... /&gt; 
                &lt;Box dimWidth={0.3}
                     dimDepth={0.3}
                     dimHeight={0.3}
                     style={{
                       color: '#00f',
                       transform: [{translate: [0.5, -0.5, -1]}]
                     }}
                     lit={false}
                /&gt;
                &lt;Cylinder radiusTop={0.1}
                          radiusBottom={0.4}
                          dimHeight={0.8}
                          segments={20}
                          style={{
                            color: '#f00',
                            transform: [{translate: [-0.2, -1, -3]}],
                          }}
                          lit={false}
                /&gt;
                &lt;Sphere radius={0.3}
                        widthSegments={15}
                        heightSegments={15}
                        style={{
                          color: '#0f0',
                          transform: [{translate: [-2, -1, -5]}],
                        }}
                        lit={false}
                /&gt;
            &lt;/View&gt;</pre><p></p>

<p>今回、ちょっと配置に工夫をしています。<code>translate</code>プロパティの値を変更していて、手前に立方体、奥に行くにしたがって円筒形、球体と並ぶようにしています。これで3Dプリミティブの配置は完了したわけですが、何かもの足りません。のっぺりしていて立体感がないのです。ということで、この3Dオブジェクトに光を当てていきましょう。</p>

<div id="attachment_23953" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_three_obj-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23953" srcset="/wp-content/uploads/2017/07/Hello3DObject2_three_obj.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_three_obj-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_three_obj-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">配置された、球体、円錐形、立方体</p></div>

<h3>4. 3Dプリミティブオブジェクトに光を当ててみる</h3>

<p>React VRでライティング（照明）を行うには、用意されている4つのコンポーネントのいずれかもしくは複数の組み合わせを使用します。</p>

<p>用意されているReact VRコンポーネントは下記の4つです。</p>

<ul>
<li>AmbientLight</li>
<li>DirectionalLight</li>
<li>PointLight</li>
<li>SpotLight</li>
</ul>

<p><code>AmbientLight</code>は、<strong>環境光</strong>と呼ばれるもので、シーン全体に均一な影響を与える光源を定義します。これは無指向性で、すべてのオブジェクトが等しく明るくなります。</p>

<p><code>DirectionalLight</code>は、<strong>指向性があるが、距離による明かりの減光は発生しないタイプの光源</strong>です。太陽の明かりのようなものと言えます。</p>

<p><code>PointLight</code>は、<strong>ある一点から発生する光源</strong>で、距離による減光もあります。見えない間接照明のようなものと言えるでしょう。</p>

<p><code>SpotLight</code>は、文字通り<strong>スポットライトのような特性を持つととらえられる光源</strong>です。指向性があり、距離による範囲の拡大と減光があります。</p>

<p>20程度のコンポーネントしか用意されていないReact VRにおいて、ライティング関係だけで、4つもコンポーネントが用意されているのは、一つはVRにおいてそれだけ重要であるということと、React VRが使用しているThree.jsにおいても手厚いサポートがされていること、そしておそらくはこうしたライティング関係は、カスタムコンポーネントとしての作成が困難であろうことなどが推測されます。</p>

<p>まずは普通の光を当てましょう。太陽のように上から降り注ぐ普通の明かりです。こういった明かりは、<code>DirectionalLight</code>コンポーネントを使うことで実現できます。</p>

<p>では、まず準備段階として、先ほど作成した3種類の3Dプリミティブオブジェクトが持っている<code>lit</code>プロパティを<code>true</code>にしてみましょう。これで光源の影響を受けるようになります。試しに<code>true</code>にした段階で、ブラウザをリロードしてみてください。まだ光が当たっていないため、真っ黒のオブジェクトになってしまったと思います。</p>

<div id="attachment_23954" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_three_obj_black-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23954" srcset="/wp-content/uploads/2017/07/Hello3DObject2_three_obj_black.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_three_obj_black-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_three_obj_black-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">真っ黒の3Dプリミティブオブジェクト</p></div>

<p>続いて、<code>DirectionalLight</code>コンポーネントを配置します。<code>Pano</code>コンポーネントの下あたりでOKです。こんな感じにします。(importを忘れずに)</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
            &lt;Pano ... /&gt;
            {/* Lighting */}
            &lt;DirectionalLight   intensity={0.5}
                                style={{
                                color: 'white',
                                transform: [
                                    {translate: [0, 0, 0]},
                                    {rotateX: 45}]
                                }}/&gt;
            &lt;Box ... /&gt;
            &lt;Cylinder ... /&gt;
            &lt;Sphere ... /&gt;
        &lt;/View&gt;</pre><p></p>

<p><code>intensity</code>プロパティは、光の強度を設定します。また、光源にも色をつけることができ、スタイルシートで定義します。<code>transform</code>プロパティで<code>rotateX</code>の設定をしていますが、これは、ちょっと斜め前方から光を当てたいからです。本当の真上からあたる光は、側面すら陰になってしまい、あまり面白みはありません。</p>

<div id="attachment_23955" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_DirectionalLight-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23955" srcset="/wp-content/uploads/2017/07/Hello3DObject2_DirectionalLight.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_DirectionalLight-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_DirectionalLight-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">DirectionalLightを設定したシーン</p></div>

<p>次は<code>PointLight</code>コンポーネントを配置してみましょう。PointLightは点光源なので、任意の位置に配置すると、その周囲を照らしてくれます。うまく使うと印象的な効果を与えることができます。さて、今回は、PointLightをちょっと手前に配置し、しかもちょっと青系の光として照らしてみましょう。どんな感じになるでしょうか。</p>

<p><code>DirectionalLight</code>コンポーネントの下に、下記のように<code>PointLight</code>コンポーネントを設置します。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
            &lt;Pano ... /&gt;
            {/* Lighting */}
            &lt;DirectionalLight   intensity={0.5}
                                style={{
                                color: 'white',
                                transform: [
                                    {translate: [0, 0, 0]},
                                    {rotateX: 45}]
                                }}/&gt;
            &lt;PointLight intensity={5}
                        style={{
                            color: '#00f',
                            transform: [{translate: [0.1, -1, -2]}]
                        }}/&gt;
            &lt;Box ... /&gt;
            &lt;Cylinder ... /&gt;
            &lt;Sphere ... /&gt;
        &lt;/View&gt;</pre><p></p>

<p><code>intensity</code>プロパティはちょっと強めの<code>5</code>にしました。色は青色、そして位置はちょっと手前でちょっと下から照らす感じにしています。</p>

<p>すると、こんな感じで、青い光がオブジェクトに反射するような雰囲気になりました。ちょっとムーディで怪しげですね。</p>

<div id="attachment_23956" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_PointLight-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23956" srcset="/wp-content/uploads/2017/07/Hello3DObject2_PointLight.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_PointLight-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_PointLight-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">PointLightを反映させた3Dプリミティブオブジェクト</p></div>

<p>さて、これで終了にしてもいいのですが、全体的にちょっと暗いですよね、そこで光の調整をしたいと思います。</p>

<p>では<code>AmbientLight</code>コンポーネントを配置してみましょう。AmbientLightは環境光で、全てのオブジェクトに均等に光を当てるという機能を持っています。<code>AmbientLight</code>コンポーネントを使うことで、全体的な光の加減を微調整することもできます。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
            &lt;Pano ... /&gt;
            {/* Lighting */}
            &lt;DirectionalLight intensity={0.5}
                                style={{
                                color: 'white',
                                transform: [
                                    {translate: [0, 0, 0]},
                                    {rotateX: 45}]
                                }}/&gt;
            &lt;PointLight intensity={5}
                        style={{
                            color: '#00f',
                            transform: [{translate: [0.1, -1, -2]}]
                        }}/&gt;
            &lt;AmbientLight intensity={0.3}/&gt;
            &lt;Box ... /&gt;
            &lt;Cylinder ... /&gt;
            &lt;Sphere ... /&gt;
        &lt;/View&gt;</pre><p></p>

<p><code>intensity</code>プロパティは、ほんの少しだけ設定しました。これでブラウザをリロードしてみると、ほんのりと明るくなったことがわかると思います。</p>

<div id="attachment_23947" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23947" srcset="/wp-content/uploads/2017/07/Hello3DObject2_AmbientLight.png 640w, /wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-300x162.png 300w, /wp-content/uploads/2017/07/Hello3DObject2_AmbientLight-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">AmbientLightを反映させた3Dプリミティブオブジェクト</p></div>

<p>いろいろな形状のものを置き、ライティングを終えたところで、こんな風に思った方はいないでしょうか。<br />
「現実世界で立方体や球なんて、積み木とかにしか存在しないじゃないか！」<br />
と。</p>

<p>四角や丸を置くためにVRを始めたわけじゃないんだという気持ちはよくわかりますので、次回は応用編として既存の3DモデルをReact VRで扱う方法について解説していきます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[React VR]]></series:name>
	</item>
		<item>
		<title>React VR×360度画像！Web上でパノラマVR表示を試す</title>
		<link>/karad5/23885/</link>
		<pubDate>Mon, 26 Jun 2017 01:00:06 +0000</pubDate>
		<dc:creator><![CDATA[原一浩]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[GearVR]]></category>
		<category><![CDATA[React VR]]></category>
		<category><![CDATA[WebVR]]></category>

		<guid isPermaLink="false">/?p=23885</guid>
		<description><![CDATA[連載： React VR (2)前回は、React VRのインストールから「Hello, World」の表示、そして日本語の表示までを行いました。 今回は、RICOH THETAなどで撮影した360度画像をVRコンテンツ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/react-vr/" class="series-453" title="React VR" data-wpel-link="internal">React VR</a> (2)</div><p><a href="https://html5experts.jp/karad5/23543/" target="_blank" data-wpel-link="internal">前回</a>は、React VRのインストールから「Hello, World」の表示、そして日本語の表示までを行いました。
今回は、RICOH THETAなどで撮影した360度画像をVRコンテンツとして表示してみましょう。</p>

<div id="attachment_23871" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_20170620-162554-640x360.png" alt="" width="640" height="360" class="size-large wp-image-23871" srcset="/wp-content/uploads/2017/06/Screenshot_20170620-162554.png 640w, /wp-content/uploads/2017/06/Screenshot_20170620-162554-300x169.png 300w, /wp-content/uploads/2017/06/Screenshot_20170620-162554-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">今回のサンプルの完成品</p></div>

<h2>React VRプロジェクトのフォルダ構成について</h2>

<p>と、その前にちょっとしたおさらいです。</p>

<p><a href="https://html5experts.jp/karad5/23543/" target="_blank" data-wpel-link="internal">前回</a>は、「ちょっと日本語を表示したい!」というところから、いきなりハードな展開へとなってしまいましたが、ここでちょっと、React VRプロジェクトがどのような構成になっているのかを確認しておきましょう。</p>

<p></p><pre class="crayon-plain-tag">.
├── .babelrc
├── .flowconfig
├── .gitignore
├── .watchmanconfig
├── tests
│   └── client.js
├── index.vr.js
├── node_modules
├── package.json
├── rn-cli.config.js
├── static_assets
│   └── chess-world.jpg
├── vr
│   ├── client.js
│   └── index.html
└── yarn.lock</pre><p></p>

<p>「.」で始まる各種ドットファイル達は、ビルド用だったり、flowやwatchmanといったツールのための設定ファイルです。</p>

<p>いくつかファイルやフォルダがありますが、React VRの開発に必要な部分は、React VRにおけるRootコンポーネント(大元のコンポーネント)となる「index.vr.js」と、実際にブラウザでReact VRコンテンツをマウントするためのファイルとしての「vr/」以下の各種ファイル、そして各種静的リソースのためのアセットディレクトリ「static_assets」が中心となります。ここには、フォントやテクスチャなどを配置します。</p>

<p>React Nativeの開発をした方は「おっ」と思ったかもしれませんが、「index.android.js」「index.ios.js」などと同じような位置づけで「index.vr.js」という命名規則となっているのです。そして、フレームワークの構成的には「今はWeb出力がメインということでreact-vr-webを使っていまっせ」ということが読み取れます。この構成から見て、将来的にはネイティブデバイス向けのビルドも考えていることが期待できそうです。</p>

<h2>jestを使用してReact VRのテストを実行する</h2>

<p>「<strong>tests</strong>」というのは、テスト用のファイルを配置するディレクトリです。Facebook製のテストフレームワーク<code>jest</code>を実行すると、ここにあるファイルが対象となってテストが実行されます。あらかじめプロジェクトにはテストの実行が可能になっています。</p>

<p>テストの実行には<code>jest</code>が必要なので、下記のようにインストールしておきましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm install -g jest</pre><p></p>

<p>testコマンドで実行ができます。ただし、下記のように失敗します。</p>

<p></p><pre class="crayon-plain-tag">$ npm test

&gt; HelloWorld@0.0.1 test C:\****\HelloWorld
&gt; jest

 FAIL  __tests__\client.js
  ● Test suite failed to run

    Cannot find module 'Mesh' from 'setup.js'

      at Resolver.resolveModule (node_modules\jest-resolve\build\index.js:169:17)
      at Object.&lt;anonymous&gt; (node_modules\react-vr\jest\setup.js:22:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        12.811s
Ran all test suites.
npm ERR! Test failed.  See above for more details.</pre><p></p>

<p>実は、GitHubにはもうissueとして反映されているのですが、react-vrライブラリの不具合なようです。解決策も提示されているので、もうしばらくすると正しく動作するようになると思います。</p>

<ul>
<li><a href="https://github.com/facebook/react-vr/commit/f9c2b537ee5b60ec45d2c6b5fb3aaa72d45f7f3e" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fixed bug where npm test for init project would not pass &#8211; because je… · facebook/react-vr@f9c2b53</a></li>
</ul>

<p>VRのテスト周りもプロジェクトにセットアップ済というのは、なかなか嬉しいことですね。</p>

<h2>パノラマVRはこんなにも簡単!</h2>

<p>さて、ファイル構成などの意味もわかってきてスッキリしたところで、ちょっと実践的なコンテンツを作成してみましょう。</p>

<p>すぐ作れてインパクトも強く、応用性が高いVRコンテンツといえば、パノラマVRコンテンツでしょう。実際、これまで作ってきた「Hello World!」は、パノラマ背景に背景色付きテキストが宙に浮かぶというものでした。パノラマVRコンテンツというのは、360度写真さえあれば、すぐに作成することが出来るのです。</p>

<p>とはいえ、いざ360度写真を使おうと思っても<a href="https://theta360.com/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RICOH THETA</a>のユーザでもない限り、360度写真の準備をするのは大変です。そこで僕は友人の寺田さんが撮ってきた360度写真をお借りすることにしました。寺田さんは、<a href="https://www.cmscom.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">株式会社CMSコミュニケーションズ</a>という会社の社長であるのですが、かなり古くからのTHETAユーザで、360度写真を撮り続けておられます。また、Plone Ambassadorや元PyCon JPの座長などを務めたりなど精力的な活動をされています。</p>

<p>さて、今回は寺田さんがニューヨークに行った時の写真をお借りしました。また、写真のライセンスは「<a href="https://creativecommons.org/licenses/by/4.0/deed.ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CC-BY 4.0 国際</a> (<a href="https://twitter.com/terapyon" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@terapyon</a>)」となりますので、お取り扱いには注意をお願いします。</p>

<div id="attachment_23860" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/2016_10_17__22_05_18-640x320.jpg" alt="" width="640" height="320" class="size-large wp-image-23860" srcset="/wp-content/uploads/2017/06/2016_10_17__22_05_18.jpg 640w, /wp-content/uploads/2017/06/2016_10_17__22_05_18-300x150.jpg 300w, /wp-content/uploads/2017/06/2016_10_17__22_05_18-207x104.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">寺田さんからのニューヨーク写真</p></div>

<h3>新規プロジェクトを作成し、360度写真を配置</h3>

<p>それでは、新しくプロジェクトを作成してみましょう。<code>ReacrVrSamplePano</code>というプロジェクト名にしてみます。</p>

<p></p><pre class="crayon-plain-tag">$ react-vr init ReacrVrSamplePano</pre><p></p>

<p>プロジェクトディレクトリ内へ移動しておきます。</p>

<p></p><pre class="crayon-plain-tag">$ cd ReacrVrSamplePano</pre><p></p>

<p>プロジェクトの作成が終わったら、下記リンク先から写真をダウンロードし、プロジェクトの「static_assets」ディレクトリへ配置しましょう。</p>

<ul>
<li><a href="https://html5experts.jp/wp-content/uploads/2017/06/2016_10_17__22_05_18.zip" data-wpel-link="internal">寺田さんからのニューヨーク360度写真</a></li>
</ul>

<p>配置が終わったら「index.vr.js」を開いて、<code>ReacrVrSamplePano</code>クラスを下記のように編集します。</p>

<p></p><pre class="crayon-plain-tag">export default class ReacrVrSamplePano extends React.Component {
  render() {
    return (
      &lt;View&gt;
        &lt;Pano source={asset('2016_10_17__22_05_18.jpg')}/&gt;
      &lt;/View&gt;
    );
  }
};</pre><p></p>

<p>なんと！<a href="https://html5experts.jp/karad5/23543/" target="_blank" data-wpel-link="internal">前回</a>の 「Hello World!」プロジェクトよりも短くなってしまいました。これは非常に楽勝ですね！などと調子に乗らないようにしましょう。内部では複雑なことが行われているのです。</p>

<p>さて、<code>Pano</code>コンポーネントとは何でしょうか。Panoというのは、<a href="https://facebook.github.io/react-vr/docs/pano.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React VRのドキュメント</a>によれば、1000mの球だということです。これはユーザーを中心に絶対配置されており、内側に360度画像が投影されています。</p>

<p><code>Pano</code>コンポーネントは、JSX上では1行ですが、実際は内部で複雑なことをしています。<code>Pano</code>コンポーネントのソースはこちらになります。</p>

<ul>
<li><a href="https://github.com/facebook/react-vr/blob/master/ReactVR/js/Views/Pano.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-vr/Pano.js at master · facebook/react-vr</a></li>
</ul>

<p>えらく長いソースだなあと思われたかもしれませんが、このコンポーネントは、<code>RCTBaseView</code>というクラスを継承しているので、実はもっと長いロジックを持っています。ポイントとしては、Panoは、球体なのでTHREE.SphereというThree.jsの球オブジェクトを内部で持っているという点です。</p>

<p>ここで言いたいことは、上記のソースをすべて読んで理解しましょうということではありません。大事なことはフレームワークの表面的な使い方だけでなく、いざとなったら元ソースも覗いてやろうという気概なのです。</p>

<p>そうそう、コードを変更したところで話が止まっていました。さっそくブラウザで見るためにプロジェクトを実行しましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm start</pre><p></p>

<p><code>HelloWorld</code>プロジェクトのときと同じようにブラウザで表示してみましょう。無事ニューヨークの景色がブラウザで表示されていれば完成です。</p>

<h2>GearVRで見てみる</h2>

<p>もし、GearVRとGalaxy系のスマートフォンを持っていたら」という前提があるのですが、持っていたら是非ここで紹介するGearVRによるパノラマVRコンテンツを体験してみてください。</p>

<p>PCのブラウザやスマートフォンで表示させたものも結構感動しますが、GearVRでこれを表示してみると感動は何倍にもなります。GearVRを使うと、センサーのおかげで顔のトラッキングがスムーズですし、CarmelというVRブラウザを使えばWeb上のVRコンテンツもすぐに体験できます。Carmelは、GearVR内のアプリストアにてダウンロードすることができます。</p>

<div id="attachment_23863" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Carmel-Developer-Preview-Oculus-640x412.png" alt="" width="640" height="412" class="size-large wp-image-23863" srcset="/wp-content/uploads/2017/06/Carmel-Developer-Preview-Oculus.png 640w, /wp-content/uploads/2017/06/Carmel-Developer-Preview-Oculus-300x193.png 300w, /wp-content/uploads/2017/06/Carmel-Developer-Preview-Oculus-207x133.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Carmelのサイトキャプチャ</p></div>

<p>ただし、デベロッパープレビュー中のCarmelでVRコンテンツを見るためには、ちょっとした前準備が必要になります。Oculusのサイトの<a href="https://developer.oculus.com/documentation/vrweb/latest/concepts/carmel-launching-content/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Launching Your Content</a>を見つつ進めていきましょう。</p>

<p>まず、<code>vr/</code>以下に<code>ovr.html</code>というファイル名で下記を作成します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;ovr&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href="ovrweb:http://あなたのPCのIPアドレス:8081/vr"&gt;
  Navigate to an HTTP experience
&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>ちなみに、「<strong>あなたのPCのIPアドレス</strong>」は各自のPCのIPアドレスとなります。
ここで書かれているのは、aタグによりVRコンテンツへのリンクが表示されるだけのHTMLですが、リンク先の<code>http</code>の前に<code>ovrweb</code>というプロトコルがついています。
このプロトコルをCarmelがインストールされたスマートフォンで開くと、Carmelが立ち上がり、GearVRへのセットを促されます。
それでは、「http://あなたのPCのIPアドレス:8081/vr/ovr.html」をスマートフォンで開いて、リンクをクリックしてみましょう。</p>

<div id="attachment_23868" style="width: 370px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_20170620-144349-360x640.png" alt="" width="360" height="640" class="size-large wp-image-23868" srcset="/wp-content/uploads/2017/06/Screenshot_20170620-144349.png 360w, /wp-content/uploads/2017/06/Screenshot_20170620-144349-169x300.png 169w, /wp-content/uploads/2017/06/Screenshot_20170620-144349-116x207.png 116w" sizes="(max-width: 360px) 100vw, 360px" /><p class="wp-caption-text">GearVRに促すガイドが表示される</p></div>

<p>リンクをタップした後のガイダンスに従いスマートフォンをGearVRに装着し、頭にGearVRを装着すると、目の前にはニューヨークが広がるはずです(後ろを振り向くと寺田さんに会えることでしょう)。</p>

<div id="attachment_23871" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_20170620-162554-640x360.png" alt="" width="640" height="360" class="size-large wp-image-23871" srcset="/wp-content/uploads/2017/06/Screenshot_20170620-162554.png 640w, /wp-content/uploads/2017/06/Screenshot_20170620-162554-300x169.png 300w, /wp-content/uploads/2017/06/Screenshot_20170620-162554-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">今回のサンプルの完成品</p></div>

<p>ただ日本語については、Carmel上だとPCブラウザで見た時ほど綺麗に表示されないことがわかります。Carmelがデベロッパープレビュー版だから起きるのか、レンダリングエンジンのせいかは不明ですが、今後改善されることを期待しましょう。</p>

<div id="attachment_23874" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_20170620-162915-640x360.png" alt="" width="640" height="360" class="size-large wp-image-23874" srcset="/wp-content/uploads/2017/06/Screenshot_20170620-162915.png 640w, /wp-content/uploads/2017/06/Screenshot_20170620-162915-300x169.png 300w, /wp-content/uploads/2017/06/Screenshot_20170620-162915-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">GearVRで見ると、日本語表示がすこしおかしい</p></div>

<h2>まとめ</h2>

<p>WebVRは、その技術構成上、どうしてもネイティブなVRコンテンツよりも制約事項が多くなります。</p>

<p>一方で、「Webページを表示するだけでVRコンテンツを見ることができる」「ヘッドマウントディスプレイがなくてもある程度の体験が味わえる」という手軽さは、非常に魅力的です。</p>

<p>近しい人が撮った360度写真や動画などは、今までの付き合いなどといった経験が加味されて、よりリアルにコンテンツを味わうことが可能になる可能性を秘めています。表現としてのリアルよりも、自分と関係があるコンテンツという意味でのリアルさ、これはひょっとしたらネイティブVRにない強みになるかもしれません。</p>

<p>次回は、React VRにおける3Dプリミティブの利用や、3Dモデルの配置などを見ていきましょう。</p>

<p>※ 今回のサンプルプロジェクト2つは、GitHubに置いてあります。利用方法、ライセンスなどをお守りの上、ご利用ください。</p>

<ul>
<li><a href="https://github.com/karad/html5_react_vr_samples" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">karad/html5_react_vr_samples</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[React VR]]></series:name>
	</item>
		<item>
		<title>React VRで始めるお手軽WebVRプログラミング</title>
		<link>/karad5/23543/</link>
		<pubDate>Fri, 23 Jun 2017 01:00:54 +0000</pubDate>
		<dc:creator><![CDATA[原一浩]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[React VR]]></category>
		<category><![CDATA[WebVR]]></category>

		<guid isPermaLink="false">/?p=23543</guid>
		<description><![CDATA[連載： React VR (1)React VRというのは、Facebookが開発し、GitHubにてBSDライセンスで公開しているオープンソースのVRアプリケーションフレームワークです。現在のところは、Webブラウザ向...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/react-vr/" class="series-453" title="React VR" data-wpel-link="internal">React VR</a> (1)</div><p><a href="https://facebook.github.io/react-vr/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React VR</a>というのは、Facebookが開発し、GitHubにてBSDライセンスで公開しているオープンソースのVRアプリケーションフレームワークです。現在のところは、Webブラウザ向けにWebGLとWebVRを使ったVRアプリケーションを作るための様々な仕組みを提供しています。</p>

<div id="attachment_23874" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_20170620-162915-640x360.png" alt="" width="640" height="360" class="size-large wp-image-23874" srcset="/wp-content/uploads/2017/06/Screenshot_20170620-162915.png 640w, /wp-content/uploads/2017/06/Screenshot_20170620-162915-300x169.png 300w, /wp-content/uploads/2017/06/Screenshot_20170620-162915-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">VRコンテンツは、実行して動いた時の満足感がかなり高いです</p></div>

<p>React VRを知らなくても、ReactやReact Nativeなら知っているという人もいるかもしれません。VRコンテンツを作るには新しいフレームワークやライブラリなどを学ぶ必要がありましたが、Reactと同じ考え方を使ってVRコンテンツを作ることができる点が、他のフレームワークと異なる点です。</p>

<h2>ネイティブVRが最高の体験をもたらすとは限らない</h2>

<p>VRというと何らかのVRヘッドマウントを装着して体験するものというイメージがあります。また、VRヘッドマウントは高額で、VRを体験するハードルが高かったことも事実です。そんな中、ある程度のクオリティを保ちつつも安価なVRヘッドマウントとして登場したのが、GearVRです。</p>

<p>私もGearVRはすぐに購入してゲームや体験系コンテンツをいろいろと試してみました。もちろん、ジュラシックワールドの恐竜にはリアリティを感じましたし、3Dのシューティングゲームでは3D酔いも体験しました。
しかし、個人的に一番衝撃を受けたのは<a href="http://www.vr-cruise.com/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">VR CRUISE</a>の産経フォトです。</p>

<div id="attachment_23847" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/Screenshot_2016-03-15-00-03-21-640x360.png" alt="" width="640" height="360" class="size-large wp-image-23847" srcset="/wp-content/uploads/2017/06/Screenshot_2016-03-15-00-03-21.png 640w, /wp-content/uploads/2017/06/Screenshot_2016-03-15-00-03-21-300x169.png 300w, /wp-content/uploads/2017/06/Screenshot_2016-03-15-00-03-21-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">当時の産経フォト</p></div>

<p>特に、「東日本大震災でのタンカーが乗り上げている風景のパノラマ写真」には一番度肝を抜かれました。作りとしては360度写真であり、すごいポリゴン技術を利用しているわけではないのですが、コンテンツが日常生活と地続きにあるという感覚が、リアリティを感じさせ、恐怖を感じさせたのです。</p>

<p>そこで思ったことは、VRといっても受け手の中にある感性によっては、シンプルなコンテンツでも十分に伝わる体験があるということでした。</p>

<h2>React VRのアーキテクチャをざっと知る</h2>

<div id="attachment_23880" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/React-VR-A-framework-for-building-VR-apps-using-React-640x412.png" alt="" width="640" height="412" class="size-large wp-image-23880" srcset="/wp-content/uploads/2017/06/React-VR-A-framework-for-building-VR-apps-using-React.png 640w, /wp-content/uploads/2017/06/React-VR-A-framework-for-building-VR-apps-using-React-300x193.png 300w, /wp-content/uploads/2017/06/React-VR-A-framework-for-building-VR-apps-using-React-207x133.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">React VRの公式サイト</p></div>

<p>React VRを語る上で欠かせないのが、WebVRという仕様と、Three.jsというライブラリの存在です。<a href="https://webvr.info/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebVR</a>は、VRヘッドマウント事態の情報やリアルタイムな傾きや向きなどをWebブラウザへと伝えるための仕様で、これによりGearVRなどでWebVRを閲覧することが出来ます。
Three.jsは、3Dのライブラリです。本誌でも過去に特集されているので改めての説明は省きます。</p>

<p>React VRは、WebVRとThree.jsをJavaScriptでごりごりと作っていくという世界観にもう2レイヤー加えたようなものと言えます。WebVRとThree.jsは、OVRUIというレイヤーでラッピングされ、そのAPIをReactコンポーネントを通じてユーザーは利用するということになります。</p>

<h2>早速作ってみよう</h2>

<p>では早速、React VRでまずはプログラムを作ってみましょう。React VRに付属している「Hello World」サンプルで、一通りの最低限な使い方を学んでみることにします。</p>

<p>React VRはReactとついているので、ちょっと怖気づいてしまうかもしれませんが、サンプル自体は非常に簡単です。まず初めに言っておきますと、React VRではターミナル(コマンドプロンプト)を頻繁に使います。なので、MacOSであれば「ターミナル」、Windowsであれば「コマンド プロンプト」を使ってサンプル作成を進めることになります（以降はWindows環境を前提として進めますが、Macでも同様に試して頂けます）。</p>

<h2>React VRのコンソールツールをインストール</h2>

<p>React VRには、<code>react-vr-cli</code>というコンソールツールが用意されており、インストールすると<code>react-vr</code>というコマンドが使えるようになります。ということで、なにはともあれこのツールをインストールしましょう。<code>react-vr-cli</code>は、Node.js製のツールなのでまだな方は「<a href="https://nodejs.org/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node.js</a>」を導入しておきましょう。</p>

<p>続いて<code>react-vr-cli</code>を、Node.jsのパッケージマネージャーであるnpmコマンドでインストールしていきます。</p>

<p></p><pre class="crayon-plain-tag">$ npm install -g react-vr-cli

... 略 ...

C:\Program Files (x86)\Nodist\bin\react-vr -&gt; C:\Program Files (x86)\Nodist\bin\node_modules\react-vr-cli\index.js
C:\Program Files (x86)\Nodist\bin
`-- react-vr-cli@0.3.2</pre><p></p>

<p>最後のメッセージから、<code>react-vr-cli</code>のバージョン0.3.2がインストールされたことが確認できます。</p>

<p>まず試しに<code>react-vr</code>コマンドを実行してみましょう。</p>

<p></p><pre class="crayon-plain-tag">$ react-vr

React VR Command Line Interface
Version 0.3.2

Usage:
  react-vr init [project name]  Create a new React VR application with the specified name</pre><p></p>

<p>コマンドの出力結果から、<code>react-vr</code> コマンドには <code>init</code> というサブコマンドが一つだけ用意されていることがわかります。コマンドにプロジェクト名を渡すと、新規React VRプロジェクトが作成されるようです。今回は「Hello World」を表示させるので、<code>HelloWorld</code>というプロジェクト名にします。</p>

<p></p><pre class="crayon-plain-tag">$ react-vr init HelloWorld</pre><p></p>

<p>Enterキーを押すとなにやらいろいろとプログラムが走り出して、ごにょごにょと長いメッセージが表示されたあと、プロンプトへ戻ります。これで、<code>HelloWorld</code>プロジェクトが作成されました。</p>

<p>続いて、「HelloWorld」ディレクトリに入り、早速何も変更しないまま実行してみましょう。<code>npm start</code>というコマンドを使います。</p>

<p></p><pre class="crayon-plain-tag">$ cd HelloWorld
$ npm start</pre><p></p>

<p>すると、またごちゃっとメッセージがコマンドラインに表示されて、<code>Loading dependency graph, done.</code>というメッセージが最後に表示されます。</p>

<p></p><pre class="crayon-plain-tag">$ npm start

&gt; HelloWorld@0.0.1 start C:\****\HelloWorld
&gt; node -e "console.log('open browser at http://localhost:8081/vr/\n\n');" &amp;&amp; node node_modules/react-native/local-cli/cli.js start

open browser at http://localhost:8081/vr/

... 略 ...

Loading dependency graph, done.</pre><p></p>

<p>この表示が出たら、ブラウザで<code>http://localhost:8081/vr/</code>を開いてみましょう。</p>

<div id="attachment_23853" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/HelloWorld-640x406.png" alt="" width="640" height="406" class="size-large wp-image-23853" srcset="/wp-content/uploads/2017/06/HelloWorld.png 640w, /wp-content/uploads/2017/06/HelloWorld-300x190.png 300w, /wp-content/uploads/2017/06/HelloWorld-207x131.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">helloと表示された。一安心。</p></div>

<p>「hello」と表示されているのがわかると思います。マウスで画面をドラッグしてみましょう。</p>

<h2>ちゃんとHello World!にする</h2>

<p>さて、「hello」と表示されているのは確認できましたので、今度はプログラムを修正して、ちゃんと「Hello World!」と出力されるようにしてみましょう。プロジェクトフォルダ内にある「index.vr.js」を開いてください。</p>

<p>エディタは各自使い慣れたもので構いません。ただしReact VRの新規プロジェクト作成で行った場合、<strong>ECMAScript 2015(ES6)形式でコードが生成されます</strong> 。また、JSX (React専用の特殊な記法) も使用するので、これらのスタイルに対応しているエディタを使用しましょう。<a href="https://code.visualstudio.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Visual Studio Code</a>であれば、標準でJSXに対応しているのでおすすめです。</p>

<p>エディタで「index.vr.js」を開くと、こんな箇所があるはずです。ここで、先ほど表示していた3D空間の全要素を定義しています。</p>

<p></p><pre class="crayon-plain-tag">export default class HelloWorld extends React.Component {
  render() {
    return (
      &lt;View&gt;
        &lt;Pano source={asset('chess-world.jpg')}/&gt;
        &lt;Text
          style={{
            backgroundColor: '#777879',
            fontSize: 0.8,
            fontWeight: '400',
            layoutOrigin: [0.5, 0.5],
            paddingLeft: 0.2,
            paddingRight: 0.2,
            textAlign: 'center',
            textAlignVertical: 'center',
            transform: [{translate: [0, 0, -3]}],
          }}&gt;
          hello
        &lt;/Text&gt;
      &lt;/View&gt;
    );
  }
};</pre><p></p>

<p>ここでは通常のReactコンポーネントと同様、<code>React.Component</code>を継承したクラスを定義し、<code>render</code>メソッドをオーバーライドしています。React VRは、通常のReactとほぼ同じスタイルでVRコンテンツを表示できるということです。</p>

<p>ポイントは、<code>render()</code>メソッド内で使用しているコンポーネントです。ここで使用されている<code>View</code>コンポーネントや<code>Pano</code>コンポーネント、<code>Text</code>コンポーネントなどは、React VRの独自コンポーネントなので、使い方を把握する必要があります。</p>

<p><code>View</code>コンポーネントというのは、HTMLでいうところの<code>div</code>だと思ってください。何かのまとまりとして、様々な3D要素を内包出来ますし、<code>View</code>コンポーネント自体にスタイルを適用することもできます。このスタイルは、Reactを使ったことがある方であれば馴染みのある定義方法だということがわかるでしょう。プロパティはCSSと違い、キャメルケースで記述していきます。<strong>ほとんどスタイルシートのような感覚で、3Dオブジェクトのスタイルを定義することができる</strong> のは感動ものです。</p>

<p><code>Pano</code>コンポーネントは、パノラマ写真を埋め込んだ空間を簡単に作成できるコンポーネントです。次回の記事では実際に<code>Pano</code>コンポーネントを使ってVRコンテンツを作ります。</p>

<p>「hello」という文字列が表示されるように定義してあるのは<code>Text</code>コンポーネントです。<code>Text</code>コンポーネントは、文字通りテキストを表示するためのコンポーネントで、スタイルの定義と内容が記述されています。スタイルは見たことがない<code>layoutOrigin</code>というプロパティなどはありますが、他はほぼCSSのままであることが確認できると思います。</p>

<p>では、「hello」を「Hello World!」へ書き換えていきましょう。書き換えた<code>Text</code>コンポーネント部分はこんな感じになります。</p>

<p></p><pre class="crayon-plain-tag">&lt;Text
  style={{
    backgroundColor: '#777879',
    fontSize: 0.8,
    fontWeight: '400',
    layoutOrigin: [0.5, 0.5],
    paddingLeft: 0.2,
    paddingRight: 0.2,
    textAlign: 'center',
    textAlignVertical: 'center',
    transform: [{translate: [0, 0, -3]}],
  }}&gt;
  Hello World!
&lt;/Text&gt;</pre><p></p>

<p>さて、ブラウザをリロードしてみましょう。無事「Hello World!」と表示されたことと思います。</p>

<div id="attachment_23855" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/HelloWorld-2-640x406.png" alt="" width="640" height="406" class="size-large wp-image-23855" srcset="/wp-content/uploads/2017/06/HelloWorld-2.png 640w, /wp-content/uploads/2017/06/HelloWorld-2-300x190.png 300w, /wp-content/uploads/2017/06/HelloWorld-2-207x131.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Hello World!と表示された</p></div>

<h2>日本語を表示させたら、***になった!</h2>

<p>ただ、実はReact VRは現在のバージョンでは、そのままでは日本語の表示ができません。試しに「Hello, World!」の代わりに日本語を入れて試してみると、以下のように文字列が「***」と表示されてしまいます。</p>

<div id="attachment_23856" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/HelloWorld-jp-640x406.png" alt="" width="640" height="406" class="size-large wp-image-23856" srcset="/wp-content/uploads/2017/06/HelloWorld-jp.png 640w, /wp-content/uploads/2017/06/HelloWorld-jp-300x190.png 300w, /wp-content/uploads/2017/06/HelloWorld-jp-207x131.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">日本語を表示しようとしたら***になるの巻</p></div>

<p>詳しくはReact VRのドキュメント「<a href="https://facebook.github.io/react-vr/docs/fonts.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fonts and Text</a>」に書かれていますが、大きく分けて2つのステップで日本語表示が実現できます。</p>

<h3>1. まずは日本語フォントをダウンロード</h3>

<p>React VRのGitHubへ行き、<code>OVRUI/fonts</code>以下にある「japanese.fnt」「japanese.png」をダウンロードします。</p>

<ul>
<li><a href="https://github.com/facebook/react-vr/tree/master/OVRUI/fonts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-vr/OVRUI/fonts at master · facebook/react-vr</a></li>
</ul>

<p>ダウンロードしたフォント定義ファイルおよびフォントセットテクスチャは、「static_assets/fonts」以下に配置します。「fonts」ディレクトリは自身で作成してください。
ちなみに、「japanese.fnt」「japanese.png」は、独自のものを作ることもできますし、React VRに用意されているこちらの「<a href="https://github.com/facebook/react-vr/tree/master/tools/fontue" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-vr/tools/fontue at master · facebook/react-vr</a>」ツールを使って作ることも出来ます。オリジナルのフォントセットテクスチャを作成する場合はフォントのライセンスをご確認の上利用しましょう。</p>

<h3>2. 日本語フォントを読み込むように「vr/client.js」を修正</h3>

<p>日本語フォントを使うようにするには、「vr/client.js」を修正します。8行目以下に下記のような行があることと思います。</p>

<p></p><pre class="crayon-plain-tag">function init(bundle, parent, options) {
  const vr = new VRInstance(bundle, 'HelloWorld', parent, {
    // Add custom options here
    ...options,
  });
  vr.render = function() {
    // Any custom behavior you want to perform on each frame goes here
  };
  // Begin the animation loop
  vr.start();
  return vr;
}</pre><p></p>

<p>ここを修正していきます。ポイントは下記3点です。</p>

<ol>
<li>OVRUIライブラリをインポートする</li>
<li><code>OVRUI.loadFont</code>メソッドで読み込むフォントセットと読み込み後の処理を記述する</li>
<li>React VR Webの新しいインスタンスを作成するときのオプションに読み込んだフォントを指定する</li>
</ol>

<p>OVRUIというのは、WebVRのためのフレームワークで、Three.jsのシーン(様々な3Dオブジェクトを置く場所)をラップしてVRヘッドマウントを含むデバイスからアクセスできるようにしたり、3Dのビューをテキストつきでレンダリングしたりといった機能を含んでいます。</p>

<p>このうち、テキストのレンダリングについては、Signed-Distance Functionという仕組みを使ってなめらかなフォントレンダリングを行う仕組みが用意されています。この仕組みのおかげで、フォントを導入するのが面倒な感じになっているのですが、フォントのレンダリング面では、3Dに表示するものとしてはゆがみが少なく、読みやすいものになっているのではと思います。</p>

<p>ということでやるべきこととしては、この仕組みに対応したフォント関係のファイルを用意し、VRコンテンツの開始前にフォント定義ファイルおよびフォントセットテクスチャを読み込み、その後コンテンツが始まるように書くことで、日本語に対応した表示を実現することができるのです。</p>

<p><code>OVRUI.loadFont</code>メソッドの返り値は、<code>Promise</code>です。なので、<code>then</code>メソッドを使うことで、読み込み後の処理の中で<code>vr</code>インスタンスを返す処理を書けばいいということになります。<code>Promise</code>については、過去の高津戸さんの記事「<a href="https://html5experts.jp/takazudo/17107/" data-wpel-link="internal">Promiseで簡単！JavaScript非同期処理入門【前編】</a>」が詳しいです。</p>

<p>また、<code>OVRUI.loadFont</code>メソッドの実行結果は、<code>font</code>という値で取得するように書いているので、これを初期化オプションに<code>font</code>というキーに含めて渡してあげます。</p>

<p>以上の処理を書き加えたものが以下となります。</p>

<p></p><pre class="crayon-plain-tag">import * as OVRUI from 'ovrui'; // ← 追加

function init(bundle, parent, options) {
  OVRUI.loadFont(
          '/static_assets/fonts/japanese.fnt',
          '/static_assets/fonts/japanese.png'
  ).then((font) =&gt; {
    const vr = new VRInstance(bundle, 'HelloWorld', parent, {
      // Pass in the custom font as an initialization property
      font: font, // ← 追加
      ...options,
    });
    vr.render = function() {
      // Any custom behavior you want to perform on each frame goes here
    };
    // Begin the animation loop
    vr.start();
    return vr;
  });
}</pre><p></p>

<p>意外に大変でしたが、これで日本語の表示ができるようになったはずです。「Hello World!」のところを日本語にし、コンソールで一旦コンソールを再起動したあと、ブラウザをリロードしてみてください。</p>

<div id="attachment_23858" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/06/HelloWorld-jp-2-640x406.png" alt="" width="640" height="406" class="size-large wp-image-23858" srcset="/wp-content/uploads/2017/06/HelloWorld-jp-2.png 640w, /wp-content/uploads/2017/06/HelloWorld-jp-2-300x190.png 300w, /wp-content/uploads/2017/06/HelloWorld-jp-2-207x131.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">無事日本語を表示できるようになった</p></div>

<p>今回は「Hello, World」と日本語コンテンツの表示を行いました。次回はいよいよ、360度画像を用いたパノラマ表示にチャレンジしていきます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[React VR]]></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>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>
	</channel>
</rss>
