LoginSignup
2
2

More than 5 years have passed since last update.

DurovisDiveにリセット機能を付ける

Last updated at Posted at 2014-12-26

自作スロットIN系HMDコンテンツの欠点は入力デバイスがPCほどリッチではないことなのだ、ならばどうする。

…というわけで、どうしてます?

そんなこと言われても

なんの話だよって思われるでしょうが。

なにかとOculus勢と比較される自作スロットIN系HMD界隈ですが。
いや、勝手に目の敵にしていて、あちらさんは目にもくれてない感もありますが。
いや、勝手に目の敵にしているのは僕だけかもですが。

Oculus界隈の話題はそれ単体というより、+αである操作デバイスに比重が偏りつつある感があるのも一つの事実。

だって、Oculusっていわばディスプレイであって、無理やりやれば出来ないこともないけど決して入力デバイスではないので。
なので、LeapMotionKinectMyoRing(笑)など、数多の入力デバイスとの連携が研究されているわけです。

それを踏まえて

自作HMD界隈は正直+α入力デバイスは現実的ではないのです。
なぜなら、タオバイザーやGoogleCardBoardのようにヘッドマウントはしておらず、手で支える系が主流なので。

そこで使えそうな入力デバイスは

  1. 画面をどこでもいいのでタップ(タオバイザーやハコスコにある下から指を入れる卑猥な窓使用)
  2. Googleさんによって掘り起こされた マグネットスイッチ

の2つにほぼほぼ絞られてしまう現状。

うわっ…? 私の入力デバイス少なすぎ…?

イメージでいうと、こんな感じ
StrongEnter

もう、でっかいエンターキーがあるくらいのイメージ。

では、その貴重なスイッチを何に割り当てるのが正解なのか?

それは誰にもわからない

・・・けど、僕が今考える最適な使い方を紹介したいと思います。

それは、リセット機能です。

はい、そこ「えー」とか言わない。

GoogleCardBoardやDurovisDiveのコンテンツを試した方は大体わかると思うんですが、

・スマホでコンテンツ起動してから、スロットインして、覗いたらあらぬ方向を向いている。
・飲み会の席なので、コースター系アプリを誰かに試してもらっていて、興味を持ってくれた向かいの人にそのまま渡したら逆走(後ろを向いている)事になっている。
・なにかの拍子でヨードリフトをし始めて、かってに画面グルグル。 収まった頃にはやっぱりあらぬ方向を向いている。

が多すぎるのです。

なので、リセット機能とは言いましたが実はダブルミーニングで

・コンテンツリセット(本当に起動直前に戻る)

・端末向きリセット(今向いている方向を初期方向とする)

のどちらかが熱いのです! 今回押したいのはこの端末向きリセットです(長い前振りでしたね・・・)

端末向きリセット(Unity+DurovisDiveSdkの事例)

まず、最低限こんな感じのスクリプトを用意します。

[AngleAdjuster.cs]

using UnityEngine;

public class AngleAdjuster : MonoBehaviour {
    private OpenDiveSensor openDive;
    private static Quaternion targetRotation = Quaternion.identity;

    void Start () {
        transform.rotation = targetRotation;
        openDive = GameObject.FindObjectOfType<OpenDiveSensor>();
    }

    void Update () {
        if(Input.anyKey)RotReset();
        transform.localRotation = Quaternion.Lerp(transform.localRotation, targetRotation, 0.1f);
    }

    public void RotReset(){
        if (openDive == null) return;
        targetRotation = Quaternion.Euler(0, -openDive.gameObject.transform.localRotation.eulerAngles.y, 0);
    }
}

そして、
無題.png
のように空GameObjectを作って、先ほどのスクリプト(AngleAdjuster)をアタッチ

無題.png

のように、Dive_Cameraプレハブを先ほど作ったGameObject(Player)の子にして、
1. Add_rotation_gameobjectにチェック
2. Rotation_gameobjectに親GameObject(ここではPlayer)を指定

です。

やっていることは何かタッチされたらOpenDiveSensorが向いている方向を取って、それが相殺するようにy軸を回転させているだけで
(既に45度の方向を向いていたら、その親Objectを-45度向かせて0度(正面)を向かせる感じ)正直、それくらい最初から用意しておいてくれよって思うんですがねー。

そういえばふと思ったんだけど、マグネットスイッチってダブルタップ(?)や長押しって取れるんですかね。 それだけでも大分助かるんですが。今度試します。

まぁそんなことよりも

そしてもっとみんなコンテンツ作ろうぜ! そして僕を楽しませておくれ!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2