【Oculus Quest】Oculus Touch Controllerを懐中電灯にする
概要
- Oculus Questアプリに、Oculus Touch Controllerの動きに追従する懐中電灯を導入する
- 概要
- 環境
- セットアップ
- シーンにCubeとPlaneを追加
- 懐中電灯を用意する
- シーンにOVRPlayerControllerを追加
- シーンにOVRControllerPrefabを追加
- Touch Controllerと懐中電灯を紐付ける
- 懐中電灯に光源を設定する
- 完成
- 参考
環境
- Oculus Quest
- Oculus Touch Controller
- Unity 2018.4.0f1
- Oculus Integration for Unity
セットアップ
シーンにCubeとPlaneを追加
空間を暗くする
効果を分かりやすくするため、以下の手順で空間を暗くする
- Directional Lightを削除
- Asset「10 Skyboxes Pack : Day - Night」をダウンロード&インポート。その中にある「SkyMidnight」をSkyboxに設定
懐中電灯を用意する
Asset「Flashlight」をAsset Storeよりダウンロード&インポート
シーンにOVRPlayerControllerを追加
- OVRPlayerControllerをシーンに追加
- Main Cameraを削除
シーンにOVRControllerPrefabを追加
OVRControllerPrefabをRightControllerAnchor配下に追加
(懐中電灯を右手に持ちたい場合。左手に持ちたい場合、LeftControllerAnchor配下にする)
Touch Controllerと懐中電灯を紐付ける
OVRControllerPrefab配下に、Flashlight(懐中電灯のモデル。Flashlight > Model 配下にある)を追加
Flashlightを適切なポジションに回転させる
OculusTouchForQuestAndRiftSRightModelのメッシュレンダラーを削除
このままだと、懐中電灯にくわえ、Touch Controllerも表示されてしまう
そこで、OculusTouchForQuestAndRiftSRightModelのインスペクターより、メッシュレンダラーを削除する
これで懐中電灯のみが表示されるようになる
懐中電灯に光源を設定する
Flashlighにスポットライトを追加
スポットライトを懐中電灯の向きと一致するよう回転させる
完成
Oculus Touch Controllerを上下左右に動かすと、懐中電灯と、そこから発せられる光が追従する
参考
「VR妄走」大好きなあの子とVRで一緒にランニングしてみた!
「VR妄走」CM
「VR妄走」のコンセプトが一発で分かるCMです!
(注:実際にはプレイエリア制限があり、動画のように縦横無尽には走れません)
「推しと一緒なら、キツい運動も楽しくなるのでは…?」という発想から、
— オズ (@OzDotObj) 2019年6月12日
VRで葵さん( @takayama__aoi )と一緒にランニングできる「VR妄走」をつくりました!
こちらはコンセプトが一発でわかるCMです!ご覧ください!!!#VR妄走 pic.twitter.com/ZK7AkBrpId
目次
- 「VR妄走」CM
- 目次
- 概要
- 使用したツール
- 制作
- ①葵さんの3DCGモデル作成
- ②「葵さんと一緒に走れる」機能の実装
- ③「10分に1回、葵さんが音声で励ましてくれる」機能の実装
- ④完成
- 課題
- ソースコード
- 参考文献
概要
「大好きなあの子と一緒なら、キツい運動も楽しくなるのでは…?」という発想から、VR空間で葵さん(僕が応援している女優)と一緒にランニングができるOculus Questアプリ「VR妄走」をつくった
「VR妄走」の機能
- 葵さんと一緒に走れる
- 10分に1回、葵さんが音声で励ましてくれる
使用したツール
- Oculus Quest
- Unity 2018.4.0f1
- Blender 2.79b
Oculus Quest
- Oculus社のHMD
- 動作にPCが不要
- 6DoF
- 身体の動きを捕捉できる
- Androidベース
- 2019年5月21日に発売された
- 発売したばかりで知見が溜まっていないので、Questと共通点の多い(スタンドアロン型でAndroidベース)Oculus Goのノウハウを応用する
Oculus Questを選んだ理由
- スタンドアロンで動作し、身体の動きをセンシングできるので、本企画(ランニング)にピッタリだと思った
- 身体の動きと連動させてVR空間内を走り回れるようにしたかったが、結局コントローラーで操作することにした
- 次のバージョンでは身体に連動させたい
Unity
- ゲームエンジン
- ゲーム以外のコンテンツもつくれる
- Oculus Questアプリも開発できる
- Oculus推奨バージョンの2018.4 LTSを利用
Blender
- 3DCGを制作・編集できるソフト
制作
①葵さんの3DCGモデル作成
頭をつくる
写真からメッシュとアバターを生成できるUnityプラグイン「Avater Maker」で葵さんの頭をつくる
- Avatar Maker Pro - 3D avatar from a single selfie - Asset Store
- 顔写真から3Dモデルを作成できるAvatar Makerを使ってみた | STYLY
元画像
結果
髪は後からつけたもの
生成したメッシュとアバターをFBX exportし、Blenderにimportする
胴体をつくる
- 胴体は、他の方が制作したモデルを流用
- 流用元のモデルは、MoxRig
- BlenderでMoxRigを解体し、胴体を葵さんの頭と合体する
頭と胴体のメッシュを結合
- 【Blender】ボーンを入れる(リギング)ための基本手順 - おもちゃラボ
- 「メッシュを1つのメッシュにまとめる」の項を参照
モデルが完成。MoxRigにはあらかじめリグが通されているので、別途、設定する必要はない
FBX形式でexportし、Unityにimport。Mecanimを設定する
②「葵さんと一緒に走れる」機能の実装
- VR空間とのインタラクション
- プレイヤーは、VR空間とどうやってインタラクションするか
- VR空間は、どのようにして、「プレイヤーが走っている」ことを認知するか
- 葵さんとプレイヤーを移動させる
- 移動と同時に、葵さんに「走る」アニメーションを付ける
- アニメーションを付けないと、身体が硬直したまま、ムーンウォークのように移動してしまう
当該機能のスクリプト
以下のスクリプトをOVRPlayerController(プレイヤーのGameObject)に追加
using UnityEngine; public class Run : MonoBehaviour { GameObject aoi; Animator aoiAnimator; private void Start() // ゲーム開始時に実行される { aoi = GameObject.Find("Aoi"); aoiAnimator = aoi.GetComponent<Animator>(); } private void Update() // フレームが更新されるごとに実行される { OVRInput.Update(); if (OVRInput.Get(OVRInput.Button.One)) // TouchControllerのButton.Oneが押されていれば { // Animator ControllerのisIdleパラメーターをFalse、isRunパラメーターをFalseに aoiAnimator.SetBool("isIdle", false); aoiAnimator.SetBool("isRun", true); Invoke("MoveFoward", 2.0f); } else { // TouchControllerのButton.Oneが押されていなければ // Animator ControllerのisRunパラメーターをFalse、isIdleパラメーターをTrueに aoiAnimator.SetBool("isRun", false); aoiAnimator.SetBool("isIdle", true); } } void MoveFoward() { // 葵さんが、Z方向に、前回のフレームから経過した時間×3、移動する aoi.transform.Translate(0, 0, Time.deltaTime * 3); // プレイヤーが、Z方向に、前回のフレームから経過した時間×3、移動する transform.Translate(0, 0, Time.deltaTime * 3); } }
VR空間とのインタラクション
VR空間とのインタラクションには、Oculus TouchControllerを用いる
TouchControllerのButton.Oneを押すと葵さんとプレイヤーが走り、離すと止まる
OVRInput.Update(); if (OVRInput.Get(OVRInput.Button.One)) // TouchControllerのButton.Oneが押されていれば { // Animator ControllerのisIdleパラメーターをFalse、isRunパラメーターをFalseに aoiAnimator.SetBool("isIdle", false); aoiAnimator.SetBool("isRun", true); Invoke("MoveFoward", 2.0f); // 2秒後に実行 } else { // TouchControllerのButton.Oneが押されていなければ // Animator ControllerのisRunパラメーターをFalse、isIdleパラメーターをTrueに aoiAnimator.SetBool("isRun", false); aoiAnimator.SetBool("isIdle", true); }
葵さんとプレイヤーを移動させる
void MoveFoward() { // 葵さんが、Z方向に、前回のフレームから経過した時間×3、移動する aoi.transform.Translate(0, 0, Time.deltaTime * 3); // プレイヤーが、Z方向に、前回のフレームから経過した時間×3、移動する transform.Translate(0, 0, Time.deltaTime * 3); }
葵さんにアニメーションを付ける
アニメーションは、Unityプラグインの「Mecanim Locomotion Starter Kit」から「Humanoid Idle(停止時)」と「Humanoid Run(走行時)」を利用
- Mecanim Locomotion Starter Kit - Asset Store
- 「Unity」 Mecanim Locomotion Starter Kitで簡単にプレイヤーを操作する | Mechalog
Animator Controller
- 開始時はIdleアニメーション
- isRunがTrueならRunアニメーションを開始
- isIdleがTrueならIdleアニメーションを開始
③「10分に1回、葵さんが音声で励ましてくれる」機能の実装
葵さんのGameObjectに、AudioSourceとして「励ましの音声」を追加
加えて、以下のスクリプトをコンポーネントに追加
using UnityEngine; public class Cheer : MonoBehaviour { public float span = 600.0f; // 600秒=10分 private float currentTime; private AudioSource audioSource; void Start() // ゲーム開始時に実行される { audioSource = gameObject.GetComponent<AudioSource>(); } void Update() // フレームが更新されるごとに実行される { currentTime += Time.deltaTime; // 前回のフレーム更新からの経過時間を足す if (currentTime > span) // 前回の声援から10分経っていれば { audioSource.Play(); // 励ましの音声を再生する currentTime = 0.0f; } } }
④完成
課題
- VR酔い対策
- プレイヤーの身体を表示する
- 葵さんの身体を人間にする
- TouchControllerのボタンではなく、プレイヤーの動きによってインタラクションを起こしたい
ソースコード
参考文献
Oculus
- Oculus Developer Center | Overview
- Oculus Unity Getting Started Guide
- Unity+Oculus Rift開発メモ - フレームシンセシス
- Unity開発ガイド | Oculus Mobile Development Documentation(0.4.3)日本語訳 | 近未来ラボ
- OVRInput
Oculus Quest
- Oculus Quest向けアプリの個人開発は可能か? 実機で確かめてみた | MoguraVR News - VRの「いま」を掘りだすニュースメディア
- Oculus Quest向けのビルドとコントローラの表示メモ - JackMasaki’s blog
- 【VR】Oculus Quest+Unity開発 - ロードバイク時々ものづくり
Oculus Go
- Oculus Go開発の環境を整える。 - トマシープが学ぶ
- 備忘録 OculusGoにapkをインストールする方法 - よねちゃんねる
- Oculus Integrationを使ってOculus Goでの移動やコントローラの表示&同期を実装【Unity】【VR】【アセット】【Oculus Go】 - (:3[kanのメモ帳]
Unity
- Unity User Manual (2018.3) - Unity マニュアル
- Unity2017入門(SB Creative)
- Unityで神になる本。(オーム社)
VR
- VR概要 - Unity
- UnityによるVRアプリケーション開発(オライリー・ジャパン)
アニメーション
- UnityのMecanimでキャラクターを動かす - Qiita
- 【Unity】Humanoidモデルの設定とアニメーションテスト – MTの備忘録
- 2時間で3Dモデルを作ってUnityでアニメーションさせた - タカシカンパニーブログ
- Mecanim Locomotion Starter Kit - Asset Store
- 「Unity」 Mecanim Locomotion Starter Kitで簡単にプレイヤーを操作する | Mechalog
オーディオ
定期実行
Avater Maker
- Avatar Maker Pro - 3D avatar from a single selfie - Asset Store
- 顔写真から3Dモデルを作成できるAvatar Makerを使ってみた | STYLY
Blender
「全自動ケチャップお絵かき機」をつくってみた
- 全自動ケチャップお絵かき機ってなに?
- 企画趣旨
- 機材・材料
- 制作
- ①3Dモデル作成
- ②ファームウェアのアップデート
- ③Discov3ryをUltimaker 2 Extended+に接続
- ④ノズルアタッチメントをUltimaker 2 Extended+のプリントヘッドに取り付ける
- ⑤カートリッジの準備
- ⑥Perge
- ⑦いざ、出力
- 結果
- 失敗の原因は?
- NG集
- 全自動ケチャップお絵かき機がある未来
- お役立ちリンク集
全自動ケチャップお絵かき機ってなに?
まずは動画をご覧ください。
企画趣旨、動機、ざっくりした制作の流れがまとまってます。
企画趣旨
「女優の高山葵さんがオムライスに描いたケチャップ絵」を3Dプリンタで再現する
機材・材料
- Ultimaker 2 Extended+(3Dプリンタ)
- Ultiimaker Cura 3
- Discov3ry
- GIMP
- 「高山葵さんがケチャップで絵を描いたオムライス」の画像
- ケチャップ
- まな板
Ultimaker 2 Extended+
- Discov3ry対応の3Dプリンタならどれでも可
- 対応機種はこのページで確認できる
- 今回はUltimaker 2 Extended+を使用
Ultiimaker Cura 3
Ultimakerが提供しているスライサーソフト
Discov3ry
普通の3Dプリンタでは、ケチャップやチョコクリームなどのペースト状のものは素材として使えない。
どうしたものかとGoogleで調べまくった結果、3Dプリンタに取り付けことでペースト状のものを素材として使えるようにする装置「Discov3ry」を見つけた。
Discov3ryはカナダのStructur3D Printingという企業が製造・販売している。
Structur3D Printingのメールアドレスに「これ、ケチャップも使える?」とメールしたところ、CEOのチャールズ直々に「使える」との返事をもらった。
その後も、チャールズが丁寧にこちらの疑問点に答えてくれたおかげで、海外輸入に伴う不安は払拭され、Discov3ryを購入することにした。
同梱品
ケチャップ
デルモンテのケチャップ
制作
①3Dモデル作成
元画像
GIMPで元画像から絵だけを抽出。透過PNGにする
3Dモデルの高さを均一にするため、白く塗りつぶす
Cura 3で透過PNGを3Dモデルに変換
- File → Open File(s)から透過PNGをインポート
②ファームウェアのアップデート
- Ultimaker 2 Extended+にデフォルトでインストールされているファームウェアを、Discov3ryのファームウェアにアップデートする
- ファームウェアはDiscov3ryが入ってた箱に同梱されている
③Discov3ryをUltimaker 2 Extended+に接続
E1ポートからMK2 Extruderのケーブルを抜く
E1ポートにDiscov3ryのケーブルを接続する
④ノズルアタッチメントをUltimaker 2 Extended+のプリントヘッドに取り付ける
⑤カートリッジの準備
チューブの端をノズルアタッチメントの穴に通し、チューブにノズルを取り付ける
チューブのもう一方の端をカートリッジに取り付ける
カートリッジにケチャップを装填
Discov3ryにカートリッジをセット
⑥Perge
Pergeとはカートリッジに充填された素材をチューブの先端まで送り、出力の準備を整えること
Perge失敗
Ultimaker 2 Extended +でPerge開始の操作をするも、いつまでたっても何も起こらない。
そこで、Structur3D Printingのフォーラムに同様の問題が報告されていないか探したところ、いくつかの投稿を見つけた。
- http://forum.structur3d.io/t/extruder-does-not-purge-at-all/915/10
- http://forum.structur3d.io/t/threaded-rod-not-turning/187
六角レンチを挿す
投稿をもとに試行錯誤した結果、六角レンチを挿し忘れていたことが原因だと分かった。
Pergeはゆっくり
フォーラムによると、Pergeの速度はとても遅いらしく、開始から5~10分ほど経って、ようやくはじまった。
Pergeが終わると、ノズルの先端までケチャップが行き渡る。
⑦いざ、出力
Ultimaker 2 Extended +の台にまな板を置き、①でつくった3Dモデルを出力
結果
元画像との比較
なんかおかしい
失敗の原因は?
- 3Dモデルが不完全だった説
- Structur3D Printingが配布してる3Dモデルで検証してみる
- 素材としてケチャップが不適切だった説
- チョコクリームなど他の素材で検証してみる
NG集
オムライス
はじめはオムライスに描こうと思った 描きやすいように卵生地を広げ、ケチャップライスの山を崩し、平たくする
結果
だが、ノズルの先が卵生地にあたって破れてしまう(中央に注目。右下の裂け目は最初から破れてたもの)
ピザ生地
オムライスが無理でも、せめて食べ物に…ということで、次はピザ生地でチャレンジ
結果
やはりノズルがあたって生地が破れてしまう
ノズルを生地から離してみた
ノズルが近すぎるため生地が破れてしまうのでは?と考え、ノズルを生地から離して再度チャレンジ
結果
一滴ずつケチャップが垂れてしまい、線にならない
というわけで
まな板に描くことにした
全自動ケチャップお絵かき機がある未来
最後に、全自動ケチャップお絵かき機を社会で活かすためのアイデアをいくつか挙げたいと思います。
①メイドカフェ
秋葉原などにあるメイドカフェでオムライスを頼むと、メイドさんがケチャップでオムライスにお絵かきしてくれますよね。
でも、来店したとき、お目当てのメイドさんがお休みだったら?
そんなときこそ、全自動ケチャップお絵かき機の出番です!!
過去にメイドさんが描いたケチャップ絵を、本人がいなくても、再現できます!!!
完成までに数時間かかるのがネックですが、改良を重ねることでいずれ短縮できるはず!
全自動ケチャップお絵かき機目当てで来店するお客(観光客など)も期待できます。
全国のメイドカフェ経営者のみなさん、店舗に一台、導入してみてはいかがでしょうか?
さらにさらに、メイドファンの皆さんに朗報!
全自動ケチャップお絵かき機が自宅にあれば、家にいながら、憧れのあの子がオムライスにお絵かきしてくれるんです!!!
もはや、その子と同棲してるも同じなのでは…???
②メイド文化のアーカイブ
メイドさんのケチャップ絵を再現するには、当然、「メイドさんが描いたケチャップ絵」を収集・保存しなくてはなりません。
そして、「メイドさんが描いたケチャップ絵」を収集・保存するということは、メイド文化のアーカイブをつくるということです
全自動ケチャップお絵かき機の登場により、現代日本のメイド文化を、未来にも継承しようという動きが現れるかもしません。
往年のジャズナンバーを収録したレコードが国会図書館に所蔵されているように、カリスマメイドのケチャップ絵が国会図書館にアーカイブされるようになるかもしれないのです。
③100年前の伝説のメイドとお絵かきセッション!
全自動ケチャップお絵かき機を使って、ジャズのセッションのように、100年前に引退した伝説のメイドと、今をときめくカリスマメイドが、ケチャップお絵かきのセッション!
…このように夢が無限大な全自動ケチャップお絵かき機、あなたも一台つくってみませんか?
お役立ちリンク集
Ultimaker 2 Extended+
Ultimaker Cura 3
Discov3ry
インスパイアされた動画
UltimakerとDiscov3ryを使い、チョコレートで似顔絵を描く動画
www.youtube.com