<?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>VR &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/vr/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>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 VRでここまでできる！VRでジオラマを作ろう</title>
		<link>/karad5/23960/</link>
		<pubDate>Mon, 31 Jul 2017 01:30:45 +0000</pubDate>
		<dc:creator><![CDATA[原一浩]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[React VR]]></category>
		<category><![CDATA[VR]]></category>

		<guid isPermaLink="false">/?p=23960</guid>
		<description><![CDATA[連載： React VR (4)前回、3Dプリミティブオブジェクトを使って、レイアウトやライティングの仕方について一通り試しました。前回扱わなかったコンポーネントに、3DモデルのためのコンポーネントModelがあります。...]]></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> (4)</div><div id="attachment_23961" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/HelloDiorama-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23961" srcset="/wp-content/uploads/2017/07/HelloDiorama.png 640w, /wp-content/uploads/2017/07/HelloDiorama-300x162.png 300w, /wp-content/uploads/2017/07/HelloDiorama-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">今回は、こんなVRジオラマをつくるぞ！</p></div>

<p>前回、3Dプリミティブオブジェクトを使って、レイアウトやライティングの仕方について一通り試しました。前回扱わなかったコンポーネントに、3Dモデルのためのコンポーネント<code>Model</code>があります。<code>Model</code>コンポーネントを使うと「obj」形式の3Dモデリングデータを読み込み、VR空間に配置することができます。</p>

<p>3Dのモデリングデータを使うと、リアルな物体だったり、複雑な形状を持ったオブジェクトを自由にVR上で扱えるため、VR空間における表現力が飛躍的に高まります。実際VRコンテンツを作る際に使うのは<code>Box</code>や<code>Cylinder</code>ではなく、<code>Model</code>コンポーネントになるでしょう。</p>

<p>今回は、3Dのモデリングデータを読み込み、ジオラマを作ってみましょう。子どもの頃、作ったプラモデルに顔を近づけて遊んだ経験はないでしょうか。VRでは、巨大な物体を目の前に表示させるのもお手のものです。</p>

<h2>新規プロジェクトの作成</h2>

<p>既に本連載の読者であれば何度か行ってきていることですが、今回もサンプルを作るにあたって新規プロジェクトを作成し、プロジェクトディレクトリへ移動します。<code>HelloDiorama</code>というプロジェクト名で進めることにします。</p>

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

<p>ジオラマに必要なものは何でしょうか? 一つは飾る対象物です。これはロボットなのかもしれないし、戦車かもしれないし、船かもしれません。3Dモデリングデータさえあれば、そしてそれをReact VRで読み込めさえすれば、なんでもジオラマにすることができます。</p>

<p>ちなみに「React VRで読み込めさえすれば」と書いているのは、Webで公開されている3Dモデリングデータの中には何故か表示できないものがあります。表示はできるけど変な形状になったりするものもあります。これはきっと時間と共に解決されていくタイプのものでしょう。気になることがあればReact VRのGitHubリポジトリでIssueを立てるとよいです。</p>

<p>続いてジオラマに必要なもう一つのものは何でしょう? それは雰囲気を与えてくれる背景です。緻密なモデルをさらに引き立ててくれる背景は、ロボットなら宇宙船の内部かもしれないし、船なら海上かもしれません。こちら背景は、今回は3Dプリミティブオブジェクトを利用してそれっぽいものを作ってみます。</p>

<h2>用意するもの</h2>

<p>ジオラマコンテンツを作るにあたって、用意するものは以下となりました。</p>

<ul>
<li>配置する対象物としての3Dモデリングデータ</li>
<li>背景の壁と床のテクスチャ</li>
</ul>

<p>まずは、配置する対象物としての3Dモデリングデータから用意しましょう。</p>

<div id="attachment_23962" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/GAZ-AA-640x350.png" alt="" width="640" height="350" class="size-large wp-image-23962" srcset="/wp-content/uploads/2017/07/GAZ-AA.png 640w, /wp-content/uploads/2017/07/GAZ-AA-300x164.png 300w, /wp-content/uploads/2017/07/GAZ-AA-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">1930年代に使われたソ連製のトラックのモデルデータ</p></div>

