WebBluetoothで遊んでみる~ARを添えて~

これは、[株式会社ACCESS Advent Calendar 2019](https://qiita.com/advent-calendar/2019/access) の15日の記事です。

本記事では、私が好きな無線通信のひとつである BLE (Bluetooth Low Energy) で、最近？まともに使えるようになった Web Bluetooth で遊んでみたことをつらつら書いていきます。

## もう一度 Web Bluetooth に触ってみる
Web Bluetooth は簡単にいうと ブラウザ上で BLE 通信をする機能です。
仕様は WebBluetooth CG が公開しています。
https://webbluetoothcg.github.io/web-bluetooth/

実は昨年の2018 春頃に一度使ったことがあるのですが、通信が途切れやすい、Windows 機器では使えない等々の問題があり、遠ざかっていました。

そして月日がながれ、現在(2019/12/11)においては、上記の問題が解決されたということで使ってみることにしました。

## とりあえず動くものを作ってみる
とりあえず動くものを作ろうということで、OpenGL のお勉強でお世話になった [あのティーポット（Utah teapot）](https://ja.wikipedia.org/wiki/Utah_teapot) をブラウザ上でくるくる回してみます。

| ![Utah teapot](https://upload.wikimedia.org/wikipedia/commons/4/47/Utah_teapot_3dsmax.png) |
|:--:|
| あのティーポット (引用: wikipedia) |

デバイスは、[9軸計測できるセンサ](https://www.switch-science.com/catalog/2734/) と [BLE がオンボードでついているマイコン](https://www.switch-science.com/catalog/3444/)を組み合わせたものを用意しました。
加速度の値を BLE で飛ばすようにいい感じにコーディングして完成。
デバイスの傾きでティーポットをくるくる回そうということです。

| ![DSC04650-img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96450/d59c1683-3de0-cd6d-ff6e-a8b62b49359c.jpeg) |
|:--:|
| BLE デバイス |

ブラウザ上でのデバイスの接続や、ティーポットを表示させるために HTML / JavaScirpt / CSS でいい感じにコーディングします。
GoogleChrome さんが Github にサンプルを上げていた<sup>[(1)](https://googlechrome.github.io/samples/web-bluetooth/notifications.html)</sup>ので簡単に作ることができました。

ティーポットは、[Three.js](https://threejs.org/) で表示しています。
余談ですが、Three.js は公式を見たほうが一番わかりやすいと思います。
ブログ等の使ってみた記事は、バージョンが古いものを使用して実現していることが多いです。
現バージョンでは動かないトラブルが結構な確率であります。
そのため公式をみたほうが良いです。

余談はここまでとして、とりあえず動くものが完成しました。
動かしてみます。

|![01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96450/a6086919-7781-9801-0935-3d7fc39049ad.jpeg)|
|:--:|
| デバイスと接続して |

|![ezgif.com-video-to-gif-compressor.gif](https://live.staticflickr.com/65535/49216017656_98afe9bb89_o.gif)|
|:--:|
| ティーポットをくるくる |

windows で動くようになってる！
通信も途切れない！
すげー！

## Web Bluetooth × AR
**Web Bluetooth めっちゃ動く すげー!!** となったところで、これまた個人的に好きな AR ( Augmented Reality ) と組み合わせたらどうなるかなぁということで実験してみました。

せっかくなのでマーカーレス AR に挑戦。
[8th Wall](https://www.8thwall.com/) でやってみることにしました。
![2019-12-14 11.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96450/48ff7963-01db-48db-5ddc-830c16250229.png)

WebBluetooth × ティーポット × 8th Wall をいい感じに組み合わせます。

## 作ってみた
いい感じに組み合わせて爆誕したものが**ARのティーポットをデバイスで動かすやつ(タイトル未定)**です。
デバイスの傾きでティーポットの座標を動かしています。

|![49216465506_ef365eb7c4_o.gif](https://live.staticflickr.com/65535/49216465506_ef365eb7c4_o.gif)|
|:--:|
| 遊んでみた |

もっと凝ったのを作りたかったのですが時間の都合上ここまでになりました。

## まとめ
Web Bluetooth と AR をちょこっと触ってみました。
Web Bluetooth は以前よりもだいぶ改善されており、だいぶ使える印象を持ちました。
これからもウォッチしていきたいと思います。

また、はじめてマーカーレス AR に挑戦してみました。
8th wall を使用してみましたが、サンプルも充実しており簡単にマーカーレス AR が実現できることがわかりました。
次は Google さんが出している [ARCore](https://developers.google.com/ar) をいじってみようと思います。

## 参考
1. Notifications Sample, GoogleChrome, [https://googlechrome.github.io/samples/web-bluetooth/notifications.html](https://googlechrome.github.io/samples/web-bluetooth/notifications.html)
2. three.js - Tap to place, 8thwall, [https://github.com/8thwall/web/tree/master/examples/threejs/placeground](https://github.com/8thwall/web/tree/master/examples/threejs/placeground)

<br>

明日のアドベントカレンダーは、 @hnishi さんです。
また明日もみてくださいね。じゃんけーんぽーん！