チカラの技術

電子工作やプログラミング

Getting over it用ハンマー型コントローラーを作ってプレイしました。

お久しぶりです、元気です!

動画

まずは動画をご覧ください。

www.nicovideo.jp

youtube(英訳版)

内容について

  • 出演者
     動画最後のクレジットにありますが、動画中の男性は私(ヌル夫)ではなく知人の立本さんです。
     お願いして出演して頂きました。
     (協力の雨草さんには動画編集の講評をして頂きました)  f:id:powerOfTech:20181015222301j:plain

  • Getting Over Itのプレイスキル
     私は(マウスでのプレイで)クリア281回、最短タイムは3分48秒です。
     参考のため、プレイ動画をアップロードしています。
     動画中で思い切りくつろぎながらクリアしていましたが、
     実際タイムアタックするとき以外はあんな感じです。
     なお、立本さんは初心者です。

  • 操作者について
     上記のプレイスキルの差もあり演出上、動画前半では私が背後で操作している場面もあります。
     ただ、当然ですが最後のプレイ部分(3分34秒~)は全て立本さんがプレイしていて
     フェイクは一切ありません。

  • コントローラーについて
     Getting Over It用ハンマー型コントローラーとして実用レベルに出来たと思っています。
     ハンマー移動の応答性や精度はもちろん、ボタン機能の追加により
     「この機能が無いから進められない(使えない)」というプレイヤー側の言い訳を全て潰しています。
     そう、このコントローラーでクリアできないのはただスキルが足りないだけなのです。 (自戒)
     なお、現時点のハンマーでのプレイは私がやっても立本さんと似たような進み具合です。
     とにかく体力と気力の消費が半端ではなく、マウスとは桁違いの難易度です!!(嬉)

技術解説

まず、VIVEトラッカーの使用方法についてはツボクラボさんの記事が非常に良くまとまっています。
 HTC Vive Trackerの仕様・使い方まとめ | TsubokuLab - ツボクラボ

上記と公式の開発者ガイドラインを参考にしました。
 VIVE™ | VIVE Tracker For Developers

ハードウェア編

外側の工作部分です。
f:id:powerOfTech:20181009233301p:plain

補足:

  • スタイロフォームは塗料を弾くので、ジェッソを下塗りしてから塗装しています。
  • 塩ビ管も塗料を弾くので、プライマーのミッチャクロンを使用してから塗装しています。
  • リードスイッチの樹脂ポッティングを軟らかいシリコーンとした理由は、衝撃吸収、
    それからガラスと樹脂の熱膨張の差で応力割れが発生することを防ぐためです。
想定される質問への回答

Q: 他の方式のセンサーは考えなかったの?

A:以下のように検討しました。

センサー案 検討内容 評価
ジャイロ 平行移動に反応しない ×
加速度センサー ハンマーが持ち手の軸周りに回転したときにX,Y,Z軸が分からなくなる。 ×
加速度センサー

地磁気センサー
ハンマー先端の天地方向が分からない。
(振り回している間に掛かる加速度と地球重力の判別がつかない)
×
webカメラと画像処理 ハンマーの木肌と操作者の肌色が識別できない。 ×
IRスキャナと反射材
Nintendo Labo方式)
IRスキャナの入手が困難
ルームスケールVR センサーサイズは大きいが、その他の条件は満たす。

 今回の用途ではVIVEトラッカーが適してると考えて選定しました。
 もし、お勧めのセンサーがあればコメント頂ければ幸いです!

Q: なぜ本物の(鉄の)ハンマーで作らなかったの?

A:危険だからです。
  f:id:powerOfTech:20181011040808j:plain:w300
 また、賃貸の部屋がボコボコになってしまいます。
 これは余談ですがハンマーコントローラーを立って使用するのは絶対に止めましょう
  f:id:powerOfTech:20181011121515j:plain:w300

Viveトラッカーのハンマー接続部分

Viveトラッカーと本体は1.27mmピッチのコネクタ経由で接続されます。 f:id:powerOfTech:20181009233942p:plain:w500

接続についてはスマロボ技術部ブログさんを参考にさせて頂きました。
HTC Vive Tracker をチョットダケハックした話 | スマロボ技術部ブログ

ハンマー内部バネ

f:id:powerOfTech:20181011200038p:plain

