今見てくれてる人の数

ホンキートンク・スーダラブルース

ゆるコラム、oF、邦ロックや歌謡曲、小説の感想。ドラクエ、JavaScript、ドラゴンボール超など。湘南あたりを転がってる石コロのゆるゆる生きてく超雑多な軌跡です。

【openFrameworks 冒険記15】xyz三次元、カラフルパーティクルを作ってクラスを学ぶ。

いったんofxOpenCvは休憩して三次元パーティクル作ってみました!

f:id:sudara_bluse:20171121104329p:plain

 

完成図動画↓

 

以前のこちらの記事を進化させ、z軸も加え、パーティクルをカラフルにしています。また、今回はクラスを使ってみました。

www.sudara-bluse.tokyo

 

 

繰り返しますが、今回は、Particleクラスを作ってみました!

クラスってなんぞや?、オブジェクト指向ってなんぞや?
という方はこちらで勉強してみてください。

openFrameworksで、オブジェクト指向プログラミング(OOP) 前編 | yoppa org

 

ざっくりいうと、下の金型(設計図)がクラスでたい焼きがインスタンス(実体?)です。笑

f:id:sudara_bluse:20171121055339g:plain

今回はParticle設計図作って、それを1000個インスタンス化しました。

f:id:sudara_bluse:20171121104240p:plain

クラスを使ったおかげでファイルが役割分担されて、ofApp.cppがスッキリします。

 

実装方法

まずはクラスファイルを追加します。

xcodeのsrcフォルダ上で右クリックし、new file  →  c++ File を選択します。 

f:id:sudara_bluse:20171121104439p:plain

 

クラス名を入力します!画像と違いますが、今回はParticleにしました。

f:id:sudara_bluse:20171121104609p:plain

 

すると、Particle.hpp(.hファイルと同じ扱いでOK) 、Particle.cpp が作成されます。

Particleクラスに

ofVec3f position;    ofVec3f velocity;

void setup();    void update();    void draw();

を定義。

ofApp.hで

#define NUM 1000 // パーティクルの数

Particle particle[1000] として1000個インスタンス化します。

(ofImage img と同じ使い方ですね)

 

コード

Particle.hpp
#pragma once

#include "ofMain.h"
#include <stdio.h>


class Particle{
public:

    Particle();

    ofVec3f position;
    ofVec3f velocity;

    void setup();
    void update();
    void draw();

};

Particle.cpp
#include "Particle.hpp"


// コンストラクタ
Particle::Particle(){
    setup();
}

void Particle::setup(){
        // ランダムで初期位置を決める
        position = ofVec3f(ofRandom(ofGetWidth()),ofRandom(ofGetHeight()),ofRandom(-100, 100));
        // ランダムで速さを設定 -5〜5までの間
        velocity = ofVec3f(ofRandom(-5,5),ofRandom(-5,5),ofRandom(-5,5));
}

void Particle::update(){

        // 位置に速度プラス
        position += velocity;

        /* 画面の端に来たらバウンドする処理 */
        // 左右でバウンド 画面の左右をはみ出したら
        if(position.x < 0 || position.x > ofGetWidth()){
            velocity.x *= -1; //左右の速度を反転
        }

        // 上下でバウンド 画面の上下をはみ出したら
        if(position.y < 0 || position.y > ofGetHeight()){
            velocity.y *= -1; //上下の速度を反転
        }

        // zの値が1000または、-1000まで行ったら反転
        if(position.z < -1000 || position.z > 1000){
            velocity.z *= -1; // zの方向転換
        }

}


void Particle::draw(){
        ofSetColor(ofRandom(255), ofRandom(255), ofRandom(255));
        ofDrawCircle(position, 5);
        ofDrawCircle(position, 2);
}
ofApp.h
#pragma once

#include "ofMain.h"
#include "Particle.hpp"

#define NUM 1000 // パーティクルの数

class ofApp : 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 mouseEntered(int x, int y);
        void mouseExited(int x, int y);
        void windowResized(int w, int h);
        void dragEvent(ofDragInfo dragInfo);
        void gotMessage(ofMessage msg);

    Particle particle[NUM];
};
ofApp.cpp
//--------------------------------------------------------------
void ofApp::setup(){

    ofSetFrameRate(60);
    ofSetCircleResolution(64);
    ofEnableAlphaBlending();
    ofEnableBlendMode(OF_BLENDMODE_ADD);
    ofBackgroundHex(0x000000);


    for (int i = 0; i < NUM; i++){
        particle[i].setup();
    }

}

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

    for (int i = 0; i < NUM; i++){
        particle[i].update();
    }

}

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

    for (int i = 0; i < NUM; i++){
        particle[i].draw();
    }
}

 

 以上です。ofxBox2Dなどもやろうと思ってます。

あと笑顔検知が上手く行かない謎とかないとな。。