OpenFrameworksを使おう

こんにちは。4年半ほどゲームを出していないエセゲーム開発者のhizと言います。

その4年半はD言語OpenGLでのプリミティブなゲーム開発以外をやるためにUnity・ツクール・ウディタ・スクリプト言語とか色々試してたんですけど、最終的に一番やりたくなかったC++とOpenFrameworksというフレームワークの組み合わせに落ち着きつつあるのが最近の状況です。

C++と言えば人の精神を崩壊させる言語として有名ですが、OpenFrameworksはそのリスクを抑え、さらに強力な機能を提供してくれる中和剤の役目をしてくれます。

いいフレームワークなのでみんな使おう。

OpenFrameworksとは

OpenFrameroworks.jp about

openFrameworksは、シンプルで先端的なフレームワークによって創作活動を支援するためのオープンソースC++ツールキットです。

だそうです。分かりません。

分かりやすく言うと、

インタラクティブアートやゲームを作るのに便利なライブラリをまとめてくれて、

インタフェースを統一して便利な機能を付与したラッパーを被せてくれて、

コンパイル・リンク設定済みのプロジェクトをアプリからボタン一発で作成してくれる

フレームワークです。

 

もっと平たく言うと、ProcessingC++版です。

要するに、デザイナー等のプログラム初心者の人がインタラクティブアートやゲームを作る際の敷居をものすごく下げてくれるフレームワークです。

私はプログラムは初心者じゃないけど、C++は完全に初心者なので・・・

あと、こういうフレームワークには珍しく、日本語サイトがあります。(ただしリファレンスはほとんど英語のままなのが現状・・・)

いいところ

  • グラフィック(3D含む)・インプット・音楽再生・ビデオ再生・ネット通信・各種ユーテイリティ等一通りの機能(そこそこ高機能)を統一されたインタフェースで利用できる
  • 分かりやすいAPIで、C++の分かりにくさをある程度吸収してくれる
  • マルチプラットフォームWindowsMacLinuxiOSAndroid
  • Project Generatorを使用したプロジェクトの自動生成
  • プロも使用しているので安心して使える
  • 制約が非常に少ない(C++ライブラリを自由に追加可能・コーディング方法の強制が無い)
  • ロックインの心配が少ない(元のライブラリを直接使えばOK)
  • アドオンが豊富に作られており、プロジェクトへのアドオン追加もProject Generatorで行える
  • 試しにプロジェクトを作って実行、が手軽にできる
  • ソースで配布されるので、OpenFrameworks自体の改造も自由

悪いところ

  • 要はライブラリの寄せ集めなので、自力でライブラリを組み合わせて使える人に取っては敢えて使う利点が薄い
  • 実行ファイルの容量が大きい(空のアプリで13.1MBほど)
  • ドキュメントが貧弱ってレベルじゃない(ソース読んだ方が早い)
  • まだバージョン1になってない

OpenFrameworksプロジェクト

プロジェクトの作成

プロジェクトの作成には、Project Generatorを使用します。

Project Generatorでは、プロジェクト名・パス・使用するAddonを指定してボタンを押すと、自動でOpenFrameworksプロジェクトを作ってくれます。

f:id:HIZ:20140914201945p:plain

Addon設定画面

f:id:HIZ:20140914202040p:plain

プロジェクトの編集

作成したプロジェクトには、main.cpp、ofApp.h、ofApp.cppの三つのソースファイルがあります。

main.cppは解像度設定くらいしか変える場所がありません。メインのソースはofApp.hとofApp.cppになります。

変数や追加メソッドは基本ofApp.hに置く必要がありますが、簡単なアプリならofApp.cppを編集するだけで作成できます。

新規作成直後のofApp.cppは、以下のような内容になってます。

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){

}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){

}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){

}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){

}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y){

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

}

Processingを使った事があれば想像つくでしょうが、setupメソッドで初期設定・updateメソッドで更新処理・drawメソッドで描画処理を行います。その他のメソッドは、キー入力・マウス入力等のイベント時の処理を行います。

毎フレームの処理がupdate・drawの2メソッドに分かれているところがProcessingとは違うところですね。描画系のメソッドは基本drawメソッドに書かないと画面に描画されません。(FBO使う場合は別)

黒色の角丸長方形を表示したい場合は、drawメソッドに以下のような文を追加します。

ofSetColor(Color::black);
ofRectRounded(ofRectangle(10, 10, 200, 200), 20);

OpenFrameworksのAPIは、先頭にofが付きます。アドオンの場合はofxが付きます。

C++名前空間を使っていないので、見た目には取っつきやすいですね。

これを実行すると、ウインドウの左上に黒い角丸長方形が表示されるはずです。

ちょっと試したい事があるとき、project generatorでプロジェクト作ってofApp.cppを編集して実行するだけで試すことができる、という手軽さがとてもいいです。

もちろん、複雑なアプリケーションを作るならばソースファイルを多数作ってリンクも簡単にできます。

関連書籍

非常に便利なOpenFrameworksなのですが、現状では情報の少なさがネックになっています。

しかし、大変ありがたいことに、Beyond Interactionにて、OpenFrameworksの解説書のPDFが無償で公開されています!

対応バージョンはv0.7.3とやや古いですが(現行はv0.8.4)、大半の情報はそのまま利用できます。

内容もOpenFrameworksについて丁寧に説明しながら、インタラクティブなアート作品を作っていくという内容になってますので、非常に楽しく学べると思います。

興味のある方は、全部無料で始められますから、是非是非触ってみてください。