トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_script_gyro_mobile

傾きセンサー (モバイル)


2014/05/07段階では、Androidのみ検証。iOSはまだ。

スマートフォンやタブレットを傾けた場合に傾きを検出するセンサーとして「ジャイロ(gyro)」があります。加速度センサー(acceleration)と混同しがちなので注意。

はじめに、MonoBehaviour派生クラスのStart関数が呼ばれたときに

Input.gyro.enabled = true;

のように、明示的にジャイロの使用を指定する必要がありました。これがないと、なぜかandroidで傾き情報は取得できず。

Quaternion q = Input.gyro.attitude;

とすることで、ジャイロでの傾きをQuaternion として取得できます。

ただし、初期の姿勢は上記画像のようにはなっていないようです。

Quaternion q = Input.gyro.attitude;
Quaternion qq = Quaternion.AngleAxis(90.0f, Vector3.left);
this.transform.localRotation = qq * q;

のように自分自身の回転値を指定するとY方向を上を向きますが、あってるか自信なし。

 カメラを傾きセンサーで追従させる(モバイル端末を地面に垂直に立てて構える場合)


使用用途としては、カメラで撮影した映像と3D空間の合成/ARなど。
Update関数内で

Quaternion q = Input.gyro.attitude;
Quaternion qq = Quaternion.AngleAxis(-90.0f, Vector3.left);
q.x *= -1.0f;
q.y *= -1.0f;
m_camera.transform.localRotation = qq * q;

のようにすると、m_cameraがCameraのGameObjectであるときに、モバイル端末を傾けることで追従。

 傾きで玉を転がすゲームなどの場合(モバイル端末を地面に水平に構えた場合)

private GameObject m_sphere;
void Start() {
  // シーン上のSphere名義の球のGameObjectを保持.
  m_sphere = GameObject.Find("/Sphere") as GameObject;
}

void Update() {
  // ジャイロから重力の下向きのベクトルを取得。水平に置いた場合は、gravityV.zが-9.8になる.
  Vector3 gravityV = Input.gyro.gravity;

  // 外力のベクトルを計算.
  float scale = 10.0f;
  Vector3 forceV = new Vector3(gravityV.x, 0.0f, gravityV.y) * scale;
  
  // m_sphereに外力を加える.
  m_sphere.rigidbody.AddForce(forceV);
}

モバイル端末を地面に仰向けで置いた場合に「Input.gyro.gravity」でVector3のz成分として-9.8が返ってきます。
これより、重力方向以外の成分を元に力を計算。
これを物理形状に外力として与えることで端末を傾けると移動、が実現できます。

地面に水平にモバイル端末を置いても、わずかに-9.8にはならなかったりしますので それの補正としては、

Vector3 gravityV = Input.gyro.gravity;
Vector3 gN = gravityV;
gN.Normalize();
float angle = Vector3.Dot(gN, Vector3.back);  // -Z方向との角度差を計算.
if (angle < 0.97f) {
   // 外力を加える処理を行う.
}

のようにするなど。


最終更新時間:2014年05月09日 15時48分18秒