LoginSignup
127
120

More than 5 years have passed since last update.

UnityでiOSのジャイロの使い方をちゃんと説明する

Last updated at Posted at 2014-05-19

UnityでiOSのジャイロ使おうと思って調べたところ、
「Input.gyro.attitudeでQuatenionで取れまっせ」ってのは出てくるんだけど
ちゃんと座標系について説明してるところが見つけられなかったので
ふにゃふにゃ書いてみる

座標系の違い

iOSの座標系はiPhoneだとこう
Screen.orientation == ScreenOrientation.Portrait の場合。Screen.orientationの値によってかわるので注意)
s_iphone2.jpeg

Unityはお馴染みのこれ
unity.jpg

注目ポイントは2点

  • 座標系が右手系と左手系
  • 無回転な標準状態がiPhoneを置いた状態。Y軸ではなくZ軸が重力の反対方向

座標系の変換

今回はiOSのカメラが向いている方向をUnity上のZ軸として扱いたかったので
こういう変換を行いたい

s_iphone2.jpegs_iphone3.jpeg

右手系左手系

iOSは右手系、Unityは左手系なので変換が必要
なのだけど、ここなんとなくやっててちゃんと説明してるとこあんまなかった

大事なのは 右手系→左手系の変換は一律決まった操作ではない ってこと

Quaternionの右手系左手系変換でよりわかりやすいのはXYZのどれか一軸を正負反転させる
どの軸を反転させるかは用途に応じて自分で決める必要がある

今回はZ軸を反転させる

が、今回は無回転状態を揃えるためにY軸とZ軸を入れ替える操作を行う

Quaternionで変換

Quaternionの定義は

$回転軸V(n_x,n_y,n_z)まわりにθ度の回転を、$

$Q(x,y,z,w)$
$x=n_x*sin(θ/2)$
$y=n_y*sin(θ/2)$
$z=n_z*sin(θ/2)$
$w=cos(θ/2)$

$と表したもの$

なので、 YZ軸入れ替えはq.yq.zを入れ替える

・・・だけではなく、

右手系と左手系では軸周りの回転方向も反対になるので θ*=-1f な操作も必要
これはsin()にしか影響ないので、

YZ軸入れ替えは

var q = Input.gyro.attitude;
var newQ = new Quaternion(-q.x, -q.z, -q.y, q.w);

となる

これで座標系揃った!

無回転状態をあわせる

上記変換で以下のようになった
s_iphone2.jpegiphone5.jpg

まだカメラの向き=Z軸という無回転状態にできていない
これはUnity上で無回転のときにZ軸が下を向くように先にX軸回転しとけばよい
transformの親子関係でやっちゃってもいいけど、このために空のGameObjectを置いとくのもアレなので、
計算で求めちゃう

q *= Quaternion.Euler(90f, 0f, 0f);

これで出来た!

まとめると

var rotRH = Input.gyro.attitude;
var rot = new Quaternion(-rotRH.x, -rotRH.z, -rotRH.y, rotRH.w) * Quaternion.Euler(90f, 0f, 0f);

transform.localRotation = rot;

こんな感じでiOS端末の向きに追従するGameObjectができる!

127
120
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
127
120