<p>今回ジオラマとして、シーンに配置するのは、<a href="https://ja.wikipedia.org/wiki/GAZ-AA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GAZ-AA</a>という1930年代に使われたソ連製のトラックにしてみました。筆者は、このトラックを好きだったわけではないですが、様々な3Dモデルを探す中でふとこのトラックを見かけ、素朴な中にも車両全面に漂う気品を魅力に感じ、採用した次第です。</p>

<p>このトラックは、ポリゴン数が4,380と、そこそこ複雑な形状をしており、テクスチャなどを含んでいてなかなかにリアリティがあります。</p>

<p>下記より、objフォーマット形式のものをダウンロードしましょう。もし他の3Dデータで試す場合、ライセンスについてチェックしておきましょう。</p>

<ul>
<li><a href="https://www.cgtrader.com/free-3d-models/vehicle/truck/gaz-aa-furgon-bread" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GAZ- AA furgon-Bread free VR / AR / low-poly 3D Model MAX OBJ 3DS FBX MTL</a></li>
</ul>

<p>ちなみに、上記ダウンロードサイトでは、ユーザー登録が必要です。なので、ほかのものを用意できる人は好きな3Dデータを利用してOKです。「gaz-aa_bread OBJ.zip」をダウンロード、解凍したら、下記のディレクトリにそれぞれ配置します。</p>

<ul>
<li>static_assets/gaz_aa/gaz-aa_bread.mtl</li>
<li>static_assets/gaz_aa/gaz-aa_bread.obj</li>
<li>static_assets/gaz_aa/gaz-aa_bread_cabin.jpg</li>
<li>static_assets/gaz_aa/gaz-aa_bread_detail.jpg</li>
<li>static_assets/gaz_aa/gaz-aa_bread_frame.jpg</li>
<li>static_assets/gaz_aa/gaz-aa_bread_furgon.jpg</li>
<li>static_assets/gaz_aa/gaz-aa_bread_wheel.jpg</li>
<li>static_assets/gaz_aa/gaz-aa_bread_wing.jpg</li>
</ul>

<p>上記ファイルのうち、実は「gaz-aa_bread.mtl」については変更する必要があります。</p>

<p>テキストエディタなどでファイルを開き、「D:\Program Files\Autodesk\3ds Max 2009\scenes\GAZ-AA free models\gaz-aa_bread_3ds_max&#42;<strong>.jpg」となっているところを「</strong>*.jpg」に書き換えましょう。これはきっと作ったときそのままのローカルのパスが入ってしまったのですね。公開する際の要注意ポイントと言えそうです。</p>

<p>ジオラマの背景に必要な素材は、角となる2面分の壁用のテクスチャと、床に使うテクスチャです。前回使った<code>Pano</code>コンポーネントで、6面にテクスチャを貼り、部屋状にしてしまうこともできますが、それだとリアルな空間になりすぎ、ジオラマっぽくなくなるからです。3面しか壁を用意しないことで、後ろには漆黒の空間が広がる感じになり、なんだか超現実的な世界になります。</p>

<div id="attachment_23963" style="width: 310px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/wall-300x169.jpg" alt="" width="300" height="169" class="size-medium wp-image-23963" srcset="/wp-content/uploads/2017/07/wall-300x169.jpg 300w, /wp-content/uploads/2017/07/wall.jpg 640w, /wp-content/uploads/2017/07/wall-207x116.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /><p class="wp-caption-text">背景の壁のテクスチャ</p></div>

<div id="attachment_23964" style="width: 310px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/floor-300x169.jpg" alt="" width="300" height="169" class="size-medium wp-image-23964" srcset="/wp-content/uploads/2017/07/floor-300x169.jpg 300w, /wp-content/uploads/2017/07/floor.jpg 640w, /wp-content/uploads/2017/07/floor-207x116.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /><p class="wp-caption-text">床のテクスチャ</p></div>

