多摩美 - “iTamabi” – iPhoneアプリ開発プロジェクト 2010
openFrameworks入門
openFrameworks入門
- OpenFrameworksの紹介
- OpenFrameworksを使ってみる
- 簡単なプログラムを実行
- OpenFramwroskをiPhoneで使ってみる
- 簡単なアニメーションを作成してみる
OpneFrameworksについて
- OpenFrameworksとは、シンプルで直感的なフレームワークによって、創作活動を手助けするようにデザインされた、C++のライブラリ
- オフィシャルページ
- Zach LiebermanとTheodore Watson、Arturo Castroを中心に開発が進められている
- Processingからの強い影響
- C++の細かな知識なしに、クリエイティブな部分のみコーディングすることで、高度なアプリケーションを開発可能
- openFrameworksから影響を受けたプロジェクトも派生している → Cinder
made with openFrameworks from openFrameworks on Vimeo.
OpneFrameworksの入手方法
- openFrameworksのダウンロードページから
- 最新のバージョンをダウンロードする
- 2009年5月現在の最新は、v0.061
- iPhoe版の “iPhone 0061 FAT” をダウンロード
- Macでも開発したい人は、mac版の ”x-code FAT” をダウンロード、OS 10.5と10.6によって別になっているのに注意
- FAT版とは?
- あらかじめ主要な addon (拡張機能) が組込まれたバージョン
- OpenCV, OSCの入出力 など
サンプルを実行してみる
- Mac版「of_preRelease_v0061_osxSL_FAT/apps/examples/」以下にあるフォルダ内のXCodeのプロジェクトファイル「.xcodeproj」を開く
- iPhone版の場合は「of_preRelease_v0061_iPhone_FAT-pre3/apps/examples/」以下
- プロジェクトファイルを開くと、自動的にXcodeが起動するはず
- ツールバーの「ビルドして進行」を押す
- プログラムがコンパイルされ、エラーが無ければそのままサンプルが実行される
新規プロジェクトの作成場所
- まずは、自分のプロジェクトを格納するためのフォルダを用意する
- openFrameworksでは、プロジェクトを格納する場所が指定されている – それ以外の場所にプロジェクトを作成しても動かないので注意!!
- プロジェクトを格納する場所
- Mac版「of_preRelease_v0061_osxSL_FAT/apps/[任意のフォルダ]/」以下に
- iPhone版「of_preRelease_v0061_iPhone_FAT-pre3/apps/[任意のフォルダ]/」以下に
- 例えば自分用の新規プロジェクトを作成するフォルダを「myApps」とすると
- Mac版「of_preRelease_v0061_osxSL_FAT/apps/myApps/」以下にプロジェクトのフォルダを作成
- iPhone版「of_preRelease_v0061_iPhone_FAT-pre3/apps/myApps/」以下にプロジェクトのフォルダを作成
新規プロジェクトの作成
- openFrameworksの新規プロジェクトを作成する際には、空のプロジェクトをフォルダごとコピーして使用する
- Mac版 「of_preRelease_v0061_osxSL_FAT/apps/examples/emptyExample」
- iPhone版 「of_preRelease_v0061_iPhone_FAT-pre3/apps/iPhoneExamples/emptyExample」
- プロジェクトのフォルダごとコピーして、myAppsフォルダ以下に配置
- コピーしたemptyExampleフォルダの名称を変更 – 「myNewApp」など
- プロジェクトのフォルダ内にある、XCodeのプロジェクトファイルの名称も変更 – 「myNewApp.xcodeproj」など
- XCodeのプロジェクトファイルをダブルクリックして、XCodeを起動
- グループとファイル」の一覧の中の「ターゲット」の項目内のターゲットファイルのアイコンを右クリックして、「名称変更」を選択します
- ターゲットの名称をプロジェクト名と同じ名前に – 「myNewApp」など
OpneFrameworksのコード構造
- さしあたって、編集する必要のあるファイルは、testApp.hとtestApp.cpp (iPhone版の場合は、testApp.mm) のみ!
- 様々な既存のライブラリが結びついている
- アプリケーション作成のための「糊」のような存在
プログラムを作成してみる
- testApp.h
- プログラムの中心となるヘッダファイル
- testApp.cpp で使用される、変数、メソッドなどを宣言する場所
testApp.h (OS X 版)
#ifndef _TEST_APP #define _TEST_APP #include "ofMain.h" class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void keyPressed (int key); void keyReleased(int key); void mouseMoved(int x, int y ); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void windowResized(int w, int h); }; #endif
testApp.h (iPhone版)
#pragma once #include "ofMain.h" #include "ofxiPhone.h" #include "ofxiPhoneExtras.h" class testApp : public ofxiPhoneApp { public: void setup(); void update(); void draw(); void exit(); void touchDown(ofTouchEventArgs &touch); void touchMoved(ofTouchEventArgs &touch); void touchUp(ofTouchEventArgs &touch); void touchDoubleTap(ofTouchEventArgs &touch); void lostFocus(); void gotFocus(); void gotMemoryWarning(); void deviceOrientationChanged(int newOrientation); };
- testApp.cpp (iPhone版の場合は、testApp.mm)
- プログラムの中心となる実装ファイル
- 画面の表示、アニメーション、マウスやキーボードとのインタラクションなど、主要な機能はここで定義される
testApp.cpp (OS X 版)
#include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ } //-------------------------------------------------------------- void testApp::update(){ } //-------------------------------------------------------------- void testApp::draw(){ } //-------------------------------------------------------------- void testApp::keyPressed(int key){ } //-------------------------------------------------------------- void testApp::keyReleased(int key){ } //-------------------------------------------------------------- void testApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void testApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mouseReleased(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::windowResized(int w, int h){ }
testApp.mm (iPhone版)
#include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ // register touch events ofRegisterTouchEvents(this); // initialize the accelerometer ofxAccelerometer.setup(); //iPhoneAlerts will be sent to this. ofxiPhoneAlerts.addListener(this); //If you want a landscape oreintation //iPhoneSetOrientation(OFXIPHONE_ORIENTATION_LANDSCAPE_RIGHT); ofBackground(127,127,127); } //-------------------------------------------------------------- void testApp::update(){ } //-------------------------------------------------------------- void testApp::draw(){ } //-------------------------------------------------------------- void testApp::exit(){ } //-------------------------------------------------------------- void testApp::touchDown(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchMoved(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchUp(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchDoubleTap(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::lostFocus(){ } //-------------------------------------------------------------- void testApp::gotFocus(){ } //-------------------------------------------------------------- void testApp::gotMemoryWarning(){ } //-------------------------------------------------------------- void testApp::deviceOrientationChanged(int newOrientation){ }
testApp内で使用される主な関数(メソッド)
- testApp.hとtestApp.cpp (testApp.mm) 内には、様々な関数が宣言されている
- void setup(); / void update(); / void draw(); / void keyPressed(int key); ..etc
- それぞれの関数で処理される内容が来まっている
定義 | 機能 |
---|---|
setup | プログラムが起動した際に1度だけ実行される。初期化。 |
update | 一定間隔で繰り返し実行される。draw関数の直前に実行される。変数の値の更新に使用する。 |
draw | update関数の直後に実行される。描画に関する命令に使用する。 |
exit | プログラムが終了する直前に実行される。 |
keyPressed | キーボードを押した瞬間に実行される。 |
keyReleased | キーボードを離した瞬間に実行される。 |
mouseMoved | マウスを移動した際に実行される |
mouseDragged | マウスをドラッグした際に実行される |
mousePressed | マウスボタンを押した瞬間に実行される |
mouseReleased | マウスボタンを離した瞬間に実行される |
touchDown | 画面をタッチした瞬間に実行される(iPhone版のみ) |
touchMoved | 画面をタッチして移動した際に実行される(iPhone版のみ) |
touchUp | タッチしていた画面から離れた瞬間実行される(iPhone版のみ) |
touchDoubleTap | ダブルタップ(素早く2回画面をタップ)した瞬間に実行される(iPhone版のみ) |
簡単な図形を描いてみる
- 3つの円を描いてみる
- アルファチャンネル(透明度)を指定
- 色の混色を、加法混色に
- testApp::draw() 関数に色を指定して円を描く命令を追加する
testApp.cpp (OS X 版)
#include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ ofBackground(0, 0, 0); } //-------------------------------------------------------------- void testApp::update(){ } //-------------------------------------------------------------- void testApp::draw(){ //アルファチャンネル(透明度)を使用可能に ofEnableAlphaBlending(); //混色を、加算混色に glBlendFunc(GL_ONE, GL_ONE); //塗りの色を赤に ofSetColor(255, 0, 0, 63); //円を描く ofEllipse(ofGetWidth()/2, ofGetHeight()/2-40, 150, 150); //塗りの色を青に ofSetColor(0, 0, 255, 63); //円を描く ofEllipse(ofGetWidth()/2-40, ofGetHeight()/2+40, 150, 150); //塗りの色を緑に ofSetColor(0, 255, 0, 63); //円を描く ofEllipse(ofGetWidth()/2+40, ofGetHeight()/2+40, 150, 150); } //-------------------------------------------------------------- void testApp::keyPressed(int key){ } //-------------------------------------------------------------- void testApp::keyReleased(int key){ } //-------------------------------------------------------------- void testApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void testApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mouseReleased(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::windowResized(int w, int h){ }
testApp.mm (iPhone版)
#include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ // register touch events ofRegisterTouchEvents(this); // initialize the accelerometer ofxAccelerometer.setup(); //iPhoneAlerts will be sent to this. ofxiPhoneAlerts.addListener(this); //If you want a landscape oreintation //iPhoneSetOrientation(OFXIPHONE_ORIENTATION_LANDSCAPE_RIGHT); ofBackground(0,0,0); } //-------------------------------------------------------------- void testApp::update(){ } //-------------------------------------------------------------- void testApp::draw(){ //アルファチャンネル(透明度)を使用可能に ofEnableAlphaBlending(); //混色を、加算混色に glBlendFunc(GL_ONE, GL_ONE); //塗りの色を赤に ofSetColor(255, 0, 0, 63); //円を描く ofEllipse(ofGetWidth()/2, ofGetHeight()/2-40, 150, 150); //塗りの色を青に ofSetColor(0, 0, 255, 63); //円を描く ofEllipse(ofGetWidth()/2-40, ofGetHeight()/2+40, 150, 150); //塗りの色を緑に ofSetColor(0, 255, 0, 63); //円を描く ofEllipse(ofGetWidth()/2+40, ofGetHeight()/2+40, 150, 150); } //-------------------------------------------------------------- void testApp::exit(){ } //-------------------------------------------------------------- void testApp::touchDown(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchMoved(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchUp(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchDoubleTap(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::lostFocus(){ } //-------------------------------------------------------------- void testApp::gotFocus(){ } //-------------------------------------------------------------- void testApp::gotMemoryWarning(){ } //-------------------------------------------------------------- void testApp::deviceOrientationChanged(int newOrientation){ }
アニメーションの基本構造
- アニメーションを構成する3つの関数 – setup()、update()、draw()
- setup()
- 初期化関数
- プログラムを実行したときに最初に1回だけ実行したい命令を記入
- 画面書き換えの速度の設定(フレームレート)、背景色、外部データのロードなど
- update()
- メインループ関数、指定した画面書き換え速度の設定(フレームレート)の設定に従って、繰り返し実行、
- draw()関数の前に実行され、プログラムに記憶された値を更新する際に使用される
- draw()
- 描画関数
- update()関数と同様に、指定された画面書き換えの間隔(フレームレート)でプログラムが終了するまで、繰り返し実行
- 画面の描画に関する命令を実行する
簡単なアニメーションを作成する
- 画面全体を回転してみる
- 回転角度は、angleという変数に格納
- setup() – 表示の初期設定、背景色の定義、フレームレート設定、回転角度の初期化
- update() – 回転角度を10°増加させる
- draw() – 画面を描画
testApp.cpp (OS X 版)
#include "testApp.h" double angle; //傾きの角度 //-------------------------------------------------------------- void testApp::setup(){ //背景色を黒に ofBackground(0,0,0); //フレームレートを60fpsに ofSetFrameRate(60); //角度を初期化 angle = 0; } //-------------------------------------------------------------- void testApp::update(){ //角度を10°増加させる angle+=10; } //-------------------------------------------------------------- void testApp::draw(){ //現在の座標系を保存 ofPushMatrix(); //座標系の原点(0,0)を、画面の中心に ofTranslate(ofGetWidth()/2, ofGetHeight()/2, 0); //画面のX軸を40°回転 ofRotateX(40); //画面のZ軸を、angleの角度回転させる ofRotateZ(angle); //アルファチャンネル(透明度)を使用可能に ofEnableAlphaBlending(); //混色を、加算混色に glBlendFunc(GL_ONE, GL_ONE); //塗りの色を赤に ofSetColor(255, 0, 0, 63); //円を描く ofEllipse(0, -40, 150, 150); //塗りの色を青に ofSetColor(0, 0, 255, 63); //円を描く ofEllipse(-40, 40, 150, 150); //塗りの色を緑に ofSetColor(0, 255, 0, 63); //円を描く ofEllipse(40, 40, 150, 150); //座標系を復元 ofPopMatrix(); } //-------------------------------------------------------------- void testApp::keyPressed(int key){ } //-------------------------------------------------------------- void testApp::keyReleased(int key){ } //-------------------------------------------------------------- void testApp::mouseMoved(int x, int y ){ } //-------------------------------------------------------------- void testApp::mouseDragged(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::mouseReleased(int x, int y, int button){ } //-------------------------------------------------------------- void testApp::windowResized(int w, int h){ }
testApp.mm (iPhone版)
#include "testApp.h" double angle; //傾きの角度 //-------------------------------------------------------------- void testApp::setup(){ // register touch events ofRegisterTouchEvents(this); // initialize the accelerometer ofxAccelerometer.setup(); //iPhoneAlerts will be sent to this. ofxiPhoneAlerts.addListener(this); //If you want a landscape oreintation //iPhoneSetOrientation(OFXIPHONE_ORIENTATION_LANDSCAPE_RIGHT); //背景色を黒に ofBackground(0,0,0); //フレームレートを60fpsに ofSetFrameRate(60); //角度を初期化 angle = 0; } //-------------------------------------------------------------- void testApp::update(){ //角度を10°増加させる angle+=10; } //-------------------------------------------------------------- void testApp::draw(){ //現在の座標系を保存 ofPushMatrix(); //座標系の原点(0,0)を、画面の中心に ofTranslate(ofGetWidth()/2, ofGetHeight()/2, 0); //画面のX軸を40°回転 ofRotateX(40); //画面のZ軸を、angleの角度回転させる ofRotateZ(angle); //アルファチャンネル(透明度)を使用可能に ofEnableAlphaBlending(); //混色を、加算混色に glBlendFunc(GL_ONE, GL_ONE); //塗りの色を赤に ofSetColor(255, 0, 0, 63); //円を描く ofEllipse(0, -40, 150, 150); //塗りの色を青に ofSetColor(0, 0, 255, 63); //円を描く ofEllipse(-40, 40, 150, 150); //塗りの色を緑に ofSetColor(0, 255, 0, 63); //円を描く ofEllipse(40, 40, 150, 150); //座標系を復元 ofPopMatrix(); } //-------------------------------------------------------------- void testApp::exit(){ } //-------------------------------------------------------------- void testApp::touchDown(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchMoved(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchUp(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::touchDoubleTap(ofTouchEventArgs &touch){ } //-------------------------------------------------------------- void testApp::lostFocus(){ } //-------------------------------------------------------------- void testApp::gotFocus(){ } //-------------------------------------------------------------- void testApp::gotMemoryWarning(){ } //-------------------------------------------------------------- void testApp::deviceOrientationChanged(int newOrientation){ }