【Oculus Quest】Oculus Touch Controllerを懐中電灯にする

概要

  • Oculus Questアプリに、Oculus Touch Controllerの動きに追従する懐中電灯を導入する

f:id:ozdasu:20190622214904g:plain

環境

  • Oculus Quest
  • Oculus Touch Controller
  • Unity 2018.4.0f1
  • Oculus Integration for Unity

セットアップ

シーンにCubeとPlaneを追加

f:id:ozdasu:20190622225545p:plain

空間を暗くする

効果を分かりやすくするため、以下の手順で空間を暗くする

  1. Directional Lightを削除
  2. Asset「10 Skyboxes Pack : Day - Night」をダウンロード&インポート。その中にある「SkyMidnight」をSkyboxに設定

assetstore.unity.com

f:id:ozdasu:20190622225736p:plain
暗くなった

懐中電灯を用意する

Asset「Flashlight」をAsset Storeよりダウンロード&インポート

assetstore.unity.com

シーンにOVRPlayerControllerを追加

  1. OVRPlayerControllerをシーンに追加
  2. Main Cameraを削除

シーンにOVRControllerPrefabを追加

OVRControllerPrefabをRightControllerAnchor配下に追加
(懐中電灯を右手に持ちたい場合。左手に持ちたい場合、LeftControllerAnchor配下にする)

f:id:ozdasu:20190622223550p:plain

Touch Controllerと懐中電灯を紐付ける

  1. OVRControllerPrefab配下に、Flashlight(懐中電灯のモデル。Flashlight > Model 配下にある)を追加 f:id:ozdasu:20190622222644p:plain

  2. Flashlightを適切なポジションに回転させる f:id:ozdasu:20190622225030p:plain

OculusTouchForQuestAndRiftSRightModelのメッシュレンダラーを削除

このままだと、懐中電灯にくわえ、Touch Controllerも表示されてしまう
そこで、OculusTouchForQuestAndRiftSRightModelのインスペクターより、メッシュレンダラーを削除する

f:id:ozdasu:20190622201937p:plain

これで懐中電灯のみが表示されるようになる

懐中電灯に光源を設定する

  1. Flashlighにスポットライトを追加
    f:id:ozdasu:20190622224149p:plain

  2. スポットライトを懐中電灯の向きと一致するよう回転させる f:id:ozdasu:20190622224928p:plain

完成

Oculus Touch Controllerを上下左右に動かすと、懐中電灯と、そこから発せられる光が追従する f:id:ozdasu:20190622214904g:plain

参考

「VR妄走」大好きなあの子とVRで一緒にランニングしてみた!

f:id:ozdasu:20190613203639p:plain

「VR妄走」CM

「VR妄走」のコンセプトが一発で分かるCMです!
(注:実際にはプレイエリア制限があり、動画のように縦横無尽には走れません)

目次

概要

「大好きなあの子と一緒なら、キツい運動も楽しくなるのでは…?」という発想から、VR空間で葵さん(僕が応援している女優)と一緒にランニングができるOculus Questアプリ「VR妄走」をつくった

f:id:ozdasu:20190428154341j:plain
叩き台となったイラスト

「VR妄走」の機能

  • 葵さんと一緒に走れる
  • 10分に1回、葵さんが音声で励ましてくれる

使用したツール

  • Oculus Quest
  • Unity 2018.4.0f1
  • Blender 2.79b

Oculus Quest

f:id:ozdasu:20190618190127j:plain

  • 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」で葵さんの頭をつくる

元画像

f:id:ozdasu:20190521215013j:plain

結果

髪は後からつけたもの f:id:ozdasu:20190521215118p:plain

生成したメッシュとアバターをFBX exportし、Blenderにimportする

胴体をつくる

f:id:ozdasu:20190618200401p:plain
MoxRig(胴体のみ)

頭と胴体のメッシュを結合

f:id:ozdasu:20190618200620p:plain

モデルが完成。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)) // TouchControllerButton.Oneが押されていれば
        {
            // Animator ControllerのisIdleパラメーターをFalse、isRunパラメーターをFalseに
            aoiAnimator.SetBool("isIdle", false);
            aoiAnimator.SetBool("isRun", true); 
            Invoke("MoveFoward", 2.0f); 
        } else { // TouchControllerButton.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を用いる

f:id:ozdasu:20190618185041j:plain f:id:ozdasu:20190618184728p:plain

TouchControllerのButton.Oneを押すと葵さんとプレイヤーが走り、離すと止まる

       OVRInput.Update();

        if (OVRInput.Get(OVRInput.Button.One)) // TouchControllerButton.Oneが押されていれば
        {
            // Animator ControllerのisIdleパラメーターをFalse、isRunパラメーターをFalseに
            aoiAnimator.SetBool("isIdle", false);
            aoiAnimator.SetBool("isRun", true); 
            Invoke("MoveFoward", 2.0f);  // 2秒後に実行
        } else { // TouchControllerButton.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(走行時)」を利用

Animator Controller

  • 開始時はIdleアニメーション
  • isRunがTrueならRunアニメーションを開始
  • isIdleがTrueならIdleアニメーションを開始

f:id:ozdasu:20190618184116p:plain

③「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;
        }
    }
}

④完成

f:id:ozdasu:20190618204634g:plain

課題

  • VR酔い対策
    • プレイヤーの身体を表示する
  • 葵さんの身体を人間にする
  • TouchControllerのボタンではなく、プレイヤーの動きによってインタラクションを起こしたい

ソースコード

参考文献

Oculus

Oculus Quest

Oculus Go

Unity

VR

  • VR概要 - Unity
  • UnityによるVRアプリケーション開発(オライリー・ジャパン)

アニメーション

オーディオ

定期実行

Avater Maker

Blender

「全自動ケチャップお絵かき機」をつくってみた

全自動ケチャップお絵かき機ってなに?

まずは動画をご覧ください。
企画趣旨、動機、ざっくりした制作の流れがまとまってます。

企画趣旨

「女優の高山葵さんがオムライスに描いたケチャップ絵」を3Dプリンタで再現する

機材・材料

  • Ultimaker 2 Extended+(3Dプリンタ)
  • Ultiimaker Cura 3
  • Discov3ry
  • GIMP
  • 「高山葵さんがケチャップで絵を描いたオムライス」の画像
  • ケチャップ
  • まな板

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をインポート

ファームウェアのアップデート

③Discov3ryをUltimaker 2 Extended+に接続

E1ポートからMK2 Extruderのケーブルを抜く

E1ポートにDiscov3ryのケーブルを接続する

④ノズルアタッチメントをUltimaker 2 Extended+のプリントヘッドに取り付ける

⑤カートリッジの準備

チューブの端をノズルアタッチメントの穴に通し、チューブにノズルを取り付ける

チューブのもう一方の端をカートリッジに取り付ける

カートリッジにケチャップを装填

Discov3ryにカートリッジをセット

⑥Perge

Pergeとはカートリッジに充填された素材をチューブの先端まで送り、出力の準備を整えること

Perge失敗

Ultimaker 2 Extended +でPerge開始の操作をするも、いつまでたっても何も起こらない。
そこで、Structur3D Printingのフォーラムに同様の問題が報告されていないか探したところ、いくつかの投稿を見つけた。

六角レンチを挿す

投稿をもとに試行錯誤した結果、六角レンチを挿し忘れていたことが原因だと分かった。

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