僕のYak Shavingは終わらない

車輪の再発明をやめたらそこには壮大なYakの群れが

webkitCompassHeadingでSafariからでも電子コンパスの情報を取得可能。ただしiOS 5.0 以上から。

https://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html#//apple_ref/javascript/instp/DeviceOrientationEvent/webkitCompassHeading

↑はAppleのドキュメント。
最初「safari 電子コンパス」とかでぐぐっても全然出て来なかったが、Document読んでいたら出てきた。

ドキュメントにもありますが、safariでも加速度センサとジャイロスコープの情報は取れるのですが、実世界の情報とはマッチせず毎回方位はリセットされてました。

星を眺めるアプリをつくっていたのでこれでは使えないと思って調べたらwebkitCompassHeadingというものを発見。

あとは以下のようにすることによって、0がちゃんと北向きである情報を取得できます。iOS 5.0以上から。いや〜スマフォのブラウザでもなんでもできるようになってきましたね。

ところでiPhoneSafariWebGLに対応しないんですかね?それが揃えばもっと楽しくスピーディーにぐりぐりできるのにもったいないです。

// 以下みたいな感じにしてやるとセカイカメラとかStarWalkみたいなアプリみたいな感じで使えます。
// iPhoneの画面を横向きにしてかつホームボタンが右側にある状態を想定
var screen_azimuth;
var screen_elevation;
window.ondeviceorientation = function(event) {
    // 電子コンパスの情報を取得(0が北、90が東…)
    var w = event.webkitCompassHeading - 270;
    w = w < 0 ? 360 + w : w ; 
    // alphaは毎回0にリセットされるので値が0=北とは限らないので今回はおやすみ
    //var a = 360 - (event.alpha); 
    var b =(event.beta);
    // 真下を見たらg = -90°、真上を見たらg = 90°になるように変更
    var g = (-(event.gamma) - 90 );
    g = (g < -180) ? (g >= -270 ? g + 360 : g ) : g ; 
    g = (g > 90) ? 90 : ( g < -90 ? -90 : g );
    // グローバルな変数に代入して他の関数で使ったりすればいいと思います
    screen_azimuth = w ; 
    screen_elevation = g;
}