入社してオープンフレームワークスについて学んだこと

この記事は tech.kayac.com Advent Calendar 2015 17日目です。

はじめに

近頃は寒いですね。皆さん、こんにちは!マッカー(マーティン)です。実はアンドロイドエンジニアですが、入社日からたった二週間からオープンフレームワークス("OF" in C++)に挑戦してみました。この記事は僕の初めての日本語で書いた記事となりますのでおかしい日本語をお許しくださいませー。プロジェクターやカメラのカリブレーションのためにチェッスボードで最近面白い動きいっぱいした!カヤック会社だからこそこういう技術も試すことができる!

ゴール (2 weeks)

  • [ ] XCode IDEとEclipse IDEの違いをブレークダウン
  • [ ] OFをつかってC++をかける
  • [ ] OFで様々なアドオンを集めて、組み合わせて、そしてプラスα自分の手を動かして、新しいものを作る

XCode IDEとEclipse IDEの違い

昔のJava Editorで初めて、NetbeansやEclipse IDEに進めた(勧めた?recommendation?)私がXCodeを初めてみたときに思ったことは「What, thats all?」。UIがシンプルで立ち上がる時からビルドまで軽い!って感じました。Eclipseと違って、重要なUIエレメント(ナビゲーション、エディター、ユーティリティ、デバグ)全部が一つのフレームで集めた。WYSIWYGのように一気で良いことだと思うんですが、マルチスクリーンで動くことがなれたらEclipseがもっとカスタマイズブルだと感じました。その代わりにXCodeのドキュメンテーションのほうが詳しく書いてあって、慣れるまでとてもためになりました。まとめるとXCodeがobjective C/C++を書きたい方、EclipseがJavaを書きたい方のために一番ベストなチョイスだと思っています。両方を書きたいけど、二つのIDEを持つのが嫌な方にはSublime Textツールをお勧めします。

  • [x] XCode IDEとEclipse IDEの違い

C++ in openframeworks

様々なライブラリ(OpenGL, OpenAL, Freetype, Quicktime, FreeImage, 等)を組み合わせて、openframeworksが一つのC++オープンソースフレームワークとなっております。沢山のアドオン(>1400)も広いコミュニティーから提供しております。ドキュメンテーションもわかるやすく作っており、よくシンプルな例も紹介しております。

例 クラス:ofVideoGrabber 関数: initGrabber()

myGrabber.setVerbose(true);//デバグで助かります
myGrabber.setDeviceID(1);
myGrabber.initGrabber(320,240);//ビデオデバイスを初期化する
int grabW = myGrabber.width;//幅を読み込む
int grabH = myGrabber.height;//高さを読み込む
printf("asked for 320 by 240 - actual size is %i by %i", grabW, grabH);//ビデオデバイスが高さや幅をサポートするのかを確認します

オープンフレームワークスのアドオンを簡単に使うために(アドオンを参加/変えたりすることも)プロジェクトジェネレーターが最初からOFに入っております。

projectgenerator.jpg

  • [x] OFをつかってC++をかける

OFのお勧めなアドオン

試したみたことが複数になりましたが、トラッキングやデテクションがメインになりました。この二つのテーマでは大きな違いがあります。一つ一つのフレームを分析して、そして何かを検出するのがデテクションとなります。検出したものがフレームAからフレームBまでにどのように変わったのかに集中すると、トラッキングとなります。時間が大切なファクターとなります。

ofxParticleEmitterでユニークなパーティクルを作成することができます。トライアルバージョンのParticle Designerをご利用すると後ほどXCodeやOFでXMLに保存された設定を読み込むことができます。 particlegenerator.jpg 使い買ったもとても簡単です:

void yourApp::setup() {
if ( !m_emitter.loadFromXml( "fire.pex" ) )
    {
        ofLog( OF_LOG_ERROR, "testApp::setup() - failed to load emitter config" );
    }
}
void ofApp::update() {
    m_emitter.update();
}
void ofApp::draw() {
    m_emitter.draw(100, 100);
}

ofxFeaturesTrackerアドオンを使って、オブジェクトをチェッスボードパターンで認識ができます。本番の映像はこちらにアップされてます:Flicker video live tracking tracking.jpg

案件のために自分のコードも入れて新しいものも作れたと思いますが、興味がある方がいらっしゃいましたら以下のリンクが多くのオープンフレームワークスTutorialsを纏めてて、私にもとてもためになりました: Tutorials, Examples and Documentation

  • [x] OFで様々なアドオンを集めて、組み合わせて、そしてプラスα自分の手を動かして、新しいものを作る

最後に

プロトタイプがまだまだ完璧に作ってないけど、結果が目の前に見えます!OFがとっても楽しいです!