<p>壁と床のテクスチャは以下からダウンロードしてください。</p>

<ul>
<li><a href="https://html5experts.jp/wp-content/uploads/2017/07/diorama.zip" data-wpel-link="internal">diorama</a></li>
</ul>

<p>ちなみに、壁と床のテクスチャは、僕がそのへんで適当に撮ってきたものなので、フリーでお使いいただいて構いません。</p>

<p>ダウンロードしたら、「プロジェクトディレクトリ/static_assets/diorama」以下に「floor.jpg」と「wall.jpg」を配置しましょう。</p>

<h2>STEP 1. まずは、ジオラマのベースづくりから</h2>

<p>早速トラックを配置したいと、はやる気持ちを抑えてまずはジオラマのベースとなる背景の壁と床を作るところから始めましょう。床は、1000 x 1000の大きさを持った板を想定しました。これは、<code>Pano</code>コンポーネントで作った空間と同じ大きさとなります。そして、奥の壁は床から500の高さを持つ平面です。これにテクスチャをつけることで、リアリティを持たせます。では、具体的な作業をしましょう。</p>

<p>「index.vr.js」の<code>View</code>の中を一旦空にし、下記のように修正します。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
              &lt;View
                      style={{
                        transform: [
                          {rotateY: -20},
                        ]
                      }}&gt;
                &lt;Plane
                        dimWidth={1000}
                        dimHeight={500}
                        style={{
                          transform: [
                            {translate: [-500, 220, 0]},
                            {rotateY: 90},
                          ],
                        }}
                        texture={asset('diorama/wall.jpg')}
                /&gt;
                &lt;Plane
                        dimWidth={1000}
                        dimHeight={500}
                        style={{
                          transform: [
                            {translate: [0, 220, -500]},
                          ],
                        }}
                        texture={asset('diorama/wall.jpg')}
                /&gt;
                &lt;Plane
                        dimWidth={1000}
                        dimHeight={1000}
                        style={{
                          transform: [
                            {translate: [0, -22, 0]},
                            {rotateX: -90},
                          ],
                        }}
                        texture={asset('diorama/floor.jpg')}
                /&gt;
              &lt;/View&gt;
            &lt;/View&gt;</pre><p></p>

<p>それと、importも変更しておきましょう。この先に使う<code>Model</code>コンポーネントやライティング関係のコンポーネントも加えておきます。</p>

<p></p><pre class="crayon-plain-tag">import {
  AppRegistry,
  asset,
  View,
  Plane,
  Model,
  DirectionalLight,
  PointLight,
  AmbientLight,
} from 'react-vr';</pre><p></p>

<p><code>View</code>コンポーネントが入れ子になっているのは、内側の<code>View</code>は、ジオラマの背景セットで、セット全体を変形させたい場合はこのように入れ子にしておくと、壁や床を一つの塊として扱えます。ここではジオラマのセット全体をちょっと回転させています。というのも、最初に表示したときに部屋の中央ではなく、部屋の角を見せたいためです。</p>

<p>ジオラマのセット自体を回転させずに、カメラを回転させるという表現方法もありますが、普通ジオラマというのは、インテリアの側面もあり、一番かっこいいポジションで飾るものだと思います。そこで、<code>View</code>自体をY軸に対して-20度回転させました。</p>

<p>さらに細部を見ていきましょう。3つの<code>Plane</code>が、内側の<code>View</code>コンポーネント内に配置されていますが、先頭2つの<code>Plane</code>コンポーネントは壁として配置してあります。位置を遠くに置いたのと、Y軸方向に90度回転させて垂直にそれぞれのコンポーネントが交わるようにしています。</p>

<p><code>Plane</code>コンポーネントに関わらず、3Dプリミティブコンポーネントは、テクスチャを設定することができます。テクスチャは<code>texture</code>属性で設定します。</p>

