全体表示

[ リスト ]

ちょっとセンサー周りで、リファレンスが判りにくかったり、なんだか経験則みたいな(リファレンスもだが)感じでの解説が多かったので、自分なりに理解したのを図にして残しておきます。検証はしましたが、間違っているかもしれないので使用時は再確認等などお願いします。


-☆-

SensorManagerのメソッド、remapCoordinateSystem()リファレンスでも、これの第二引数と第三引数は
Using the camera (Y axis along the camera's axis) for an augmented reality application where the rotation angles are needed:
remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);
等としていて、結局何がどうなればいいのか直感的にわからない。色々調べた結果、つまりこういうこと。


イメージ 1


まず、実世界の軸を「ワールド軸」とします。この軸は、X軸プラスが東向き、Y軸プラスが北向き、Z軸プラスが上空となる軸です。
次に、アンドロイド端末ローカルの軸を「デバイス軸」とします。これは、端末の上方向をY軸プラス、端末の右方向をX軸プラス、画面から飛び出す方向をZ軸プラス、となる軸です。ここで、端末の上方向とは、別にアプリで横画面固定だから、などとアプリは関係なく、縦持ちしたときに上になる方向です。Android端末は逆さにしても画面反転しないので判ると思います。その状態での右、手前、となります。


-☆-

で、センサーで得られるPitch(X軸回転)、Roll(Y軸回転)、Azimuth(Z軸回転)の値は、ワールド軸とデバイス軸を一致させたときに全て0となります。つまり、デバイスの上側が北、右側が東、画面が上空を向いている時ですね。北・東・上が基準となります

まあ全てのアプリがこれを基準にすればいいのですが、たとえばカメラとかは横画面が基準なので、いちいち計算して出したRoll の値をまた弄らないとなりません。そこで、基準となるデバイスの軸の向きを変更するために、remapCoordinateSystem() を使用するのです。

ここまではいい。

で、件の第二、第三引数に渡す、AXIS_X とかはどうやって出せばいいのか。
これは上図右側のように、自分が基準としたいデバイスの向きでの軸が、ワールド軸の基準である「北・東・上」のどれに対応するか、というのを伝えてやればいいのです。

たとえば図のように、横向きにした場合。
 デバイス軸のX軸はワールド軸のZ軸
 デバイス軸のY軸はワールド軸のX軸の逆向き
になっています。これを伝えてやればいいのです。第二引数がデバイスX軸、第三引数がデバイスY軸がなにになるか、なので、この場合引数は
 remapCoordinateSystem( inR, SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X, outR );
となります。これで、横向きにして北を向いたとき、ロールなどの値が0になります。

-☆-

リファレンスの解説に「かめらのじくをぉ〜うえにしてぇ〜そのときは〜AXIS_Xぅ?ってかんじ〜?」とか書く暇があったらこれ位の解説入れとけボケ。図一枚でいいじゃねえかっ!

-☆-

これを書いたあと、ツイッターのフォロワー氏から「なんかソースのヘッダコメントに同じような解説があった」という情報をいただきました。同氏が探してくれたソースを見たところ、AAつかった渾身の力作に思わず涙が……。しかも2.3以降では削除されているそうですよ。真実を記したから消されたのでしょうか。やべえこのブログも削除さr

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(0)


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事