傾きセンサー (モバイル)
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秒