トップ 一覧 検索 ヘルプ 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 として取得できます。
{{ref_image android_gyro_20140508.png}}
ただし、初期の姿勢は上記画像のようにはなっていないようです。

 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にはならなかったりしますのでそれの補正としては、
地面に水平にモバイル端末を置いても、わずかに-9.8にはならなかったりしますので それの補正としては、
 Vector3 gravityV = Input.gyro.gravity;
 Vector3 gN = gravityV;
 gN.Normalize();
 float angle = Vector3.Dot(gN, Vector3.back);  // -Z方向との角度差を計算.
 if (angle < 0.97f) {
    // 外力を加える処理を行う.
 }
のようにするなど。

----
{{lastmodified}}