A-Frameで初めてVR表現を実装してみた！

# はじめに
こんにちは！[かほ](https://twitter.com/kaho_eng)です♪🐥
本業では技術広報業務や開発業務などに従事しています。
また完全にプライベートで[TECH WOMAN KANSAI](https://twitter.com/TechWomanKansai)という**関西の女性エンジニア限定のコミュニティ**をゼロから立ち上げ運営したりもしています。

今回の記事では、**A-Frame**と呼ばれる**WebVRフレームワーク**を用いて初めてVR表現を実装してみた過程について紹介します♪

# この記事の読者対象
・**WebVR**を簡単に実装してみたい方
・**WebVR**に興味のある方
・**A-Frame**に興味のある方
・**A-Frame**で**WebVR**を実装してみたい方

# 開発環境
htmlファイルのみ準備が必要

# A-FrameでWebVR実装をしようと思った経緯
いきなりVR！？と思われた方が多いと思うので、このテーマを執筆した経緯について簡単に説明します。

〜これは**TECH WOMAN KANSAI**のコミュニティ内での会話〜
Aさん💁‍♀️「あのー、今回のLT会で発表するテーマについて相談したいので、お話できますか？」
自分「もちろん！」
Aさん💁‍♀️「３つぐらいテーマの候補はあって、**A-Frame**を候補に入れています🙌」
自分「初めて聞くなぁ〜どんなツール？」
Aさん💁‍♀️「VR空間を作るためのフレームワークです！少しコード書いたらすぐにVR表現ができますよ！」

公式ホームページを教えてもらってVR空間のデモを触ってみた！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1547587/7ce21e17-e0d4-d95f-dfa9-62409e3aee90.gif"  width="500" height="186" />.

自分「おおー!!!なんか動いとる!!!（語彙力皆無）」
Aさん💁‍♀️「もともとVRを触ってたので知ってたんですけど、すぐできるんでぜひ触ってみてください〜。」
自分「|ू•ω•)ﾁﾗｯ」

といったコミュニティメンバーとの会話で、**A-Frame**のことを初めて知りました。
今までVRに触れたことが一切なかった自分にとっては、この出来事はとても新鮮だったので、VR表現の実装に対して純粋に好奇心が湧きました。
そこで**A-Frame**を使ってVR表現を実装してみることにしました！

# **A-Frame**とは？
**A-Frame**の概要をざっくりと把握すると、VR体験を構築するWebフレームワークです🐥
おおよそHTMLもしくはJavaScriptにより、至ってシンプルに実装できる点がメリットと言えます。
また、単なるマークアップ言語というわけではなくて、Three.jsがベースになっているらしいです！

# **A-Frame**を使ってVR表現を実装しよう！
**A-Frame**を使って実装を開始します！
## ①headタグ内にscriptタグを追加しよう
最初に、headタグ内にscriptタグを入れ子として、**A-Frame**フレームワークをページに取り込みます。
詳しくは[A-Frame JavaScripライブラリーファイル](https://github.com/aframevr/aframe/tree/master/dist#master-builds)をチェックしてみてください🙌
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://aframe.io/releases/1.4.0/aframe.min.js"></script>
  </head>
</html>
```
## ②sceneを追加しよう
次に、全てのオブジェクトを描画するためには　sceneが必要なため、sceneを追加します。
全てのエンティティ(映したい物体)がsceneに含まれる構成になります。
```html:index.html
<html>
  <head>
    <script src="https://aframe.io/releases/1.4.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
    </a-scene>
  </body>
</html>
```

## ③各物体を追加しよう！
**②sceneを追加しよう**で追加した`<a-scene>`タグの入れ子に物体を追加し、上記のVR画像の中にあるような物体を設置してみましょう♪🐥
下記では3つの物体例を挙げて説明します。

### 箱の設置
立方体のような物体を設置したい場合は、`<a-box>`タグを使用し、追加します。

```html:index.html
<html>
  <head>
    <script src="https://aframe.io/releases/1.4.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-box position="-1 1 -5" rotation="0 90 0" color="#FFCCFF"></a-box>
    </a-scene>
  </body>
</html>
```
`<a-box>`タグ内の各要素の意味は下記の通りです。
**position: その物体の位置**、**rotation: その物体の回転**、**color: その物体の色**

また、この物体のVR画像は下記のようになりました😆

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1547587/9c1d0d8c-14b3-fbd6-5a76-8be4c81303b4.gif"  width="500" height="186" />

`<a-box>`タグで使用できる要素については他に様々なバリエーションがあります。
説明は[リンク先](https://aframe.io/docs/1.4.0/primitives/a-box.html)にありますので、ぜひご覧ください🙌

### 球体の設置
球体のような物体を設置したい場合は、`<a-sphere>`タグを使用し、追加します。

```html:index.html
<html>
  <head>
    <script src="https://aframe.io/releases/1.4.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
       <a-sphere position="1 1 -3" color="#9057FF" radius="0.5"></a-sphere>
    </a-scene>
  </body>
</html>
```
`<a-sphere>`タグ内の各要素の意味は下記の通りです。
**position: その物体の位置**、**color: その物体の色**、**radius: その物体の半径**、

また、この物体のVR画像は下記のようになりました😆

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1547587/57658ea1-ccb6-622c-e220-b8a66948b7e1.gif"  width="500" height="186" />


`<a-sphere>`タグで使用できる要素については他に様々なバリエーションがあります。
説明は[リンク先](https://aframe.io/docs/1.4.0/primitives/a-sphere.html#attributes_radius)にありますので、ぜひご覧ください🙌

### アニメーションがついた物体例
上記のような物体にさらにアニメーションの動きをつけることができます。
今回は球体を表す`<a-sphere>`タグを入れ子にして、外側の`<a-entity>`タグの要素として`animation`を付与します。
 
```index.html
<a-scene>
  <a-entity rotation="0 0 0" animation="property: rotation; to: 0 360 0; loop: 2; dur: 5000">
    <a-sphere position="5 0 0" color="red"></a-sphere>
  </a-entity>
</a-scene>
```
`animation`要素のプロパティの意味は下記の通りです。
**property:アニメーションの動きにつけたいコンポーネントの名前**
**to:アニメーションさせる数値を指定**
**loop:アニメーションを繰り返す数**
**dur:アニメーションする時間をミリ秒で指定**

また、この物体のVR画像は下記のようになりました😆

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1547587/4ea311fa-5075-9e9f-0cfb-dd6cbe1e5e4e.gif"  width="500" height="186" />

`animation`要素については他に様々なプロパティのバリエーションがあります。
説明は[リンク先](https://aframe.io/docs/1.4.0/components/animation.html)にありますので、ぜひご覧ください🙌

# 最後に
今回は、実際に試してみたVR表現の事例を画像と共に3つほど挙げました。
VR表現の幅は広く、物体に影をつけたり、平面の物体を動かしたりなどまだまだ試せることはたくさんあるようです！
気になった方々はぜひ[公式サイト](https://aframe.io/)を見て色々チャレンジしてみてください♪
(私も気になるので、また触ってみようっと👀)

また、ほぼHTMLを書くだけでVR表現が可能であることにびっくりしました！
これはまだまだVRの入り口に過ぎないんだろうけど、ワクワクするなぁと感じるばかりです💓

今後もまた時間がある時に触ってみようかな！ではでは〜🐥

Twitterアカウント:https://twitter.com/kaho_eng

# 参考資料
https://aframe.io/

https://aframe.io/docs/1.4.0/introduction/

https://github.com/aframevr/aframe/tree/master/dist#master-builds

https://aframe.io/docs/1.4.0/core/scene.html

https://aframe.io/docs/1.4.0/primitives/a-box.html

https://aframe.io/docs/0.8.0/primitives/a-sphere.html

https://aframe.io/docs/1.4.0/components/animation.html