yoppa.org


前橋工科大学 – クリエイティブコーディング (プログラミング II) 2020

openFrameworks + OOP – オブジェクト指向プログラミング入門

これまでのopenFrameworksのプロジェクトは、ofApp.h と ofApp.cpp という2つのファイルに全てのプログラムを記述してきました。しかし、この方法では徐々にプロジェクトが複雑になり巨大化するうちに、扱いが困難になってきます。プログラミングをわかりやすく保つには、役割ごとに内容を分割して記述すべきです。openFrameworksの元となるプログラミング言語であるC++では「オブジェクト」という単位でプログラムを構造化していきます。このオブジェクトを基本単位にしたプログラミング手法のことを「オブジェクト指向プログラミング (Object Oriented Programing = OOP)」と呼びます。OOPはC++だけでなく、Java、Python、Ruby、C#、Objective-C、Swiftなどでも利用されていて、現在のプログラミング言語の主流となっているパラダイムです。

今回は、このOOPをopenFrameworksで実現する方法をこれまで扱ってきた位置を速度を2次元のベクトル (glm::vec2) で記述したアニメーションを基本単位にしてオブジェクト指向プログラミングを行います。今回の内容が今後のより本格的な作品制作のための重要なテクニックとなっていきます。しっかり理解していきましょう。

プログラムサンプル

今日の動画は以下のプログラムを元に発展させていきます。新規にプロジェクトを作成して、下記のofApp.hとofApp.cppをコピー&ペーストして作業を開始してください。

ofApp.h

#pragma once
#include "ofMain.h"

class ofApp : public ofBaseApp {
public:
    void setup();
    void update();
    void draw();

    glm::vec2 location;
    glm::vec2 velocity;
};

ofApp.cpp

#include "ofApp.h"

void ofApp::setup() {
    ofSetCircleResolution(16);
    ofSetFrameRate(60);
    location = glm::vec2(ofGetWidth() / 2, ofGetHeight() / 2);
    velocity = glm::vec2(ofRandom(-2, 2), ofRandom(-2, 2));
}

void ofApp::update() {
    location = location + velocity;
    if (location.x > ofGetWidth() || location.x < 0) {
        velocity.x = velocity.x * -1;
    }
    if (location.y > ofGetHeight() || location.y < 0) {
        velocity.y = velocity.y * -1;
    }
}

void ofApp::draw() {
    ofSetColor(0, 127, 255, 200);
    ofDrawCircle(location, 10);
}

映像内で作成したプログラムは以下からダウンロードしてください。

スライド資料

本日の課題

動画資料で紹介したParticleVec2クラスを使用した2次元のアニメーションを改造して、3次元空間で直線運動するParticleVec3クラスを作成し動かしてください。

  • ヒント
    • glm::vec2 を glm::vec3に変更する
    • (x, y) の位置と速度から、 (x, y, z) の位置と速度へ
    • 初期位置、初期速度、バウンドする処理にz座標の要素を加える

次週までに考えてきてもらい、次回授業の冒頭で発表していただきます!