WebVRだのWebXRだの状況をまとめてみた

# ようするに、なんなんだ。

WebVRが登場し、ついにWebでもVRできるようになるぞ！　と喜んでいたのもつかの間、WebXRってなんですか。
おそらく、そういう思いでいる方が大半でしょう。状況をまとめてみました。

# Three.jsとかでVRプログラミングしたい人

　何も心配いりません。WebVRだろうとWebXRだろうとThree.jsなどのライブラリが内部でこれらをうまく使って抽象化してくれるため、そういう方はこれらのAPIを触る機会がそもそもないでしょう。本記事を軽く流しで読むか、「へー、いずれはWebXRに世の中移っていくんだね〜」ということだけ知っていただければ十分です。

# まず、WebVRとは

　[WebVR](https://webvr.info/)はWebブラウザで動作するVRのためのJavaScript APIです。このAPIは2014年にMozillaから提案され、その後GoogleのChromeチームも参画して2016年にリリースされました。[^1]

[^1]: 出典：https://en.wikipedia.org/wiki/WebVR#History

　現在、API規格としては、その後発足したW3Cのバーチャルリアリティ関連のワーキンググループである　[Immersive Web Working Group](https://www.w3.org/immersive-web/) の管轄で公開されています。

WebVR 1.1 Specification
https://immersive-web.github.io/webvr/spec/1.1/


# WebXRとは

　このWebVRが想定しているのはVRのみであり、いわゆるARやMRなどは想定していませんでした。ARやMRの隆盛した状況に対応すべく、MozillaやChromeチームなどが中心となり、新たにImmersive Web Working Groupで策定中の規格がWebXRです。こちらはVRだけでなくARやMRにも対応する規格となっています。

WebXR Device API Editor’s Draft
https://immersive-web.github.io/webxr/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12753/0c5e9f38-70a0-eb62-f17d-0e7e4b3cc712.png)
(https://immersive-web.github.io/webxr/ より。まだUnstable APIだって書いてありますね。)

　赤枠の注意書き通り、現在はコンセプトやチュートリアルの意味合いのある、若干ラフなドキュメントですが以下を参考にすると良いでしょう。
https://github.com/immersive-web/webxr/blob/master/explainer.md

　本格的に手を出すには、来年かなー。

# VRをやりたいんだけど、WebVRとWebXRどちらを使えばいいの？

　WebVRはもはや非推奨であり、ゆくゆくは新たな規格であるWebXRに移行すべきとアナウンスされています。しかし、２０１８年１２月現在では、まだWebVRを使う方が良さそうです。理由は、WebXRがまだ規格の策定中であり安定しておらず、同規格をサポートするブラウザもWebVRサポート済みブラウザに比べてまだまだ少ないからです。
　Oculus Goも、未だにWebVRのみのサポートです(開発者サイトによれば、WebXR対応を予定しているとは記載されています)

 WebVRであれば、HTC Vive/ Vive ProやOcculus Go/Rift、Windows MR Headsets、Google Cardboard/DayDream、PlayStation VRなど、ほぼすべてのメジャーなVR機器に対応しています。

　WebXRとはAPI体系として互換性があるわけではありませんが、VR機能については、大体の概念的な部分は共通しているはずですので、まずはWebVRに触れてみて感覚を掴むのはアリだと思います。

　とはいえ、多くの方の場合、利用するにしてもThree.jsやReact VR、A-Frameといった高度な抽象化ライブラリを通して使うことになるでしょう。その場合は、これらのライブラリが内部でWebVRを使うのか、WebXRを使うのか、良きに計らってくれるはずなので、どちらなのかと気にする必要もないはずです。

　独自にライブラリを作っていて、WebVRやWebXRに直接JavaScriptでアクセスする必要がある人は、気になるかもしれませんね。

# KhronosのOpenXRとの関係は？

　KhronosというCGやメディア技術における業界標準化団体があります。この団体がWebGLやOpenGL、Vulkanといった各種規格を策定・普及活動を行っています。（一方、WebVR/WebXRとは直接の関係はありません）

　OpenXRはこのKhronosが新たに策定したAPIで、これはWebというよりネイティブ技術（ブラウザなどのサンドボックス環境ではなく、ハードウェアに直接アクセスできる）分野でのVR/AR/MRの規格を抽象化するための標準化規格となります。

　Oculus RiftやHTC Vive、Windows MRなどのXR機器は、ネイティブ（非Web）向けの開発でそれぞれのメーカーが独自にSDKをリリースしている状況であり、それぞれAPIや作法が異なります。OpenXRはその差異を吸収する役割を担うものです。「どれもこれも一つ一つ対応していたら大変ですよね。それらを抽象化APIであるOpenXRを通して開発すれば楽ですよ」というわけです。

　誤解を恐れず言えば、Webブラウザ環境でのVR/MR/ARの標準化APIがImmersive Web Working Groupが提案する「WebXR」、ネイティブ環境でのVR/MR/ARの標準化APIがKhronosが提案する「OpenXR」ということです。

　さて、Webブラウザ技術はネイティブ技術によって実装されています。ということは、今後WebXRというブラウザ機能を実装する手段として、OpenXRが使われる可能性も……ありえるかもしれません。実装にそうするかどうかは、各ブラウザ開発チームが決めることですが。

　Khronosの思惑通り業界が動けば、以下のような図式になるんですかねー？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12753/14e02d51-87cf-aa4a-cf8a-d3d2e81deb01.png) 
([Khronos OpenXRワーキンググループページ](https://www.khronos.org/openxr)より引用)

　少なくとも、Webだけ見ている人たちは、WebVRとWebXRだけ気にしていれば問題ありません。（Three.jsなどを通して使う人なら、この２つすら意識せずにプログラムできてしまうでしょう）

# まとめ

 WebVR、WebXR、OpenXRと、なんだかキーワードばかりあふれかえっているじゃないかよくわからん。という人の声にお応えすべく本記事を書きました。皆様の脳内のイメージが少しでも整理されたなら幸いです。