WebVRがHTMLだけで簡単に作れるフレームワークを触ってみよう！

#前置き
esa.ioで社内向けに書いたものをこちらに移転。
社内LT用に面白いネタを探していたら、、、、2016年はVR元年だ（と言われているけど、どうなのよ笑）
htmlのタグベースでWebVRができるフレームワークを見つけたのでごにょごにょしてみた。

##WebVR
元来Web上でVRを実現するためには以下のようなものが使われてきた。

```
■WebGL（ウェブジーエル）
ウェブブラウザで3次元コンピュータグラフィックスを表示させるための標準仕様
```
```
■three.js、Away3D.js、Babylon.js
WebGLをサポートしたライブラリ
```
こいつら、勉強コストが高いっす、、、、、、、

そこでWebVRフレームワークこと<strong>[A-Frame](https://aframe.io/)</strong>を使いましょう！

#A-Frameって？
MozillaがリリースしたWebVR用のフレームワーク。
こいつがあれば、<strong>HTMLのタグベースで記述できる。</strong>
流行りのスマホをセットしてVRメガネで見るのにも対応してます、すごいっす

##導入
ざっくり以下の３ステップ。
①[A-Frame](https://github.com/aframevr/aframe)から必要なものをダウンロード
②ダウンロードしたものを任意のディレクトリに配置し、読み込ませる。
③htmlタグを配置するだけ


##触ってみた
初心者から入れるように、順を追って機能を少しずつ説明していきます。

##ステップ１
- 立方体、円、円柱を生成
<img width="805" alt="スクリーンショット 2017-04-13 0.42.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/64aa47be-fd4b-271f-ce81-12f95c672709.png">

###ソースコード [Github](https://github.com/crane-hiromu/WebVR-A-Frame-demo)
```demo1.html
<!DOCTYPE html>
<head>
    //ライブラリ読み込み
    <script src="https://aframe.io/releases/latest/aframe.min.js"></script>
</head>
<body>

//このタグ内に生成するものを記述する
<a-scene>
 
  <a-cube position="-2 1 -2" rotation="0 45 0" color="#C00"></a-cube>//立方体の生成

  <a-sphere position="0 -0.5 -3" color="#0C0"></a-sphere>//球の生成

  <a-cylinder position="2 0 0" color="#00C"></a-cylinder>//円柱の生成

</a-scene>

　//positionはx,y,z軸の座標を指定できる
  //rotationはx,y,z軸の回転する角度を指定できる
  //colorは図形の色を指定できる

</body>
</html>
```
ダウンロードしたものから``aframe.min.js``を読み込み、``<a-scene>``内にそれぞれ必要なタグを記述していくだけ！お手軽！

実際にブラウザ上で見てみたい方は <strong>[demo1.html](https://esa-storage-tokyo.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/461/2016/08/22/10749/400d564f-061d-46c6-8922-70e69be8f6d5.html)</strong> をクリック！

##ステップ２
- カメラのカーソル生成
- 円柱にカーソルアニメーションの追加
<img width="629" alt="スクリーンショット 2017-04-13 1.30.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/4bb83717-8204-b3ce-19c2-5e52d647241c.png">

ステップ１の画像にはなかった、円が中心に増えているのがお分かりだろうか？
これはユーザーの目線の位置です。FPSゲームとかにある銃の視点とかって認識でおっけいですw

<strong>クリックしながら画面を動かすと視点が動かせる</strong>ので、この視点が図形に重なった時にアニメーションがつくようにしました。今回は以下のように右側の円柱に視点が重なると色が変わるようにしました。
<img width="613" alt="スクリーンショット 2017-04-13 1.40.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/961a62a1-7f91-8e3d-f509-35e1fd9a89c0.png">

###ソースコード [Github](https://github.com/crane-hiromu/WebVR-A-Frame-demo)
ステップ１のコードに、必要な機能を追加したものです。

```demo2.html
<!DOCTYPE html>
<head>
 <script src="https://aframe.io/releases/latest/aframe.min.js"></script>
</head>
<body>

<a-scene>

  <a-cube position="-2 1 -2" rotation="0 45 0" color="#C00"></a-cube> //立方体
  <a-sphere position="0 -0.5 -3" color="#0C0"></a-sphere> //円

  <!-- アニメーション設定 -->
  <a-cylinder position="2 0 0" color="#00C"> //円柱
   <a-mouseenter color="#C00"></a-mouseenter><!--カーソル on-->
   <a-mouseleave color="#00C"></a-mouseleave><!--カーソル off-->
  </a-cylinder>

  <!-- 視点設定 -->
  <a-camera position="0 1.8 4"
   cursor-visible="true"
   cursor-scale="5"
   cursor-color="#4CC3D9"
   cursor-offset="5"
   cursor-maxdistance="100"
   cursor-opacity="0.5">
  </a-camera>

 <!-- 視点設定
   position:視点の座標
   visible:視点の表示・非表示
   scale：視点の大きさ
   color：視点の色
   maxdistance：視点の最大距離（アニメーションが反応する距離）
   opacity：視点の透度
 -->

 </a-scene>

</body>
</html>
```
ステップ１と比べて、円柱タグである``<a-cylinder>``内部に``mouseenter/mouseleave``が増えた。これはそれぞれカーソルが物体に重なった時のアニメーションを起こしている。
こうやってみるとなんかhtmlにjavascriptを書いてるみたいなんだよな〜。

アニメーションは <strong>[demo2.html](https://esa-storage-tokyo.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/461/2016/08/22/10749/dcb27829-cfbb-472d-9475-3f67b23f0b17.html)</strong> を実際に自分で動かしてみて体験してみてください！ 

##ステップ3
-  IDを付与して、特定の図形にアニメーションが付与できるようにする

htmlだけあって図形に``id``を指定することができます。先ほどのステップ２に追加で、真ん中の球の色が変わり移動するアニメーションを付与してみました。
<img width="556" alt="スクリーンショット 2017-04-13 2.06.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/4b9b904e-30e2-9232-1a78-cd3d2fb2c9e4.png">

###ソースコード [Github](https://github.com/crane-hiromu/WebVR-A-Frame-demo)
```demo3.html
<!DOCTYPE html>
 <head>
  <script src="https://aframe.io/releases/latest/aframe.min.js">
 </script>
 </head>
 <body>

  <a-scene>

   <a-cube position="-2 1 -2" rotation="0 45 0" color="#C00"></a-cube>

   <!-- idを追加 -->
   <a-sphere id="sp" position="0 -0.5 -3" color="#0C0"></a-sphere>

   <a-cylinder position="2 0 0" color="#00C">
     <a-mouseenter color="#C00"></a-mouseenter>
     <a-mouseleave color="#00C"></a-mouseleave>

     <!-- 特定のidに対してアニメーションを行うようにtargetで指定 -->
     <a-mouseenter target="#sp" color="#606" position="0 0.5 -3"></a-mouseenter>
     <a-mouseleave target="#sp" color="#0C0" position="0 -0.5 -3"></a-mouseleave>
	</a-cylinder>

  <!-- カメラ設定 -->
  <a-camera position="0 1.8 4"
    cursor-visible="true"
    cursor-scale="5"
    cursor-color="#4CC3D9"
    cursor-offset="5"
    cursor-maxdistance="100"
    cursor-opacity="0.5">
   </a-camera>

 </a-scene>

 </body>
</html>
```

こちらも <strong>[demo3.html](https://esa-storage-tokyo.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/461/2016/08/22/10749/dcb85310-b8e9-4d33-aaf7-1f28efabd3d0.html)</strong> を実際に自分で動かしてみて体験してみてください！ 


##ステップ集大成
コードは長いので載せませんが、こんなものをつくってみました！
<strong>[勤め先をVRで再現](https://esa-storage-tokyo.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/461/2016/08/22/10749/a394fc29-e05a-487e-9a1e-a1a170fbc468.html)</strong>

<img width="1053" alt="スクリーンショット 2017-04-13 2.14.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/246482ee-08d0-d254-d484-616a8154e3b2.png">

- キーボードの``W/A/S/D``で社内を移動できます！



上記では、今回は説明していないですが、A-Frameでは<strong>図形の組み合わせで複数の図形からなら１つのコンポーネント</strong>をつくることができ、それをうまく使っています。

##後書き
図形のタグ名とか、アニメーションのメソッド名が既存のhtml/javascriptから連想しやすいので、フロントエンドの方はすんなり入っていけんじゃないかと思います〜
この記事を社内に向けて書いたのが８ヶ月前だったのですが、この８ヶ月でA-Frameの開発がだいぶ進んだみたいなのでもっといろいろできるかと！日本語の解説サイトも８ヶ月の間で増えたので探してみるといいです！
（最近だとA-Frameにreactを使ってみましたとか、リアルタイムデータベースを使った複数人でのゲーム作ってみたとかを見かけました）

ちなみに[Mozilla公式](http://drawvr.com/welcome/)で公開しているWebVRサイトですが、A-Frameでここまで可能なのか！って感動します。


##参考
[HTML数行でVRできるA-Frame](https://framesynthesis.jp/tech/2015/12/aframe/)
[webVRの新しいフレームワークA-frameの使い方](http://lapin-luna.com/aframe-sample-howtouse/)
[新しいWebVRフレームワークA-Frame入門](http://qiita.com/rootx/items/cba61f1f725bd0090307)
[Build the Virtual Reality Web with A-Frame](https://hacks.mozilla.org/2016/03/build-the-virtual-reality-web-with-a-frame/)
[aframe-gamepad-controls](https://github.com/donmccurdy/aframe-gamepad-controls)