<p>ここでは<code>texture</code>属性に、「diorama/wall.jpg」を指定しました。これによりのっぺりとした壁が質感のある壁となりました。ちなみに、この壁は近くの公園の壁を撮影したものです。</p>

<p>一番最後の<code>Plane</code>は、床として配置しています。X軸方向に-90度回転させ、テクスチャを貼りました。これは海に行った時の砂岩の岩肌です。深い意味があるわけではないですが、オフロードっぽい印象になる写真が見つからなかったので、こちらを採用しました。</p>

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

<p>を実行し、ブラウザでURLを開いてみましょう。ただし、こんどは「http://localhost:8081/vr/?hotreload」で開いてみてください。「?hotreload」を付けてブラウザから開くと、ホットリロードが可能になります。これで、エディタで編集したコンテンツが自動でブラウザ側に反映されるようになります。</p>

<div id="attachment_23966" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/HelloDiorama_base-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23966" srcset="/wp-content/uploads/2017/07/HelloDiorama_base.png 640w, /wp-content/uploads/2017/07/HelloDiorama_base-300x162.png 300w, /wp-content/uploads/2017/07/HelloDiorama_base-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">配置した背景</p></div>

<p>3方向のみ<code>Plane</code>を配置しただけの簡素なジオラマセットですが、VRで角のほうを見るとなかなかどうして迫力がありますね。</p>

<h2>STEP 2. 3Dモデリングデータを配置しよう!</h2>

<p>続いて、お待ちかねの3Dモデルの読み込みです。3Dモデリングデータの読み込みには、<code>Model</code>コンポーネントを使います。<code>Model</code>コンポーネントには、<code>source</code>属性を記述することができます。渡す内容は、<code>obj</code>と<code>mtl</code>というキーを持ったオブジェクトで、それぞれobj形式のファイルとmtl形式のファイルへのパスを渡します。</p>

<p>今回であれば、「配置するモデリングデータ」で保存しておいた「static_assets/gaz_aa」以下にあるobjファイルとmtlファイルが対象になります。</p>

<p><code>Model</code>コンポーネントは、「index.vr.js」の入れ子の内側の<code>View</code>以下に配置します。サイズは小さめにし、位置調整と<code>rotateY</code>プロパティを修正して、若干の回転を加えます。これは、ちょうど左前に向いた形がきれいだからです。コードは下記のようになります。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
              &lt;View
                      style={{
                        transform: [
                          {rotateY: -20},
                        ]
                      }}&gt;
                &lt;Model
                        style={{
                          transform: [
                            {translate: [-30, -20, -110]},
                            {scale: 0.03},
                            {rotateY: 70},
                          ],
                        }}
                        source={{
                          obj: asset('gaz_aa/gaz-aa_bread.obj'),
                          mtl: asset('gaz_aa/gaz-aa_bread.mtl')
                        }}
                        lit={true}
                /&gt;
                &lt;Plane ... /&gt;
                &lt;Plane ... /&gt;
                &lt;Plane ... /&gt;
              &lt;/View&gt;
            &lt;/View&gt;</pre><p></p>

<p>これで、ブラウザをリロードしてみてください。3Dモデルが表示されるはずです。</p>

<div id="attachment_23967" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/HelloDiorama_black-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23967" srcset="/wp-content/uploads/2017/07/HelloDiorama_black.png 640w, /wp-content/uploads/2017/07/HelloDiorama_black-300x162.png 300w, /wp-content/uploads/2017/07/HelloDiorama_black-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">まだ光が当たっていないので真っ黒</p></div>

<p>ただし、真っ黒なシルエットになってしまっていますが。ということで、続いて光源を用意して、明るくしていきましょう。</p>

<h2>STEP 3. ライティングしてトラックを美しく!</h2>

<p>ライティングは、前回3Dプリミティブオブジェクトで遊んだ際に試したのを思い出してください。メインの明かり、部分的な明かり、ちょっとした調整です。今回も同じような感じで進めます。</p>

