「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

Oscillation with Angular Velocity|Nature of Code


period や Frequencyについて前回の記事で簡単にまとめたが、もうすこしステップアップした考察を角速度の面で行って行こう。前回の記事で書いた基本となる式。

float x = amplitude * cos(TWO_PI * frameCount / period);

このcosに渡す値を以下のように書き換えてフレームレートベースから角速度ベースにしてみる。 結果としては前記事と同じ動きになる。

float angle = 0.0;
float aVelocity = 0.05;

void draw()
{
  angle += aVelocity;
  float x = amplitude * cos( TWO_PI * angle );
}

コード中にpreiodが出てきていないという理由で前回記事とコンセプトが変わっているという意味ではない。TWO_PIに近づくために毎フレーム毎にangle値を増加しているというコード内容から、逆にperiodを表現すると、

period = TWO_PI / angular velocity; と表現できる。


Moverクラスに似たOscillatorクラスをつくり、y座標についても変化を施して幾つかのオブジェクトを動かしてみる。

Oscillation Angular and Period Example from Kazuyoshi Ueno on Vimeo.

#define O_NUM  10


class Oscillator {

public:
    Oscillator(){}
    virtual ~Oscillator(){}
    
    ofVec3f amplitude;
    ofVec3f ang;
    ofVec3f aVelocity;
    
    
    void setup()
    {
        amplitude.set(ofRandom(0, ofGetWidth()*0.5), ofRandom(0, ofGetHeight()*0.5), 0);
        aVelocity.set(ofRandom(-0.05,0.05), ofRandom(-0.05, 0.05), 0);
        ang += aVelocity;
    }
    
    void update()
    {
        ang += aVelocity;
    }
    
    void draw()
    {
        ofFill();
        ofSetColor(127);
        
        float x = amplitude.x * cos(ang.x);
        float y = amplitude.y * sin(ang.y);
        
        ofPushMatrix();
        ofTranslate(ofGetWidth()*0.5, ofGetHeight()*0.5);
        ofLine(0, 0, x, y);
        ofCircle(x,y,0, 10);
        ofPopMatrix();
    }
};


vector<Oscillator> oscilators;


//--------------------------------------------------------------
void testApp::setup(){
    
    ofSetFrameRate(60);
    ofEnableSmoothing();
    ofSetVerticalSync(true);
    ofBackground(0);
    
    oscilators.resize(O_NUM);
    for (int i = 0; i < O_NUM; i++)
    {
        Oscillator* o = &oscilators[i];
        o->setup();
    }
}

//--------------------------------------------------------------
void testApp::update(){
  
    for (int i = 0; i < O_NUM; i++)
    {
        Oscillator* o = &oscilators[i];
        o->update();
    }

}

//--------------------------------------------------------------
void testApp::draw(){
    
    ofPushMatrix();
    for (int i = 0; i < O_NUM; i++)
    {
        Oscillator* o = &oscilators[i];
        o->draw();
    }
    ofPopMatrix();
}