(技術メモ)openFrameworks for iOSで方位磁石を使う / 磁石に反応させる

iPhoneに磁石を近づけると何か反応する,というインタラクションを作るためのメモ.

まず,iPhone3 以降のiPhoneには方位磁石が内蔵されており,CoreLocation.Frameworkというフレームワークを使えば周囲の磁力の変化を計測できる.
i pod touchには残念ながらこの機能は搭載されておらず,新しくても古くてもtouchではコンパスは使えない.

あと最も注意すべきこととして,iPhoneに強い磁石をくっつけたりすると多分壊れる.実験等を行う場合は磁力に注意.

appleがiOS環境のわかりやすいExampleを公開している
https://developer.apple.com/library/ios/samplecode/Teslameter/Listings/ReadMe_txt.html
objectiveCで作りたい人であればこれを参考にすればOK.

このプログラムの肝は

// Compute and display the magnitude (size or strength) of the vector.
//      magnitude = sqrt(x^2 + y^2 + z^2)

CGFloat magnitude = sqrt(heading.x*heading.x + heading.y*heading.y + heading.z*heading.z);

 [magnitudeLabel setText:[NSString stringWithFormat:@”%.1f”, magnitude]];

という部分.ようするにx y z の値を二乗ずつして足してスカラー値を取得している.iPhoneのマイクの辺りに磁石を近づけるとこのmagnitudeが大きく減少したり上昇したりする.

 

さて,ここからはこの機能をOFで使うにはどうするか.

結論としてはOFのExampleに方位磁石を使うものがあるので,それを修正するだけでOK.

使うexampleは「CoreLocationExample」というもの.これを見るとofxiOSCoreLocationというCoreLocationの機能をOF上で使うためのライブラリの使い方が分かる.

あとは

float magnitude = sqrt(coreLocation->getCompassX()*coreLocation->getCompassX() + coreLocation->getCompassY()*coreLocation->getCompassY() + coreLocation->getCompassZ()*coreLocation->getCompassZ());

みたいなかんじで計算すればiOS用のexampleと同様に磁力の変化が計測できる.

注意点として,ofxiOSCoreLocation.mmにあるように

 * ——————– note ———————–

 *

 * To get the compass to work on 3GS+ phones you’ll need to double clock on the iPhone oF target from the targets

 * dropdown in the grops & files menu. Make sure ‘All Configurations’ is selected, and then find the option called

 * ‘Preprocessor Macros’. Add to that: OF_TARGET_BUILD_SDK_IS_3_PLUS

 * ————————————————-

ビルドのターゲットを3GS以上にしないと正常に作用しないようです.