<p>実は、React VRで使われている3DライブラリのThree.js本体には、ライティングに関する様々なヘルパー機能が用意されています。例えば、照明の向き、範囲などを視覚的に表示して微調整をする機能などです。ただ、現時点のReact VRではもっと限定的なサポートとなっているのでそこまで細かくは扱いません。</p>

<p>「index.vr.js」に<code>DirectionalLight</code>と<code>PointLight</code>、<code>AmbientLight</code>コンポーネントを配置しました。これで、トラックが綺麗に表示されるでしょうか。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
              &lt;DirectionalLight
                      intensity={0.3}
                      style={{
                        color: 'white',
                        transform: [
                          {translate: [0, 0, 0]},
                          {rotateX: 45}]
                      }}/&gt;
              &lt;PointLight
                      intensity={0.5}
                      style={{
                        color: 'white',
                        transform: [{translate: [50, 20, -80]}]
                      }}/&gt;
              &lt;AmbientLight
                      intensity={0.8}/&gt;
              &lt;View ... /&gt;
            &lt;/View&gt;</pre><p></p>

<div id="attachment_23968" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/HelloDiorama_3d_model-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23968" srcset="/wp-content/uploads/2017/07/HelloDiorama_3d_model.png 640w, /wp-content/uploads/2017/07/HelloDiorama_3d_model-300x162.png 300w, /wp-content/uploads/2017/07/HelloDiorama_3d_model-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">トラックがちゃんと表示された！</p></div>

<p>ブラウザをリロードしてトラックを再表示してみましょう。明るくなったでしょうか。</p>

<h2>STEP 4. トラックをゆっくりと回転させてみる</h2>

<p>以上で一旦はジオラマは完成しましたと言ってもいいかもしれません。ただ、今まで物体を空間に置いてみて歯がゆかったのは、その物体の裏側がどうなっているのか、それが見えないということでした。ということで、アニメーションの練習がてらトラックを回転させてみましょう。</p>

<p>回転に関しては、ピッタリのサンプルが公式のリポジトリに用意されています。</p>

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

<p>このサンプルを参考にトラックのアニメーションを作ってみます。ちょっとサンプルと異なるのは、Reactのコンポーネントとして作るというのと、細かなロジックを修正した点です。Reactコンポーネントとして、回転速度を定義する<code>speed</code>属性と、表示位置や大きさを定義する<code>style</code>属性を渡せるように作っておきましょう。「src/component/GazAa.js」として下記のように作成します。ちょっと長くなるので、細部の話は置いておいて、まずは一気に掲載してしまいます。</p>

<p></p><pre class="crayon-plain-tag">import React from 'react';
import {
  asset,
  View,
  Model,
} from 'react-vr';

export default class GazAa extends React.Component {

  constructor() {
    super();
    this.state = {
      rotation: 0
    };
  }

  componentDidMount() {
    this.rotate();
  }

  componentWillUnmount() {
    if (this.frameHandle) {
      cancelAnimationFrame(this.frameHandle);
      this.frameHandle = null;
    }
  }

  rotate(timestamp) {
    const delta = timestamp - this.lastUpdate || 0;
    this.setState({rotation: this.state.rotation + delta / this.props.speed});
    this.lastUpdate  = timestamp;
    this.frameHandle = requestAnimationFrame(this.rotate.bind(this));
  }

  render() {
    return (&lt;View style={this.props.style}&gt;
              &lt;Model
                      style={{
                        transform: [
                          {rotateY: this.state.rotation},
                        ]
                      }}
                      source={{
                        obj: asset('gaz_aa/gaz-aa_bread.obj'),
                        mtl: asset('gaz_aa/gaz-aa_bread.mtl')
                      }}
                      lit={true}
              /&gt;
            &lt;/View&gt;
    )
  }
}</pre><p></p>

<p>ポイントは、<code>GazAa</code>コンポーネントのローカルステートとそれを変更するためのrotate関数、そしてそこで使われている<code>requestAnimationFrame</code>関数と<code>cancelAnimationFrame</code>関数です。</p>

