javascriptでデバイスの向きと加速度を取得
javascriptでデバイスの向きとか加速度を取得してみた。
DeviceOrientation Event Specification
上記ドラフトによると
- デバイスの向きは、deviceorientationイベントで取得
- 西向き、画面は上で水平な平面にデバイスを置いた場合の値は、{alpha: 90, beta: 0, gamma: 0}
- デバイスの加速度は、devicemotionイベントで取得
- 画面は上で水平な平面にデバイスを置いた場合、加速度はすべてゼロ、重力加速度は{x: 0, y: 0, z: 9.81}
- 画面はずっと上で向きも変わらずに自由落下した場合、加速度は{x: 0, y: 0, z: -9.81}、重力加速度はすべてゼロ
※compass部分は飛ばしました
以下、ソース。
デフォルトだと加速度の桁数がパナいので、小数点以下3桁のみ表示
window.onload = function(){ // デバイスの向きを取得 window.addEventListener("deviceorientation", function(e) { e.preventDefault(); document.getElementById("oinfo").innerHTML = "alpha: " + parseInt(e.alpha) + " beta: " + parseInt(e.beta) + " gamma: " + parseInt(e.gamma); }, true); // デバイスの加速度、重力加速度、回転速度を取得 window.addEventListener("devicemotion", function(e) { var a = e.acceleration; var g = e.accelerationIncludingGravity; var r = e.rotationRate; document.getElementById("ainfo").innerHTML = "X: " + a.x.toFixed(3) + " Y: " + a.y.toFixed(3) + " Z: " + a.z.toFixed(3); document.getElementById("ginfo").innerHTML = "X: " + g.x.toFixed(3) + " Y: " + g.y.toFixed(3) + " Z: " + g.z.toFixed(3); document.getElementById("rinfo").innerHTML = "alpha: " + r.alpha.toFixed(3) + " beta: " + r.beta.toFixed(3) + " gamma: " + r.gamma.toFixed(3); }, true); };
[html]
<!-- 表示用に準備 --> <p>デバイスの向き</p> <p id='oinfo'></p> <p>加速度</p> <p id='ainfo'></p> <p>重力加速度</p> <p id='ginfo'></p> <p>回転速度</p> <p id='rinfo'></p>
こんな感じ↓
結果、デバイスの向きは意図通り、傾けた方向によって値が変化。
加速度センサー周りについては、机の上に置きっぱにしても常に変動していてせわしない感じ。
まあ、地球はうごいてるからね。。。という冗談はさておき、実用するなら、閾値で切るなりしないとだめそうという感じですかね。