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

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

Friction | Nature of Code


■Friction

抵抗・摩擦について。 Nature of Codeより

[準備]

  • 計算式
    Friction = -1 x mew x N x velocity
  • 抵抗力はvelocityとは逆の向き
    ※velocityからfrictionを求める
    ※この際、normalizeしておく方が後で使いやすい
  • 摩擦係数の定義(mew

  • Normal Forceの取得
    ※オブジェクトの重力方向の力
    ※質量に関連。質量が大きいほど、Normal Forceは大きくなるが坂道などだと、地面とオブジェクトの成す角も考慮する。

[考察]

とりあえずNormal Force = 1として考えてみる。

Friction = -1 * mew * velocity;

Since friction continuously pushes against the object in the opposite direction of its movement, the object continuously slows down. This can be a useful technique or a problem depending on the goals of your visualization.

前回のForce記事のコードにfrictionを追加したもの

vector<Mover> movers;
ofVec3f wind;
ofVec3f gravity;

//摩擦係数
float mew;

//--------------------------------------------------------------
void testApp::setup(){
    
    ofSetFrameRate(60);
    ofEnableSmoothing();
    ofSetVerticalSync(true);
    ofBackground(0);
    
    
    movers.resize(NUM_MOVERS);
    
    //自然界のforceをセット
    wind.set(0.2, 0.0, 0.0);
    gravity.set(0.0, 0.2, 0.0);
    
    for (int i = 0; i < NUM_MOVERS; i++)
    {
        Mover *m = &movers[i];
        m->setup();
    }
    
    ofSetColor(255);
    
    //摩擦係数
    mew = 0.1;
}

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

    for (int i = 0; i < NUM_MOVERS; i++) {
        Mover* m = &movers[i];
        float mass = m->mass;
        
        //風フォース
        m->applyForces(wind);
        
        //重力フォース
        m->applyForces(gravity * mass);
        
        //friction
        ofVec3f friction;
        friction = m->velocity;
        friction *= -1;
        friction.normalize();
        friction *= mew;
        m->applyForces(friction);
        
        m->update();
    }
}

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

    for (int i = 0; i < NUM_MOVERS; i++) {
        Mover* m = &movers[i];
        m->draw();
    }
}