「ジャンプしてる感」と「ブースト機能」の両立の為にはどうしても必要な部品だったので、ここはこだわりました。
大サイズのバネはあまり市場に出ておらず、適切な弾力とサイズのモノを見つけるまで相当探し回りました。
最初はホッピングマシーンを分解して手に入れようと企んでトイザらスハードオフを物色して巡っていましたが
最終的にはコーナンで理想のバネ単品を見つける事が出来ました。ホームセンターは偉大。

ソフトウェア編

Getting Over Itはマウスの移動のみで操作するゲームです。
VIVEトラッカーの移動をマウスの移動に変換するプログラムをUnityで作成しました。

機能ブロック図

以下のように3ステップで変換しています。

f:id:powerOfTech:20181011141721p:plain

ソースコード

コードの中でも特にWindws API周りのプログラムが(OSの32bit系,64bit系の違いが原因で)
ネット上の情報のままでは動かなかったので、ここに改良したコードを抜粋します。
( 私の環境はwindows10 [64bit] + Unity [64bit] )

関数と変数の定義

    // マウスイベント(mouse_eventの引数と同様のデータ)
    struct INPUT
    {
        public int type;
        public InputUnion u;
    }

    [StructLayout(LayoutKind.Explicit)]
    struct InputUnion
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public System.IntPtr dwExtraInfo;
    }


    // キー操作、マウス操作をシミュレート(擬似的に操作する)
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

    private const int INPUT_MOUSE = 0;                  // マウスイベント
    private const int INPUT_KEYBOARD = 1;               // キーボードイベント
    private const int INPUT_HARDWARE = 2;               // ハードウェアイベント

    private const int MOUSEEVENTF_MOVE = 0x1;           // マウスを移動する
    private const int MOUSEEVENTF_ABSOLUTE = 0x8000;    // 絶対座標指定
    private const int MOUSEEVENTF_LEFTDOWN = 0x2;       // 左 ボタンを押す
    private const int MOUSEEVENTF_LEFTUP = 0x4;         // 左 ボタンを離す
    private const int MOUSEEVENTF_RIGHTDOWN = 0x8;      // 右 ボタンを押す
    private const int MOUSEEVENTF_RIGHTUP = 0x10;       // 右 ボタンを離す
    private const int MOUSEEVENTF_MIDDLEDOWN = 0x20;    // 中央ボタンを押す
    private const int MOUSEEVENTF_MIDDLEUP = 0x40;      // 中央ボタンを離す
    private const int MOUSEEVENTF_WHEEL = 0x800;        // ホイールを回転する
    private const int WHEEL_DELTA = 120;                // ホイール回転値

 
関数の使用 (MoveLeftRightとMoveUpDownがマウス移動量)

//マウス操作量の指定
        var inputs = new INPUT[]
           {
                new INPUT
                {
                    type = INPUT_MOUSE,
                    u = new InputUnion
                    {
                        mi = new MOUSEINPUT
                        {
                            dwFlags = MOUSEEVENTF_MOVE,
                            dx = MoveLeftRight,
                            dy = MoveUpDown,
                            mouseData = 0,
                            dwExtraInfo = (System.IntPtr)0,
                            time = 0,
                        }
                    }
                }
           };
        // マウス操作実行
        SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
GUI

Unityの開発画面です。画面左下のようにデバイス選択や操作軸の反転などの
プレイ前設定ができるGUIも作っています。
f:id:powerOfTech:20181011123157p:plain

VIVEトラッカーのポゴピンが利用できない問題

私が開発していた2018年9月時点のバージョンのSteamVRでは ポゴピン(pogo pin)が全く効かないという
不具合があり、海外のコミュニティでも取り上げられていました。
解決方法ですが、図の通りSteamアプリ(SteamVRではない)からダウングレードします。
f:id:powerOfTech:20181011125600p:plain

まとめ

まとめます。

  • Getting Over Itのプレイがマウスでは物足りなくなったのでハンマー型のコントローラーを作った。
  • 実際プレイすると物凄く疲れるし非常に難しい。よって目的は達成できた。
  • このコントローラーが量産され、e-sportsとして大会が開かれている夢を見た。
  • Getting Over Itは無限に楽しめる神ゲー!!

万一これで遊びたいという(かつVIVE環境の有る)気合の入った猛者が居たら
神奈川県からの賃与も含めて検討したいと存じますのでnuruwo999あっトマーくgmail.comまで連絡頂ければと存じます。 (この告知が消されるまでは受付します)

以上です。