oF - openFrameworks for Windows
「Beyond Interaction」を購入したので openFrameworks(Windows版)について触れていこうと思いますが、ここではWindows版を扱うにあたって気付いた点などを記述していこうと思います。
OpenFrameworks document (APIリファレンス) 日本語訳
Beyond Interaction ―メディアアートのためのopenFrameworksプログラミング入門
openFrameworks(以下oF)の特徴はC++言語ベースでプログラミングするので、他の言語(Max・Proce55ing等)に比べて動作が速く、いろいろなライブラリと融合させることが可能な点でしょうか。
但し、何かとWin版は風当たりが強い?ようで、公式サイトにあるライブラリでもコンパイルが通らず一筋縄ではいかないケースがよくあり、Windowsでは利用出来ないライブラリも存在します。ofxSndObjが使えないのは辛いところ。。。
よって、クロスプラットフォームのわりにはMacやLinux寄りになってしまっているのが現状で、整備していくには言語周りのスキルはそれなりに必要となっています。
また、オープンソースとなっていることによりコアの部分までデバッグ出来るので問題点のトレースはし易いのですが、トラブル等によってlibsフォルダ以下のソースコードを修正する場合は統一性が無くなりコードのブランチが起こりやすいという弊害があります。
やむなく修正した場合は、その修正箇所を忘れないようにして、次のバージョンアップに備えるようにすることをお薦めします。
●インストール
先述のようにoFのWindows版を取り扱いますが、開発環境はVisualStudio2008(以下VS)を使用しています。
openFrameworks.ccの download から visual studio 2008 FAT をダウンロードして、適当な場所に解凍します。そこが作業エリアになるのでVisualStudioのProjectフォルダあたりに入れると良いです。
※開発環境はVisualStudio2008ですが、ExpressEditionでも同じだと思います。
※2010年3月現在のバージョンはv0.061なので、of_preRelease_v0061_vs2008_FAT となっていると思います。
VSが正常にインストール出来ていれば scripts/vs2008 にある compileAllExamples.bat を実行すればappsフォルダにある全てのサンプルをビルドしてくれます。
●フォルダ構成
- addons
拡張ライブラリを配置しておく場所。
- apps
サンプルや自作のアプリを配置しておく場所。
- export
実行時に必要なダイナミックリンク・ライブラリ(DLL)が置いてあり、梱包されているサンプルではビルド後(PostBuildイベント)のバッチ処理で自動的にコピーされるようになっています。
しかし、ディレクトリ構成が変わると正確な位置へコピーされないので、PostBuildイベントは削除して自分でコピーしてしまっも良いと思います。(後述参照)
- libs
oFを構成するソース群で、openFrameworksフォルダ下がコアとなります。
libs/openFrameworksCompiled/project/vs2008 にある openframeworksLib.vcproj を自作アプリのソリューションに追加し、libs/openFrameworksCompiled/lib/vs2008 にあるlibファイルをリリースとデバッグで使い分けて自分のプロジェクトに登録します。
- other
その他のファイルがあり、現在ではArduino用のシリアル通信サンプルのスケッチがあります。
- scripts
サンプルをビルドするバッチや、コマンドラインで使用するための環境設定用バッチが含まれています。
●問題点(Beyond Interactionのサンプルを含む)
1.参照先の問題
サンプルや他のユーザーのプロジェクトを開こうとすると、以下のようなエラーが出てプロジェクトが開けない場合が多々遭遇します。
これはプロジェクトに登録されているファイルのパスが、そのユーザーの環境での絶対パスで記述されていることや、相対パスの階層が異なっている等、参照先の不一致による原因が多数です。
VSから修正するより、テキストエディタ等でソリューションやプロジェクトファイルを直接開き、絶対パスを相対で一気に置換で修正した方が早いかもしれません。
2.設定が壊れている
パスの設定が正常でソースコードも問題無いのに、コンパイルが正常に通らないという場合、プロジェクトの設定が壊れているなどの原因も考えられます。
最初から新規でプロジェクトを構築しても良いですが、apps/examples にある emptyExample というプロジェクトを丸ごとコピーして、これを雛形にして使用する方法もあり、公式でも推奨しているようです。(readme.txtにも記述されてます)
但し、コピー先の階層には注意してください。 同じレベルなら大丈夫でしょう。
3.サンプルの問題
Beyond Interactionのサンプル 3-4_A にはプロジェクトファイルが入ってませんので、ソリューションを開くと上記エラーが出ます。
3-4_B からプロジェクトファイルのみコピーし、ソリューションから CustomCircle の2つのファイルを削除します。
4.リンクエラー
また、上の 3-4_A を含む他のケースでもそうですが、timeGetTime絡みでリンクエラー(未解決シンボル)となる場合があります。
これはリンクするライブラリに winmm.lib が入ってないためで、
プロジェクトのプロパティ → リンカ → 入力 → 追加の依存ファイル
に winmm.lib を追記しておけば解決出来ます。
●バージョン管理システム
機能を拡張してくれるアドオン(ライブラリ)については、既にいくつかのライブラリが登録されています(FAT版の場合)。
ここに無いものは公式サイトで紹介されているサイト等からダウンロードしてきますが、中にはバージョン管理システムを利用しているものがあり、Subversion経由でダウンロードしなければならないものもあります。
Linuxなどの環境では既にSubversionが使用可能であったりしますが、Windowsでは手動で用意しなければなりません。
TortoiseSVNというGUIで操作出来るバージョン管理システムがあるので、まだインストールしてないという方は使用してみると良いでしょう。これをインストールしておけば今後も楽になります。32bitと64bitがあるので環境にあったものをインストールして下さい。
既に分かっている方は「アドオンの登録」まで読み飛ばして下さい。
使用例としてBeyond Interactionの3-4章「アドオンの利用」で紹介される ofxBox2d を実際にインストールしてみます。
ofxBox2d – vanderlin
上記サイトの Source を見るとリポジトリ先が記述されています。
svn checkout http://vanderlin.googlecode.com/svn/trunk/ vanderlin-read-only
これはコマンドラインから入力するための表記なので、今回の場合は赤色の部分だけを使用します。
addonsフォルダかフォルダ下内の任意の場所を右クリックします。
コンテクストメニューにはSVN関係のメニューが追加されていると思いますので、SVN Checkout… を実行しますが、馴れるまではサブメニューの Repo-browser から操作することをお薦めします。
Repo-browser(リポジトリブラウザ)を実行するとアドレスを求められるので、先程のアドレスを入力します。
無事に接続されるとファイルブラウザが開き、登録されているファイルの一覧が表示されます。
初期状態だと trunk/ まで表示されていると思いますので、上のようにofxBox2dフォルダが見える状態まで階層を展開していきます。
ofxBox2dフォルダが見えたらそのフォルダを選択して右クリックし、メニューから SVN Checkout… を実行します。
リポジトリ取得元と出力先の設定ダイアログが出るので、問題ないか確認したらOKを押して実行します。
ダウンロードが開始されると進捗画面が表示されて、もし途中で問題が起こればここで確認できます。(上図は別のアドオンになってます)
無事チェックアウトが終わるとaddonsフォルダ下にofxBox2dという名前のフォルダが作成され、ソースファイルが揃っているか確認して下さい。これで終了です。
上図ではフォルダにいろいろなアイコンがオーバーレイされていますが、これはそのフォルダの状態を現してします。
緑色のチェックマークが付いているフォルダ/ファイルは、チェックアウトしてそのままの状態を維持している通常の状態です。
赤色の!マークは、チェックアウト後に何らかの編集が加わったフォルダ/ファイルであることを示しています。
他にもロック状態や衝突状態などいろいろあり、一目で確認出来るようになってます。
リポジトリ先が予め分かっているなら、いきなり SVN Checkout を実行しても構いません。今回の場合は下記のように設定すればofxBox2dのチェックアウトが出来ます。
http://vanderlin.googlecode.com/svn/trunk/openframeworks/addons/ofxBox2d
フォルダ直下には .svn という隠しフォルダが存在しますが(下層の各サブフォルダも同様)、これはフォルダに内包されているファイルが変更されたかどうかなどの情報を記録している場所なので削除しないで下さい。
バージョン管理しないのであれば削除しても構わないと思います。
変更状態を知るにはフォルダの右クリックからSVNメニューの check for modifications を見ると全ての状態を確認出来ます。
大丈夫かと思いますが、注意点として SVN Commit… (コミット)はしないで下さい。リポジトリに反映されてしまいます。詳細についてはSubversionの説明サイトなどを参照して下さい。
●アドオンの登録 - Box2d編
これでofxBox2dアドオンを利用する準備が出来たので、自作アプリのプロジェクトに登録します。
VSのソリューションエクスプローラの適当な位置にフォルダをアドオン名で新規作成し、その中にファイルを登録します。
アドオンによってはサンプルなども内包しているため、それらは除外して登録します。
ライブラリ(Libファイル)が存在するアドオンがあるので、
プロジェクトのプロパティ → リンカ → 入力 → 追加の依存ファイル
にて登録しておきます。
登録するファイルの階層構造まで再現する必要はありませんが、視認性を良くするために面倒ですが出来るだけ同じ構造にしたほうが良いでしょう。
VSはフォルダのドラッグ&ドロップでは階層構造までは再現してくれず、ファイルのみが同じ階層に一括して追加されるだけのようです。ですが、特にそれでも問題はありません。
最後に面倒な作業がもう1つあります。
Includeが通るようにヘッダーファイルのあるフォルダを、
プロジェクトのプロパティ → C/C++ → 全般 → 追加のインクルードディレクトリ
にもれなく追記しておきます。
例えばofxBox2dの場合なら、
ofxBox2d/scr
ofxBox2d/scr/lib/Box2d/Include
ofxBox2d/scr/lib/Box2d/Source/Collision
ofxBox2d/scr/lib/Box2d/Source/Collision/Shapes
ofxBox2d/scr/lib/Box2d/Source/Common
ofxBox2d/scr/lib/Box2d/Source/Dynamics
ofxBox2d/scr/lib/Box2d/Source/Dynamics/Contacts
ofxBox2d/scr/lib/Box2d/Source/Dynamics/Controllers
ofxBox2d/scr/lib/Box2d/Source/Dynamics/Joints
を面倒ですが全て相対パスで登録しておく必要があります。
oFでは相対パスを推奨しているので、IncludeやLibファイルへのパスは全て相対パスで登録しておいた方が良いようです。
●Box2dの修正
これで作業は終了なので、後はコンパイルするだけ、、、と、言いたいところですが、ofxBox2dのソースはそのままではコンパイルが通りません。
src/ofxBox2dLine.h
src/ofxBox2dPolygon.h
上記のファイルを編集します。
※以前の版では2箇所あったのですが、最近の更新(r73版)によって1箇所のみとなりました。
すみません、修正部分は2箇所のままでしたので、追記致します。
------------------------------
1箇所目は ofxBox2dLine.h というファイルです。
createShape()関数内の
b2Vec2 pts[numPoints];
という箇所(r73版では54行目)ですが、VC++ではコンパイラの違い(※1後述)によりこのような配列のインスタンスを作成出来ないようです。
そこでnewによって動的にインスタンスを作成させる必要があります。
b2Vec2* pts = new b2Vec2[numPoints];
if (pts == NULL) return;
そして、関数の最後などで、
delete [] pts;
を追加して終了です。
2箇所目の修正は ofxBox2dPolygon.h というファイルです。
validateShape()関数内の
b2Vec2 vertexArray[count];
を、1つ目同様に動的生成に変更します。
b2Vec2* vertexArray = new b2Vec2[count];
if (vertexArray == NULL) return false;
その後のif文で return false; によって関数を抜ける箇所が5箇所ありますので、直前でインスタンスを破棄します。
if (~) {
delete [] vertexArray; <--- 追加
return false;
}
と、5箇所全てに1行追加します。
そして、関数最後の return 直前で、
delete [] vertexArray;
を追加して終了です。
------------------------------
実行時には export/vs2008 にあるダイナミックリンク・ライブラリ(DLL)が必要になるので全てコピーしておいて下さい。
fmodex.dll
fmodexL.dll
FreeImage.dll
FreeType-6.dll
glut32.dll
Zlib.dll
emptyExampleをコピーしている場合は、
プロジェクトのプロパティ → ビルドイベント → ビルド後のイベント → コマンドライン
で、ビルド成功後に自動的にDLLをコピーするコマンドが記述されています。
もし、実行時にエラーが出たらここのパスがあっているかも確認してみて下さい。もしくは、このコマンドラインを削除して、手動してコピーしても構いません。
長くなりましたが以上のことを注意して修正すれば、サンプルについては問題無くコンパイル出来るでしょう。
また問題があったら加筆していきたいと思います。
※1
厳密ではありませんが、これまでに分かった点について。
変更箇所の元コードは、ISO C99言語拡張を搭載したコンパイラ、例えばgccでならコンパイル出来ます。
ですが、VCではC90(ANSI C89)を持つCコンパイラ部であるため、エラーとなってしまうようです。
今回の根本的な原因は、可変長配列に数値変数が使用出来ない点です。
C99では、配列宣言の長さを変数で指定することで、動的に可変長宣言出来ます。一方、C90では固定値のみしか扱えないことにより、このような問題が起こるようです。int value[10]; ---> C90 = OK、C99 = OK
int sz = 10;
int value[sz]; ---> C90 = NG、C99 = OK
試しに公式サイトで紹介されている Code::Blocks で、同じようにして配列長を変数で確保してみたところ、コンパイルが通り実行結果も正常でした。
これはMinGWに梱包されているgccがC99であるためです。
まだ単純な内容ではありますが、いろいろと含みがあると思いますので、今後このような問題を避けたい場合、素直にCode::Blocksを利用した方が良いかもしれません。
-----
話し変わりますが、自分のところではWindows XP(x86/32bit)環境とWindows 7(x64/64bit)環境(構成はWin32)でテストしてますが、XPでは問題なくコンパイル出来ても、Win7だと以下の2つのエラーでコンパイル出来ないことがありました。
Fatal error C1033
cannot open program database ‘pdb’Fatal error C1074
’IDB’ is illigal exetension for PDB file:filename
C1033はプログラムデータベースが作成されないためにオープン出来ない、いわゆるディスクエラーとなるのですが、購入仕立てのノートPCでは起こりにくく、念のためディスクチェックも行いました。
C1074はプログラムデータベースの拡張子を IDB ではなく PDB にしろ、ということですが、特別なコンパイラ設定をしてない限りそんな現象には遭遇しません。
これはXP(デスクトップ)とWin7(ノートPC)をファイル共有し、XP→Win7へソースコードを転送してコンパイルしたのですが、どうやら所有者情報の関係?でコンパイルがエラーとなっていたようです。
つまり、権限によってファイルのI/Oが正常に行われなかったということでしょうか。
おそらく所有者情報を書き換えてやれば解決しますが、この結論に行き着くに至ったのは、一度パブリックへ全ソースコードを移動してみたら(Users→ユーザー名→Documents→Visual Studio 2008→Projects から Visual Studio 2008以下をパブリックのドキュメントへ移動)、嘘のようにコンパイルが無事成功しました。
ここで所有者情報が変わっていたとするなら(確認し忘れました)、元のフォルダへ戻しても大丈夫と思い、再度元あった場所へ移動。
すると、全て問題なくコンパイルし実行出来ました。
Win7上でのみファイルの作成やプロジェクトの生成を行っていれば大丈夫だったのでしょうけど、もし上記のようなエラーで悩まされている方は、一度所有権を疑ってみると良いかもしれません。
ついでにノートPCで標準サンプルを実行してみます。
acerのAspire1410で、CPUはCeleron SU2300、メモリは4GB、OSはWindows 7(x64)、という環境で、addonsExampleにある opencvExample を実行してみます。ビルド構成はWin32です。
※画面の解像度が1366x768なので下側が少し切れます。出来るだけ表示範囲を稼ぐためにウインドウモードからフルスクリーンモードに変更してあります。
デバッグ
平均フレームレート : 約 8 FPS
キャプチャ時 : 約 3 FPS
リリース
平均フレームレート : 約 33 FPS
キャプチャ時 : 約 23 FPS
ムービーを再生しながらOpenCVによる画像解析を行い、複数の解析画像を表示するというものです。
キャプチャのタイミングによりけりですが、リリース構成で20~30FPSが確保出来ればスムーズで十分速い結果だと思います。
逆にそれ以上のことをすればとたんに落ちると思いますけど・・・
VSのソリューションやプロジェクトにあるファイルやフォルダの場所を修復したり、アドオンの追加を(手動よりは)容易にしたり、上記トラブルを解消するツールを近いうちに公開しようと思います。
| 固定リンク
「プログラミング」カテゴリの記事
- oF - openFrameworks SolutionSetting for VC++(2010.04.11)
- oF - openFrameworks for Windows(2010.03.31)
- Proce55ing - CircleCubes(2010.01.05)
コメント
はじめまして、田所です。
Beyond Interaction、お買い上げありがとうございます。また、Windows環境に関する問題について、いろいろ記述してくださり、有難うございます。
普段の開発マシンがOSXのため、VCの開発環境に不案内のため、サンプルの不具合などでご迷惑おかけしました。すみません。
すばらしい記事、とても参考になりました。こちらの情報、openframeworks.jpの方でも、取り上げさせてください。
また、やるといいながらずるずると引き伸ばしになっていた、openFrameworks.jpフォーラム、もうすこしでオープンできそうです。オープンの際には、ご連絡しますので、また役にたつ情報あれば、ぜひご紹介いただけると助かります。
よろしくお願いします。
投稿: 田所 | 2010-04-08 18:55
田所さん、はじめまして!
わざわざサイトまで足を運んで頂きありがとうございます。
サンプルの不具合等について、こちらとしては良い学習になりましたので、特に迷惑とは思っていませんです。
そういうことも含めて面白かったりもするのですが、書籍である手前なかなかそうもいきませんよね。
御苦労の程痛み入ります。
openframeworks.jpへの当記事の紹介について、お力添え出来るのであれば、是非取り上げて頂いて構いません。
こちらこそ、よろしくお願い致しますm(_ _)m
記事でも触れたツールが早ければ今週末、遅くても来週中には公開予定でいますので、こちらも合わせてご参照下されば幸いです。
それではフォーラムのオープン楽しみにしています!
投稿: SatE-O(サテヲ) | 2010-04-08 23:14
はじめまして、SatE-Oさん!
当方、全くの開発の初心者ですが先日をBeyond Interactionを購入し、oFの魅力にやみつきです!
今は本に沿って学習しておりますが、なんせoFはもとよりコンパイラ(VS)の知識すら乏しいのでトライ&エラー&エラーの連続です。稀に思い通りにアニメーションが実行された時の感動はたまりません!
お時間のある時、ご指南して頂けたら幸いです。
投稿: --- | 2011-01-25 01:04
はじめまして!
えっと、お名前ないので宜しければハンドルネームなり記入して頂けると助かります(^-^;
最近oFに触れる機会が減っているのでどこまで期待に添えるかわかりませんが、改めて勉強がてらこちらこそ宜しくお願い致しますm(_ _)m
何か行き詰まっていることなどありますでしょうか?
投稿: SatE-O(サテヲ) | 2011-01-25 05:48
ありがとうございます!
先日は名無しでのコメント失礼しましたo(_ _)o
「こんな作品をつくりたいっ」というイメージはあるのですが、恥ずかしながら「何が分からないのか」という事を説明出来ないレベルです。(;;;´Д`)
現在は3月12日に開催されるopenFrameworks Tokyo v0.01にて少しでも皆さんとコミュニケーションをとれる事を目標に学習しております。
このように本当に初心者な私ですが、C++、VS、oFの学習を進めるにあたってポイントなどがございましたらご教授宜しくお願いします。
乱文、失礼します。
投稿: chico | 2011-01-26 02:00
改めましてchicoさんはじめまして!
openFrameworks Tokyo v0.01に参加されるのですね~
良い経験が得られることを祈っております(^-^)
なるほど学習の進め方ですか。自分は教えてもらうというより、独学で覚えて実務で覚えてという感じで学習していったので宛になるかは自信がないのですが…(^-^;
既にイメージしている目標があるようなので、例えばそれを実現するためには何をすべきか切り分けていくと良いと思います。
グラフィックの部分、入力の部分、サウンドの部分があるとしたら、それぞれに対していろんなサンプルを見てテストアプリを作り、それぞれがイメージに近くなってきたら統合して目標のアプリを作成していくという感じです。
oFは名前の通りフレームワーク(骨格)なので、C++が使えるという前提となっています。
個人的には両方同時に学習していくのは量が多く混乱を招くので、せっかく好きになったoFですからそれをベースに学習し、その上で問題が出てきたらそれがoFなのかC++なのか切り分け、C++となった場合にそちらを掘り下げて学習していく、という方法などが考えられます。
VSについては使っていくうちに覚えていけるはずですので、特に気になさらなくても良いかなとは思います。
まずはイメージしている目標のアプリについて、どの機能が必要か、それにはoFのライブラリだけで済むか、実現出来ない場合それ以外に何が必要か、揃っている場合処理の流れを書き出す、などを紙などに書き留めていくと良いと思います。
自分は、紙にアルゴリズムや処理・機能の洗い出し、まとめにマインドマップやエクセルなどを使ってます。
長々書いてしまいましたが、うまくお伝え出来ずにすみません(^-^;
気になる部分がありましたら、またお聞き下さい(^-^)
投稿: SatE-O(サテヲ) | 2011-01-26 07:27
懇切、丁寧なアドバイスありがとうございます。大変参考になります!
イメージしているアプリに対してグラフィック、サウンドと各プロセスに切り分けて少しずつ学習していきたいと思います。今はとにかくBeyond Interactionを参考にoFを中心に学びながらその時に派生的に生じるC++の問題を少しずつ理解していきたいと思います。
大切なお時間を頂いて本当にありがとうございます。
少し乱暴な言葉になってしまいますがSatE-Oさんのアドバイスを頂いて「とにかく打って!やってやるっ!」という気持ちです。
稚拙なことだらけですが、今後とも技術的な意見を宜しくお願いします。(_ _)
投稿: chico | 2011-01-27 02:17
いえいえ、微力ながらお力添え出来れば幸いです(^-^)
とても元気があってやる気満々なのがよく伝わってきます。
こちらもなんだか元気付けられます(笑)
openFrameworks Tokyo v0.01に行きましたら是非レポをお聞かせ下さい(^-^)
また何かありましたらこちらこそ宜しくお願い致しますm(_ _)m
投稿: SatE-O(サテヲ) | 2011-01-28 01:50
この記事を見てofxBox2dが使えるようになりました。
もうmacに乗り換えるしかないんじゃないかと思っていたのですが、助かりました。
ありがとうございます。
投稿: | 2012-08-01 15:15
いえいえ、お役に立てて幸いです!(^-^)
投稿: SatE-O(サテヲ) | 2012-08-02 01:07