加速度や電子コンパスを使ってみる 1

取り合えずは3軸加速度と、電子コンパス(ジャイロセンサ)の値を取得してみる。
取得するところまでのソースなので、別に大変な内容とかではない。
ちなみに、テンプレートとしてはCocos2D+Box2Dサンプルを使用している。



◆ 加速度
 Cocos2d+Box2dのサンプルで起動すると、実は加速度センサは既に
 HelloWorldLayerに対して組み込まれている。

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{    
    static float prevX=0, prevY=0;
    
    //#define kFilterFactor 0.05f
#define kFilterFactor 1.0f    // don't use filter. the code is here just as an example
    
    float accelX = (float) acceleration.x * kFilterFactor + (1- kFilterFactor)*prevX;
    float accelY = (float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY;
    
    prevX = accelX;
    prevY = accelY;
    
    // accelerometer values are in "Portrait" mode. Change them to Landscape left
    // multiply the gravity by 10
    b2Vec2 gravity( -accelY * 10, accelX * 10);
    
    world->SetGravity( gravity );
}

この部分が加速度センサの値を取得する部分になっている。
本来、加速度センサの値を取得するには
ヘッダで指定しなければいけないが、これに関しては既にCCLayerで設定されている。


重力加速度なので、例えば端末を地面に対して水平に置いている場合は
acceleration.zの値が「1.0」となる。



電子コンパス
 こちらは普通に組み込む必要がある。
 まずは、Frameworksに「CoreLocations.framework」を追加する。


 次に、ヘッダファイルで以下をimport

#import <CoreLocation/CoreLocation.h>

 クラスにdelegateを設定

@interface HelloWorldLayer : CCLayer<CLLocationManagerDelegate>
{
 CLLocationManager* locationManager_;
...


 電子コンパスの初期化。init関数などで

locationManager_ = [[CLLocationManager alloc] init];

locationManager_.headingFilter = kCLHeadingFilterNone;
locationManager_.desiredAccuracy = kCLLocationAccuracyBest;
locationManager_.delegate = self;

[locationManager_ startUpdatingHeading];

 各要素の説明はまた今度。 取り合えず更新頻度の高い情報が必要なので
 頻度の高い情報で取得しています。


 あとはlocationManagerのdelegateを取得することで、値を取得できます。
 例えば以下のような感じで。

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

}

 値の変化をなだらかにするために、ローパスフィルタ処理などを行う必要も
 ありますが、そちらも今度に回しましょうか。




気になったニュースとして、この辺。


魔界戦記ディスガイア for Android(仮)、5月16日より提供開始
 VIVID Runtimeを利用したアプリケーションはGゲーを通じてしか出せないってことと
 キャリアマーケット系のアプリ以外はAndroidMarketから締め出しを食らったことで
 Gゲーが死亡したと思ってたんですが、色々とキラーコンテンツを出してくるものです。


 塊魂とか、ソニックとか、一線を隔したアプリが多い印象です。
 とはいえやはりGゲーでしか提供できないって制限は厳しいなぁ。