今見てくれてる人の数

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

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

【openFrameworks 冒険記7】摩擦と重力を学ぶ。基礎体力作りだぞ。

こんな感じのを作ります。

f:id:sudara_bluse:20171111222053p:plain

 

www.sudara-bluse.tokyo

 

冒険記4で大量のバウンドするパーティクルを生成しました。

今回はこれに摩擦と重力を加えて、よりリアル(現実世界)に近い表現にしてみます。

yoppa.org

こちらのyoppa大先生の記事を参考に進めますが、理解したコードしか書きたくありません!

なので多少コードも違います。本家の方が信用できると思いますw

 

まずは摩擦(friction)を加えます。

だんだんパーティクルの動きが止まっていきます。

一つ一つの点に摩擦力(friction)が加わるようにしてみたいと思います。
摩擦力とは例えば空気抵抗や接地面の抵抗などと考えてください。
この摩擦力は常に速度ベクトルと反対の方向に働きます。
図示すると以下のように考えられるでしょう。

この摩擦力を実装するにあたり、色々方法はあるのですが、
速度ベクトルのかけ算と考えると実装が楽になります。

例えば摩擦力が0.1だとすると、最初1だった速度ベクトルは0.9になります。
さらに次のフレームでは0.9 x 0.9、その次には、0.9 x 0.9 x 0.9… というように指数的に減速していきます。

14091902

 

 

とのこと!

できました!

オリジナリティが欲しかったので、ofColorの配列作って、パーティクルをカラフルにしました^^

コードはこちら!

  

次はこれに重力(gravity)を加えます。

次に重力加えてみましょう。
重力は常に一定方向にかかり続ける力と考えられます。
摩擦力と違って重力は速度ベクトルの大きさに関わらず、つねに一定の力が掛り続けます。

14091903

update( ) 毎フレームのたびに、  force += ofVec2f(0, 0.4); 

で下に0.4の力を加算してます!

 

コードはこちら!

 

  

次は摩擦と重力、両方加えて、画面中心から円形に広がる!を表現します。

できた!

円形にちらばらせる箇所のコード。

本家と少し違います。難しいけど値をいじって体得しました。

理系ではないし、こういう表現はトライ&エラーで慣れだなーと思いました。

 

// ランダムなで円形に散らばる
float rad = i * (PI / 180); // ラジアン = 度数 * (π / 180)
float length = ofRandom(40);
velocity[i].x = cos(rad) * length;
velocity[i].y = sin(rad) * length;

 

全コードはこちら!

以上になります。

三角関数は難しいけど、かっこいいパーティクル表現には必須なので、

予定ないけどモテモテVJになる日が来るかもしれないので勉強しときます。笑

 

完。