0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unityでスマホのジャイロを使ってアレコレ

Posted at

ご注意

注意!この記事の筆者はいろいろよくわかってないです
なんかよくわからんけど動いたからヨシ!となってます

準備

スマホ側

AndroidにUnity Remote 5 をインスコ

USBデバッグを有効化(例:シャオミ製スマホの場合)
] Unity Remoteアプリを開いて、PCとUSB接続して待機させておく。「USBデバッグを許可しますか?」には はい と答える。

PC側

Unity Hub > インストール > 任意のバージョンの右の歯車をクリック > 「モジュールを加える」 で Android Build Support を入れる

適当にプロジェクトを作り、File > Build Settings... から Android で「Switch Platform」(時間かかる)
Edit > Project Settings... から Editor タブ "Unity Remote" 以下 Device を「Any Android Device」にする(元はNone)。

スマホをunity上に出現させる

完成図
unity_gyro.gif

手に持っているスマホの傾きをUnity上で再現します。
まずはこんな感じに適当にスマホっぽい形の3Dオブジェクトを作ります。このとき、画面がカメラの方を向くように作ったほうがいいです(1敗)。つまりz方向に薄く、y方向に長くします。そのほうがなんかやりやすいです(小並感)。(最初画面が空を向くように設計したら、全く思った方向に回転できなくて挫折しました)
image.png

スクリプトを書く前に、パソコンのモニタがスマホからみてどっちの方角を向いているのか調べておきます。
スマホをモニタのほうに向けて、方位磁針アプリを起動します(Playストアに沢山あるので一つ選んでインストールします。位置情報へのアクセス許可を求められても拒否で構いません。)

例えば僕の環境では277°でした。

次にスクリプトを書きます。Scriptsフォルダを作って create > C# Script から"sumaho_gyro.cs"と名付けてダブルクリックします。次のコードをコピペしてもいいですが、下の方のQuaternion.Euler(90, 0, 277)となっているところの第三引数277はさっき得た数値にしてください。

sumaho_gyro.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//            ↓ここはファイル名と一致させる必要がある(1敗)
public class sumaho_gyro : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //ジャイロを有効にする
        Input.gyro.enabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        //クォータニオンとかいう4次元のベクトル。"ジンバルロック"が発生しないらしい(よくわかってない)
        Quaternion attitude = Input.gyro.attitude;
        //3D Object を回転させる。                         ↓この値は方位磁針アプリで測定した数値にする
        transform.localRotation = Quaternion.Euler(90, 0, 277) * new Quaternion(-attitude.x, -attitude.y, attitude.z, attitude.w);
    }
}

注意点
//            ↓ここはファイル名と一致させる必要がある(1敗)
public class sumaho_gyro : MonoBehaviour

について、最初ファイル名を変更せずに書き始めて、後からファイル名をつけていなかったことに気づきリネームしました。「スマホ」の3D Objectにスクリプトを適用しようとしたら

Can't add script component 'ファイル名' because the script class cannot be foumd.

な感じのエラーが出てちょっと悩みました。通常はファイル作成時のファイル名と同じクラス名になるのですが、うっかりリネームするとエラーになります。(例:NewBehaviourScript)

public class ファイル名 : MonoBehaviour

であることをしっかり確認しておきましょう。

また、(90,0,??)*new Quaternion(-x,-y,z,w) な感じに、90だったりxとyがマイナスだったりするのは、

https://vr-cto.hateblo.jp/entry/2016/05/02/070000

この記事にそう書いてあったからです。詳しく理解してないです。

書けたらHierarchyでスマホな3D Objectを選択し、Inspectorの空いてるところにスクリプトをドラッグ&ドロップして適用させます。Play(▶)ボタンを押すと、現実のスマホとunity内のスマホの傾きが同期していると思います。

スマホを傾けてARゲームみたいにする①

完成図
sumahoAR.gif
これは自身が中心に立っていてまわりをぐるぐる見回している様子です。「FPS」ですね。
こんな感じに適当にフィールドを作ります。座標(0,0,0)を中心に各方向へ±1の2x2x2の立方体です。中心がわかりやすいようにSphereを置いています。
image.png
Sphereと同じ位置にMain Cameraを持ってきます。これに、先程のsumaho_gyroのスクリプトを適用しただけで、AR(VR)な感じになります。

スマホを傾けてARゲームみたいにする②

分かりづらかったのでテーブルをつけてみました。
sumahoAR2.gif
先ほどと違い、カメラ自体の位置が変化しています。「TPS」ですね。中心のSphereをに追従するように、なめ回すような視点で観察できます。カメラを俯瞰で見るとこんな感じです。
sumahoAR2_shousai.gif
イメージとしては見えない球体表面に沿って移動している感じでしょうか。
新たにcamera_gyro.csを作って次を書き込みます。

camera_gyro.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camera_gyro : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Input.gyro.enabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        Quaternion attitude = Input.gyro.attitude;
        transform.localRotation = Quaternion.Euler(90, 0, 277) * new Quaternion(-attitude.x, -attitude.y, attitude.z, attitude.w);
        //ここまで同じ

        //UnityのInspectorに出てくるRotationと同じ値を取得
        float rotx = transform.localRotation.eulerAngles.x;
        float roty = transform.localRotation.eulerAngles.y;
        float rotz = transform.localRotation.eulerAngles.z;

        //y軸まわり(左右)について、中心からの位置を一定にする
        float x = -Mathf.Sin(roty * Mathf.PI / 180);
        float z = -Mathf.Cos(roty * Mathf.PI / 180);

        //x軸まわり(上下)について、中心からの位置を一定にする
        float y = Mathf.Sin(rotx * Mathf.PI / 180);
        x *= Mathf.Cos(rotx * Mathf.PI / 180);
        z *= Mathf.Cos(rotx * Mathf.PI / 180);

        //カメラの位置を変更して中心を見つめる
        transform.localPosition = new Vector3(x, y, z);
    }
}

Main Cameraに適用します。
先ほどは一人称でVRっぽかったですが、こちらは三人称でARっぽいですね。
今回はジャイロだけを使っていくつか作ってみました。
加速度とかカメラとかと組み合わせて使うと面白そうですね

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?