プレゼンモード
再生
← / →で移動
fでフルスクリーン
escでおわる
こんにちは,id:hitode909です.YAPC::Tokyo 2019において,「WebVRで作品を作って展示しよう」というお題で発表しています.この記事は,その発表資料です.
WebVRで作品を作って展示しよう
YAPC::Tokyo 2019
株式会社はてな hitode909
この発表
アジェンダ
- WebVRについて、フレームワークや開発方法について
- 普通のウェブ空間から連続的にVR空間に向かうためのアプローチ
- デバイスを安定して展示するためのノウハウ
- 物理的な展示におけるグロースハック
ゴール
- WebVRを使ったVR作品を今すぐ作れるようになる
- WebVRを使ったVR作品をイベントで展示できるようになる
🖐
- 開発経験
- Web
- VR
- WebVR
- 便利さ
- 役立つアプリケーション
- 役に立たないアプリケーション
- 両方
自己紹介(1)
- hitode909
- 株式会社はてな アプリケーションエンジニア
- ブログチーム→マンガチーム、CTO室
- 便利なものを作るのが好き
自己紹介(2)
- おもしろいもの(=作品)を作るのが好き
- 役に立たないプログラム、絵が出るプログラム、音が出るプログラム
- 完成した先に便利さが待っていないソフトウェアの開発
- ジェネラティブ・アート
- Processingの学習
https://blog.sushi.money/entry/2012/12/29/175658
- Processing.jsで年賀状
https://hitode909.appspot.com/2013/
- はてなインターンのJavaScriptの講義でマウスストーカーを作る課題を出した
日本の伝統的アプリケーション「マウスストーカー」を作れ
https://github.com/hatena/Hatena-Textbook/blob/public2014/javascript-event-driven.md#課題2マウスストーカーとは
- ホームページに配置してホームページを楽しくするアプリケーション
- 最高のマウスストーカーを作った - hitode909の日記
- 快適になめらか動かすためには、パフォーマンスへの配慮や、気持ちの良い座標計算が必要
今日は、完成した先に便利さが待っていない、人の暮らしを楽しくする作品の話をします
なぜVR
- 近年、VR元年が続いている
- ゾンビのゲーム、ジェットコースター、VTuberの台頭
- ふだんゲームしないので敷居が高い
- ゾンビのゲーム、ジェットコースター、VTuberの台頭
- 2017年8月、WebVRの存在を知る
- ちょっとしたものを作り始める
- 2018年11月、本の販売イベントでWebVRを使った展示
- 2019年1月、皆様に面白さを伝えている
WebVRについて
WebVR API | MDN
- ブラウザ上でVRコンテンツを表示できる
- 立体映像との違い=首の動きに応じて映像が変わる
- カメラで首の向きを取得する手法や、ヘッドマウントディスプレイにセンサーを入れる手法
- 最近のスマホなら動く、Oculus Goなど専用デバイス(ヘッドセット)があるとより楽しい
- 直接実装する場合、WebGLを使っていく
- quick and dirty exampleで600行くらい https://github.com/mdn/webvr-tests/blob/master/raw-webgl-example/webgl-demo.js
- 実現することが目標なのでここの話はしません
- 簡単に実装するためのライブラリがある
- 主にこっちの話
デバイス
PC、スマホ
- スマホ単体では立体には見えない
簡単にWebVRを使うためのグッズ
- React 360
- AWS Sumerian
- A-Frame
React 360
- Facebook製、旧称 React VR
- Reactの世界観で3D世界を作れる
react-360 init Hello360
するとプロジェクトの雛形ができる、npm start
でサーバー起動- なんでもJSXで書きたい人にはおすすめだけど、気軽に遊びに使うには重厚
render() { return ( <View style={styles.panel}> <View style={styles.greetingBox}> <Text style={styles.greeting}> {`Count: ${this.state.count}`} </Text> </View> </View> ); }
https://facebook.github.io/react-360/docs/explore-code.html
- 同僚の部屋をVR空間上に構築
- VR MASAWADA HOUSE
- パノラマ写真+パーティクル+文字
Amazon Sumerian
- Amazon製のブラウザで動くUnityみたいなサービス リッチなGUIの開発環境
- 自立して動くキャラクターを作るための機能が充実している
- キャラクターの状態遷移を作る
- 対話ロジックをAWS Lambaで書いて、Amazon Pollyで喋らせる
- キャラクターが登場するような、会社紹介とか、採用ページとかVRで作りたいならおすすめ
- これも同僚の部屋を作って満足
A-Frame
- Mozilla製、とにかく簡単
- CDNからscriptタグでロード、ペライチHTMLで実装
- a-sceneタグでシーンを作る、a-boxで箱が出る
- Custom Elementsで実装されている
- HTMLなのでビルド不要
- 手早く作るのにオススメ
- 今日は主にこれ
<html> <head> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box> <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere> <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder> <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane> <a-sky color="#ECECEC"></a-sky> </a-scene> </body> </html>
A-Frame 練習
- チュートリアルがある
- Glitchというサービスでその場で編集して遊べる
- Ctrl+Alt+iでデバッガ
できること
- 3D空間にオブジェクトや画像を配置
- アニメーション
- 自分でループを書かなくて済む
- 毎フレーム計算したいような場合は自分でJSを書く
- DOM操作
- JSからappendChildするとオブジェクトが表示される
- HTMLを描画する
- https://github.com/mayognaise/aframe-html-shader
- html2canvasを使って実装されている
- https://github.com/mayognaise/aframe-html-shader
- ポインティングデバイスの利用
- VRお絵かきアプリとか作れる
A-Frame ローカル開発、デプロイ
- 単なるHTMLなので普通にファイルを置く
- ローカルでポートを立てて起動
- 外部と通信するため、ngrokも立てておくと便利
- お手元のスマホやヘッドマウントディスプレイからアクセスして確認できる
python -m SimpleHTTPServer 3100 & ngrok http 3100
- GitHub Pagesにデプロイ
- git push origin master
- 例: VRでタイムテーブル見れるのを作ってみた
WebからWebVRへ
- 普通のウェブ開発と同じこと、違うこと、アプローチ
Webから引き継げる
- 絵を出せる
- 音だけの世界に行くよりは敷居が低い
- ポインティングデバイス
- ボタンをクリックとかUIを作れる
- imgでの画像読み込み
- これまで親しんだ画像ファイルを使える
- HTMLのレンダリング
- canvasを経由して文字も出せる
- ブラウザAPI
- 現在位置と対応したコンテンツ
- カメラの入力をVR空間に表示するとか
- デスクトップ通知も送れる(使いみちは不明)
- デベロッパツール
- このリソースが重いとかキャッシュ効いてないとか勘所は変化なし
- fetch、XHRを使った外部APIとの通信
- 無限の可能性
- VRからWebVRに入る場合と比べると、インターネットとつながっている既存のAPIに慣れ親しんでいることは強み
- 開発フロー
- GitHubを使ったコード管理、デプロイ、CDN通す、facebook OGP対応、とか
WebVRで獲得できる
- 3D空間
- 2Dのウェブページにはない世界
- 世界をすべて作れる、フチがない、終わりがない
- メートル法
- 5 units in A-Frame is equal to 5 meters in real life.
- メートル法を使ったソフトウェアを書くことはふだんない
- 人間を出すときは実際の身長くらいに
- 急に身体性が増す
- 「ファーストビュー」「スクロールすると」から「上を見ると」「見回すと」に変わる
- カメラの高さをどこに置くか 失敗するとすごく背が高くなったように感じたり
- パノラマ写真を活用できる
- RICOH THETA、スマホのパノラマモード、などで撮った写真を背景に貼れる
- パノラマ写真にPANORELLA以来の使い道ができた
- flickrのパノラマ写真が集まるグループ
アプローチ
安直に考えると
- 機能から考える
- 例:VRプレゼンツール、VRカレンダー、VR天気予報、VR YAPCタイムテーブル、…
- せっかく世界を作れるので、場所から考えてみる
- 同僚の部屋を作る→VR MASAWADA HOUSE
あなたもWebVRコンテンツを作れるようになりました(ここまでで13分、15:43くらいの想定)
- 展示しようとすると別の苦労がある
- 昨年やったイベントの展示の実例をご紹介
TRANS BOOKS 2018
- 「メディアなんでも書店」がテーマの本の販売イベント 土日に2日間開催
- 声かけてもらって出られることになった
- 他の出店者は、アーティスト、詩人、会社員、写真家、彫刻家、など
- 2015年のYAPCで流れていた採用目的CMを撮影された鹿君、youpy.cssでおなじみyoupyさんも出展されていた
- 豆本夢日記とVR夢日記の二本立てで出展
ボツ案
VR本屋
VR夢日記
- https://yume.sushi.money/
- VR空間上でひたすら夢日記を読める作品
- せっかくのVRなのに文字を読まされる
- がんばって文字を読んでいると、布団に入って就寝している男性がカメラに向かって飛んでくる
- ペラペラのオブジェクトと衝突して突き抜ける体験
- 背景はflickrで探してきたフリー素材の空間
- ライセンスを書く場所がない問題
- 本のしおりにURLとQRコードが書かれていて、スマホで遊べる
構成
- A-Frame
- S3+CloudFront
- 夢日記データはブログのフィードをXHRで取得
- 200記事あるので無限に読める
- 1文字ずつcanvasに書き出し→画像に読み込んで表示
- sin, cos, tanで位置を計算しくるくる回す、画面外に消えて下から出てくるときに次の文字をレンダリングすることで要素を再利用
- 寝てる男性は敷布団、枕、男性、掛け布団、の4枚の画像で構成し、a-animationで動かす
- entityで囲って、a-animationを置くと、まとめて動かせる。HTML感
<a-entity> <a-image src="#bed1" width="1.704" height="2.612" opacity="1.0" position="0 -0.8 0.0" rotation="90 180 0"></a-image> <a-image src="#bed2" width="0.941" height="0.471" opacity="1.0" position="0 -0.5 -0.9" rotation="90 180 0"></a-image> <a-image src="#bed3" width="0.791" height="0.945" opacity="1.0" position="0 -0.2 -0.6" rotation="90 180 0"></a-image> <a-image src="#bed4" width="1.517" height="1.935" opacity="1.0" position="0 -0.0 0.3" rotation="90 180 0"></a-image> <a-animation attribute="position" dur="20000" fill="forwards" from="0 -15 0" to="0 15 0" direction="alternate" repeat="indefinite" ease="eases-in-out" ></a-animation> </a-entity>
パフォーマンス
- 意図した動きになるまではPCでデバッガを見つつ開発
- 当然快適に動く
- 動いたら、ngrokでスマホで見たり、Oculus Goで見たりして確認
- canvasの解像度を下げたり、画面内に飛ばす文字数を調整したり
- 自分でJSを書く場合は60FPS出てるか確認
ソフトウェアができた
- あとは展示に向けて動いていく
- ベータテスト
- 展示にあたっての工夫
- 会期中のグロースハック
ベータテスト
- 会社で昼休みに展示
- 反応を伺う
- 展示に使うデバイスの選定
Cardboard
VR夢日記開発中です。めっちゃ酔うと好評#TRANSBOOKS_JP pic.twitter.com/Q64cSCtOOf
— 趣味はマリンスポーツです (@hitode909) November 16, 2018
- 電源さしっぱなしにしてもバッテリ使い切ってしまう
- セロテープでの固定がチープで破損する
- きれいに立体に見えない
- ただのダンボール箱なので戸惑う
Oculus Go
VR夢日記、デバイスを段ボールからOculus Goにパワーアップしました #TRANSBOOKS_JP pic.twitter.com/5kqxcOhcpA
— 趣味はマリンスポーツです (@hitode909) November 19, 2018
- きれいに見える
- ダンボールと違って使い方が明らか
- こちらを本番用に採用
展示前日
- 周りが本を持ち込む中、デバイスの設営
展示当日
事前の工夫
安定して動かすために
- 充電ケーブルつなぎっぱなしに
- 会期中に電池が切れると困るので給電し続ける
- リモコン使わないので隠しておく
- 遠くすぎると「コントローラが見つかりません」が出るので机の裏にテープで貼っておいた
- オフタイマーを切る
- 一度スリープするとコントローラでの操作が必要になるので、絶対に避けなければならない
- Oculus Goの設定じゃなくてスマホのOculusアプリ側に設定があるので難しい
使いやすさのために
- 電源ケーブルの長さ
- 周りを見渡せる長いケーブルをつないでおく
- 長すぎると絡まるのでどほどに
- 展示と事故の話題: アニッシュ・カプーアの作品に落下する
- バンドを外しておく
- 紐の長さ調整するのは手間なので、紐を外しておく
- 手で持って見てもらう形
会期中のグロースハック 安定稼働編
- 2日間会場に立って、来た人と話したり、様子を観察したりして調整
- 顔センサーにシールを貼る
Oculus Goをスリープさせない方法 pic.twitter.com/SB7MT9CVEI
— GOROman (@GOROman) May 12, 2018マスキングテープを貼って自動消灯オフにしてみた pic.twitter.com/uLOcYj9LmI
— 趣味はマリンスポーツです (@hitode909) November 24, 2018- センサーがついていて、顔にぴったりくっつけないと映像が出ない
- 覗いたときに画面が真っ暗だと覗く前に離脱してしまう
- google:oculus go スリープさせない
- 使わないボタンを隠すためにふせんを貼る
- 上部に電源ボタンがあり、押すとスリープしてしまう
- 「VR夢日記やってます」といいうふせんを上部に貼ることでスイッチが有るのをわからないように
ちょっとした調整で安定度アップ
- 初日は電源ボタン押してしまったりして、1時間に1回くらい止まってた
- 2日目は誤操作がなくなって、ほぼ無停止で稼働できた
グロースハック 認知編
- 安定稼働した次は、使ってもらえない、覗いてもらえない、という問題になった
- ノートPCにしおりを貼っておく
- QRコードを読めばスマホで見えることから関心を持ってもらう
- 本の「はじめに」を拡大印刷して置いておく
- いきなりVR空間に行くと意味不明なので、コンセプトを理解してから体験してもらう
KPI上昇
- 当日の改善によってKPIが上昇
- ヘッドセットを覗いてもらえる確率
- 覗き始めてから外すまでの時間
- (売上への関与は不明)
- 普通のウェブの開発での改善手法がそのまま役立つ
- 安定してソフトウェアを動かす→SRE的な動き
- 画面を常時光らせておく→ シグニファイア、インタラクション可能性
- 置かないボタンにふせんを貼る→不要な情報を隠す
- 解説を置く→初訪問者へのおもてなし、チュートリアル
- ユーザー行動を観察する→ユーザーテスト
まとめ
- 役に立たないソフトウェアを作ることで、人を楽しませたり、笑顔にしたりできる
- WebVRはWebエンジニアが簡単に歩み寄れるプラットフォーム
- 新たな表現手段を身につけることで、既存の技術との掛け算でいろんなことができる
- 現実世界のイベントならではの工夫