<p><code>GazAa</code>コンポーネントは、シーンに配置した瞬間、つまりコンポーネントがマウントされた時から回転を始めます。逆にコンポーネントをアンマウントすると回転をやめる処理をします。回転の状態はコンポーネントのローカルステートとして定義されている<code>rotation</code>です。</p>

<p><code>rotation</code>は、3Dモデルの<code>rotateY</code>としてY軸方向にどれだけ回転するかという値として使われることになります。その値をコントロールしているのが<code>rotate</code>関数です。<code>requestAnimationFrame</code>関数は、ブラウザの再描画のタイミングで<code>rotate</code>関数を呼び出すことになるので、呼び出すたびに前に呼び出された時間からの回転を<code>rotation</code>に反映していきます。<code>requestAnimationFrame</code>関数から返った値は、アニメーションをキャンセルするときに<code>cancelAnimationFrame</code>関数にて使われます。</p>

<p><code>requestAnimationFrame</code>関数について一つ知っておきたいことは、この関数はもともとブラウザに実装されていますが、ブラウザによってはサポートされていないことがあります。そこで、React VRでは、<code>requestAnimationFrame</code>関数のpolyfillとして用意されています。</p>

<p>これで大体の<code>GazAa</code>コンポーネントの仕組みが理解できたでしょうか。今はこういうスタイルでアニメーションを実現したりしますが、将来的にはもっと洗練されたアニメーション機構が用意されていくのだろうと推測します。</p>

<p>では、先ほど作った<code>GazAa</code>コンポーネントを使っていきましょう。「index.vr.js」で使うので、まずはインポートします。ファイルの先頭あたりにimport文を書きます。</p>

<p></p><pre class="crayon-plain-tag">import GazAa from './src/component/GazAa'</pre><p></p>

<p>続いて、入れ子になった<code>View</code>コンポーネントの内側に、<code>GazAa</code>コンポーネントを配置します。プロパティとしては、回転速度を定義する<code>speed</code>属性と、表示位置や大きさを定義する<code>style</code>属性を渡しています。これら属性は、<code>GazAa</code>コンポーネント内の<code>this.props.XXX</code>にて受け取ることが可能です。これらを記載したコードが以下になります。</p>

<p></p><pre class="crayon-plain-tag">&lt;View&gt;
              &lt;DirectionalLight ... /&gt;
              &lt;PointLight ... /&gt;
              &lt;AmbientLight ... /&gt;
              &lt;View
                      style={{
                        transform: [
                          {rotateY: -20},
                        ]
                      }}&gt;
                {/* &lt;Model ... /&gt; */}
                &lt;GazAa speed={360}
                       style={{
                         transform: [
                           {translate: [-42, -20, -110]},
                           {scale: 0.03},
                         ],
                       }}/&gt;
                &lt;Plane ... /&gt;
                &lt;Plane ... /&gt;
                &lt;Plane ... /&gt;
              &lt;/View&gt;
            &lt;/View&gt;</pre><p></p>

<p>以上で、トラックが回転するジオラマの完成です。ブラウザをリロードして、じっくり見てみましょう！</p>

<div id="attachment_23961" style="width: 650px" class="wp-caption alignnone"><img src="/wp-content/uploads/2017/07/HelloDiorama-640x346.png" alt="" width="640" height="346" class="size-large wp-image-23961" srcset="/wp-content/uploads/2017/07/HelloDiorama.png 640w, /wp-content/uploads/2017/07/HelloDiorama-300x162.png 300w, /wp-content/uploads/2017/07/HelloDiorama-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">完成したVRジオラマ</p></div>

<p>もし興味があれば、<a href="https://html5experts.jp/karad5/23885/" data-wpel-link="internal">React VR×360度画像！Web上でパノラマVR表示を試す</a>を参考に、GearVRで眺めてみましょう。子供の頃叶わなかった、巨大サイズのジオラマを見ることができますよ。</p>
]]></content:encoded>
		
		<series:name><![CDATA[React VR]]></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>
