強火で進め

このブログではプログラム関連の記事を中心に書いてます。

今月号(2011年 01月号)のInterfaceは立体視特集

今月号(2011年 01月号)のInterface(インターフェース)が立体視特集との話を聞いたので久しぶりに購入。OpenGL ESで立体視の画像を作る方法の記事とか載ってました。これは良い買い物をした。

Interface (インターフェース) 2011年 01月号 [雑誌]

Interface (インターフェース) 2011年 01月号 [雑誌]

内容は立体視についての話は立体視の装置でなぜ立体に見えるのかなどしっかりと根本の部分から解説がされていました。その他にOpenGL ESで立体視向けのプログラムの作り方のサンプルなど有り、基礎から実践的まで網羅した内容となっていました。

後、高度なゲーム関連の技術情報などを書かれている西川善司さんなども記事を書かれてました。流石、日頃あれだけ高度な技術について書かれておられるだけに立体視についてとても分り易い解説でした。

(善)力疾走 | 「インターフェース」誌で3D記事を執筆しました
http://www.z-z-z.jp/BLOG/log/eid667.html

こちらのページで各章の最初の1ページがサンプルとして公開されています。

2011年1月号 目次|Interface
http://www.kumikomi.net/interface/contents/201101.php

iPhoneのSafariで加速度センサーを使う


iOS 4.2から加速度センサーをSafari上で使用出来るようになったみたなので以前作成したこちらのサンプルをiPhone向けに移植してみました。

Firefox 3.6から搭載の加速度センサーで画像を動かすサンプルを作ってみた - 強火で進め
http://d.hatena.ne.jp/nakamura001/20100123/1264234259

仕様書を確認したところほぼ同じ記述で良さそうですが微妙に変更が必要な箇所が有ったので書いておきます。

まずはイベントリスナーへの追加方法。

Firefoxの時はこの様に "MozOrientation" と書きましたが

      window.addEventListener("MozOrientation", mozHandleOrientation, true);

iPhone(現行のW3Cの仕様)では以下の様な記述となります。

      window.addEventListener("devicemotion", iosHandleOrientation, true);

後、iPhoneで傾けたときはMacBook上のFirefoxに比べ、大きく動いている様なので取得した加速度にかけるスケール値を低めに変更しました。

      	var accel_scale = 500.0;
      	var accel_scale = 30.0;

最後にY軸の値がMacBookでのものプラスマイナスが逆の様なので以下の部分の orientData.y を -orientData.y に変更。

      	pos_y = (orientData.y*accel_scale * filter_val) + (pos_y * (1.0 - filter_val));

   ↓

      	pos_y = (-orientData.y*accel_scale * filter_val) + (pos_y * (1.0 - filter_val));

値について詳しくまとめると以下の様になります。X軸に関しては違いは無い様です。

傾ける方向 iPhone MacBook上のFirefox
画面奥を下向きに Y軸プラス Y軸マイナス
画面手前を下向きに Y軸マイナス Y軸プラス
画面右を下向きに X軸プラス X軸プラス
画面左を下向きに X軸マイナス X軸マイナス

実際のプログラムはこちらで確認できます。iOS 4.2以降のiPhone/iPadで見てみて下さい。

どうせならFirefoxと両対応が良いなぁと両対応にしたプログラムがこちら

addEventListener でiPhone/iPad用のとFirefox用のと両方を設定しています。

      // Firefox用のハンドリング関数
      function mozHandleOrientation(event) {
      	var orientData = event;
      	var accel_scale = 500.0;
      	var filter_val = 0.1;
      	 
      	// ローパスフィルタ
      	pos_x = (orientData.x*accel_scale * filter_val) + (pos_x * (1.0 - filter_val));
      	pos_y = (orientData.y*accel_scale * filter_val) + (pos_y * (1.0 - filter_val));
        var d = document.getElementById("display");
        d.innerHTML = "<p> x = " + orientData.x + "<br />y = " + orientData.y + "</p>";
      }

      // iPhone/iPad用のハンドリング関数
      function iosHandleOrientation(event) {
      	var orientData = event.accelerationIncludingGravity;
      	var accel_scale = 30.0;
      	var filter_val = 0.1;
      	 
      	// ローパスフィルタ
      	pos_x = (orientData.x*accel_scale * filter_val) + (pos_x * (1.0 - filter_val));
      	pos_y = (-orientData.y*accel_scale * filter_val) + (pos_y * (1.0 - filter_val));
        var d = document.getElementById("display");
        d.innerHTML = "<p> x = " + orientData.x + "<br />y = " + orientData.y + "</p>";
      }

      window.addEventListener("MozOrientation", mozHandleOrientation, true);
      window.addEventListener("devicemotion", iosHandleOrientation, true);

関連リンク

DeviceOrientation Event Specification
http://dev.w3.org/geo/api/spec-source-orientation.html

iPhoneのSafariで細かい回転量を取得する


今までも onorientationchange を使えば90度づつの回転(Safariの描画の向きが変わるタイミング)は取得可能でした。

このようなデモで実装されているタイプのデータであれば今までも可能でした。

Ajaxian » iPhone window.onorientationchange Code
http://ajaxian.com/archives/iphone-windowonorientationchange-code

実際に返される値を確認したい場合はこちらにアクセスして下さい。90度づつの回転時に画面に現在の回転量(角度)が返されます。

iOS 4.2からはもっと細かい値がリアルタイムに取得出来るようになりました。

前回の加速度センサーのときと同様に addEventListener を使って以下の様に記述すればOKです。

	      window.addEventListener("deviceorientation", orientationEvent, true);

加速度を取得したいときは "devicemotion" 、回転量を取得したいときは "deviceorientation" です。

すると設定した定期的指定した関数に回転量が返されます。

      function orientationEvent(event) {
        var d = document.getElementById("display");
        d.innerHTML = "<p>x = " + event.beta + "<br />y = " + event.gamma + "<br />z = " + event.alpha + "</p>";
      }

値は引数のプロパティ alpha 、beta 、gamma に入っています。
軸との対応と返される値の範囲は以下の様になっています。 alpha がz軸で有ることに注意して下さい。

プロパティ名 対応する軸 値の範囲(degrees度)
alpha z 0〜360
beta x -180〜180
gamma y -90〜90

こちらにはイラスト付き解説して有りますのでこちらも合わせて読むと理解し易いと思います。

DeviceOrientation Event Specification
http://dev.w3.org/geo/api/spec-source-orientation.html

プログラムはこちらに置いておきますので実際にiPhoneを回転しながら読むと良いかもしれません。