前提・実現したいこと
processingにて以下のプログラムを組んでいます。
1.再帰を使って木の様なものを描画させる。
2.木の枝部分のランダムな位置に円を数個描画する。
2.minimで音情報を元に、円の色と大きさがランダムに変化する。
3.マウスクリックをすると、分割ファイルのクラス化した物理演算処理が
行われ、描画されている円から円が複数に分裂し四方八方に弾けて下に落ちる様に表現する。
※マウスクリック時の円の処理が文章で説明するのが難しい為、
該当のソースコードを実行して頂くと理解出来ると思います。
発生している問題・エラーメッセージ
1.木の色が指定した色にならず、黒色になってしまう。(恐らく指定されていない判定となっている) その為、背景のフェードの色と被ってしまい、木が見えなくなってしまう。 2.下記コードでは、円の描画位置を数値で一つずつ指定している。それを円の描画位置を指定した範囲内 のランダムな位置に指定する様に変更したいが、円がばらけなくなってしまう等の問題が起こり上手く 行かない。
該当のソースコード
processing
1import ddf.minim.*; 2import ddf.minim.analysis.*; 3import ddf.minim.effects.*; 4import ddf.minim.signals.*; 5import ddf.minim.spi.*; 6import ddf.minim.ugens.*; 7 8Minim minim; 9//AudioInput in; 10AudioPlayer player; 11 12//float volumeIn; 13float playerIn; 14float x; 15float y; 16int buffersize = 512; 17 18int NUM = 10; //パーティクルの数 19//パーティクルを格納する配列 20ParticleVec2[] particles = new ParticleVec2[NUM]; 21 22void setup() { 23 fullScreen(); 24 //size(1000, 500); 25 smooth(); 26 frameRate(60); 27 colorMode(HSB, 360, 100, 100, 100); 28 29 minim = new Minim(this); 30 // in = minim.getLineIn(Minim.STEREO,buffersize); 31 player = minim.loadFile("Mountain.mp3"); 32 player.loop(); 33 34 for (int i = 0; i < NUM; i++) { 35 //クラスをインスタンス化 36 particles[i] = new ParticleVec2(); 37 //初期位置は画面の中心に 38 particles[i].location.set(width/2.0, height/2.3); 39 /*//ランダムに加速度を設定 - ランダムの範囲を中央からの距離に 40 float angle = random(PI * 2.0); 41 float length = random(20); 42 float posX = cos(angle) * length; 43 float posY = sin(angle) * length; 44 particles[i].acceleration.set(posX, posY); 45 //下向きに0.1の重力 46 particles[i].gravity.set(0.0, 0.1); 47 //摩擦を0.01に 48 particles[i].friction = 0.01;*/ 49 } 50} 51 52void draw() { 53 //背景をフェードさせる 54 fill(0,31); 55 //fill(0, 0); 56 rect(0, 0, width, height); 57 noStroke(); 58 fill(100); 59 60 //パーティクルの位置を更新して描画 61 for (int i = 0; i < NUM; i++) { 62 //位置を更新 63 particles[i].update(); 64 //描画 65 particles[i].draw(); 66 //壁でバウンドさせる 67 particles[i].bounceOffWalls(); 68 } 69 70 //木 71 Tree(30, width/2, height, PI, width/8); 72 73 //地面 74 fill(#959592); 75 rect(0, 1030, 2000, 50); 76} 77 78//木の生成 79void Tree(float strokeWeight, float x, float y, float rotate, float length) { 80 pushMatrix(); //座標を一時保存 81 translate(x, y); //座標移動 82 rotate(rotate); //座標回転 83 strokeWeight(strokeWeight); //線の輪郭線の太さ 84 stroke(50, 0, 0); //線の色 85 line(0, 0, 0, length); //線の描画,配列の長さ 86 popMatrix(); //変更した座標を元に戻す 87 if (strokeWeight<2)return; 88 if (random(0, 4)>3 && strokeWeight<3)return; 89 Tree(strokeWeight*2/3, x-sin(rotate)*length, y+cos(rotate)*length, rotate-PI/10, length*2/3); 90 Tree(strokeWeight*2/3, x-sin(rotate)*length, y+cos(rotate)*length, rotate+PI/10, length*2/3); 91} 92 93void mouseClicked() { 94 //パーティクルの数だけくりかえし 95 for (int i = 0; i < NUM; i++) { 96 97 //ランダムに加速度を設定 - ランダムの範囲を中央からの距離に 98 float angle = random(PI * 2.0); 99 float length = random(20); 100 float posX = cos(angle) * length; 101 float posY = sin(angle) * length; 102 particles[i].acceleration.set(posX, posY); 103 //下向きに0.1の重力 104 particles[i].gravity.set(0.0, 0.1); 105 //摩擦を0.01に 106 particles[i].friction = 0.01; 107 PVector force = new PVector(cos(angle) * length, sin(angle) * length); 108 particles[i].addForce(force); 109 } 110} 111 112void stop() { 113 minim.stop(); 114 super.stop(); 115} 116////////////////////////////////// 117//分割ファイルa ↓ 118///////////////////////////////// 119// 物体の運動を計算(運動方程式) 120class ParticleVec2 { 121 PVector location; // 位置 122 PVector velocity; // 速度 123 PVector acceleration; // 加速度 124 PVector gravity; // 重力 125 float mass; // 質量 126 float friction; // 摩擦力 127 PVector min; // 稼動範囲(min) 128 PVector max; // 稼動範囲(max) 129 float radius; // パーティクル半径 130 // コンストラクタ 131 ParticleVec2() { 132 radius = 4.0; 133 mass = 1.0; // 質量は1.0に設定する 134 friction = 0.01; // 摩擦力を0.01に設定する 135 // 位置、速度、加速度を初期化する 136 location = new PVector(0.0, 0.0); 137 velocity = new PVector(0.0, 0.0); 138 acceleration = new PVector(0.0, 0.0); 139 gravity = new PVector(0.0, 0.0); // 重力なし 140 // 稼動範囲を設定する 141 min = new PVector(0.0, 0.0); 142 max = new PVector(width, height); 143 } 144 // 運動方程式から位置を更新 145 void update() { 146 acceleration.add(gravity); // 重力を加える 147 velocity.add(acceleration); // 加速度から速度を算出する 148 velocity.mult(1.0 - friction); // 摩擦力から速度を変化させる 149 location.add(velocity); // 速度から位置を算出する 150 acceleration.set(0, 0); // 加速度を0にリセット(等速運動)する 151 } 152 153 void draw() { 154 // volumeIn = in.mix.level()*200; 155 playerIn = player.mix.level()*200; 156 //strokeWeight(10); 157 //x = random(300, 1500); //横 158 //y = random(100, 500); //縦 159 noStroke(); 160 fill(random(255), random(255), random(255), 50); 161 // ellipse(x,y,volumeIn,volumeIn); 162 //ellipse(x, y, playerIn, playerIn); 163 ellipse(location.x, location.y, playerIn, playerIn); 164 ellipse(location.x*1.2, location.y, playerIn, playerIn); 165 ellipse(location.x/1.3, location.y, playerIn, playerIn); 166 } 167 168 // 壁でバウンドさせる 169 void bounceOffWalls() { 170 if (location.x > max.x) { 171 location.x = max.x; 172 velocity.x *= -1; 173 } 174 if (location.x < min.x) { 175 location.x = min.x; 176 velocity.x *= -1; 177 } 178 if (location.y > max.y) { 179 location.y = max.y; 180 velocity.y *= -1; 181 } 182 if (location.y < min.y) { 183 location.y = min.y; 184 velocity.y *= -1; 185 } 186 } 187 // 壁を突き抜けて反対から出現させる 188 void throughWalls() { 189 if (location.x < min.x) { 190 location.x = max.x; 191 } 192 if (location.y < min.y) { 193 location.y = max.y; 194 } 195 if (location.x > max.x) { 196 location.x = min.x; 197 } 198 if (location.y > max.y) { 199 location.y = min.y; 200 } 201 } 202 //力を加える 203 void addForce(PVector force) { 204 force.div(mass); //力と質量から加速度を算出 205 acceleration.add(force); //力を加速度に加える 206 } 207}
試したこと
・木の色が変えられないので、背景のフェード部分を無くしてみたが、背景のフェードが無いと
円が連なっているのが見えてしまい画面が大変な事になるのに気付いた。
・円の位置をランダムにしようとしたがパーティクルの設定と混じり訳が分からなくなってしまった。
補足情報(FW/ツールのバージョンなど)
Processing3.5.3、Windows10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/28 08:08 編集
2019/11/28 11:01
2019/12/01 05:17
2019/12/01 06:53