gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

個性

全ての球が自分勝手に動いている印象があったのでこの題名に。
ofSpherePrimitiveを含んだクラスを複製して、5*5に並べてから、それぞれをz軸方向に三角関数で動かしています。それぞれの球は回っていて、回転速度がsinのラジアンになっているため、回転の速さが速いほどz軸方向に動く速さも速くなっています。

ofEasyCamはとりあえず付けるだけで色々な角度から見られて楽しいので良いですね。
ソースは以下の通り。

#include "ofApp.h"
#define rep(i,j,k) for(int i=j;i<k;i++)

ofEasyCam cam;

class spinbox{
    public :
    ofSpherePrimitive sp;
    float x,y,speed,pos,yro=0;
    
    void init(float ex,float ey,float espeed){
        x=ex;
        y=ey;
        speed=espeed;
        pos=-1.0+ofRandom(0,2);
        yro=1.0+ofRandom(0,1);
    }
    
    void move(){
        ofPushMatrix();
        ofTranslate(x,y);
        ofRotate(yro);
        sp.set(50,8);
        sp.setPosition(0,0,pos);
        sp.drawWireframe();
        ofPopMatrix();
    }
    
    void diff(){
        yro+=speed;
        pos=100.0*sin(yro/10.0);
    }
};
vector<spinbox> v(25);

void ofApp::setup(){
    ofSetFrameRate(60);
    ofNoFill();
    ofSetBackgroundColor(0);
    ofSetColor(255);
    
    rep(i,0,5)rep(j,0,5)v[i*5+j].init(-200+100*i,-200+100*j,1+ofRandom(3));
}

void ofApp::update(){
    rep(i,0,25) v[i].diff();
}

void ofApp::draw(){
    cam.begin();
    rep(i,0,25) v[i].move();
    cam.end();
}