!!!傾きセンサー (モバイル) 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にはならなかったりしますので それの補正としては、 Vector3 gravityV = Input.gyro.gravity; Vector3 gN = gravityV; gN.Normalize(); float angle = Vector3.Dot(gN, Vector3.back); // -Z方向との角度差を計算. if (angle < 0.97f) { // 外力を加える処理を行う. } のようにするなど。 ---- {{lastmodified}}