- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!傾きセンサー (モバイル)
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}}