pg11
先週の補足
Pythonで嫁を見つけた話 - みんなのPython第四版に寄せて http://coreblog.org/ats/thinking-about-minpy-4th/
Pythonで仕事をされている方のBlogで、Pythonやっててよかったという記事を見つけたので紹介します。
みんなのPython は大学の図書館にも第3版があります。Webアプリ編の関連書もあります。興味がある受講生は借りて勉強してみましょう。
Blender+Pythonによるdemo動画
テーマ アートとプログラム
ジェネラティブアート
映像・サウンド・画像などを生成するルールを決め、主にコンピュータでプログラムを実行して制作される作品
規則的で幾何学的な図形
プログラム+数式など
自然界にみられる動植物の縞模様・地形・樹木の形など複雑な形体
基本的な手法として、規則的な操作の積み重ねにより表現する
フラクタル図形・カオス理論を応用
※演習の注意
ブラウザは、 Google Chrome を使用してください。
インターネットエクスプローラー(IE)では、課題プログラムが動作しない、作成したプログラムが消える などの不具合が発生します。
Viscuit でパターン生成
PC版(Flash使用)
ぜんぶいり の やってみる から制作開始
iPad版Viscuitアプリ
NBUWiFiに接続してから、アプリを起動する。
魚アイコン → CS(コンピュータサイエンス)3桁数字アイコン → 鉛筆アイコン から制作開始
課題1
・生成(分裂・増殖)
・移動
・消滅(合体・衝突)
以上、3つのルールを組み合わせ、バターン(模様)を作成する。
※パターンをスクリーンショットで記録
課題2
・生成ルール 本体 → 本体 + 弾
↑ ・回転ルール追加
・弾のルール 弾 → 直進
※パターンをスクリーンショットで記録
↑直進する点のルール+回転発射
↓カーブする線のルール+回転発射
課題3
・音の生成ルール
・図形の生成(弾の発射)
・移動する図形 → 衝突 → 音発生 + 図形消滅
※パターンをスクリーンショットで記録
p5.js によるアニメーションとサウンド作成
メニューの start → Examples を開く
解説)
Interactivity 1 マウスに反応するプログラムの例。クリックで丸い図形を表示
Animation アニメーション処理の基本形
Animation のリンク↑をChromeで開き、 ↓ のマウスをクリックした位置に丸を移動するコードを追加する。
// When the user clicks the mouse
function mousePressed() {
x = mouseX;
y = mouseY;
}
↓の赤い部分の追加修正により、緑のドットを弾として発射する丸に変更する。
// Where is the circle
var x, y;
var mx, my;
function setup() {
createCanvas(720, 400);
noSmooth();
// Starts in the middle
x = width / 2;
y = height;
}
function draw() {
background(0);
// Draw a circle
stroke(50);
fill(100);
ellipse(mx,my, 24, 24);
// Jiggling randomly on the horizontal axis
x = x + random(-1, 1);
// Moving up at a constant speed
y = y - 1;
// Reset to the bottom
if (y < 0) {
y = height;
}
// Draw white points
stroke(0,255,0);
strokeWeight(4);
point(x, y);
}
// When the user clicks the mouse
function mousePressed() {
mx = mouseX;
my = mouseY;
x = mx;
y = my;
}
三角波の音源(osc)を追加する。
音の高さ(周波数 freq)を 緑のドットの x座標に対応させる。
音の大きさ(amp)を 同じく y 座標に対応させる。
// Where is the circle
var x, y;
var mx, my;
var osc;
function setup() {
createCanvas(720, 400);
noSmooth();
// Starts in the middle
x = width / 2;
y = height;
osc = new p5.TriOsc(); // set frequency and type
osc.amp(.5);
osc.start();
}
function draw() {
background(0);
// Draw a circle
stroke(50);
fill(100);
ellipse(mx,my, 24, 24);
// Jiggling randomly on the horizontal axis
x = x + random(-1, 1);
// Moving up at a constant speed
y = y - 1;
// Reset to the bottom
if (y < 0) {
y = height;
}
// Draw white points
stroke(0,255,0);
point(x, y);
// change oscillator frequency based on mouseX
var freq = map(x, 0, width, 40, 880);
osc.freq(freq);
var amp = map(y, 0, height, 1, .01);
osc.amp(amp);
}
// When the user clicks the mouse
function mousePressed() {
mx = mouseX;
my = mouseY;
x = mx;
y = my;
}
・音の触れ幅を変化させてみよう random(-1,1) を random(-10,10) に修正
・音の触れ幅を偏らせてみよう random(-1,1) を random(-4, 5) に修正
・音の周波数(高さ) freq を y に対応 var freq = map(x, 0, width, 40, 880);
音の大きさ amp を x に対応 var amp = map(y, 0, height, 1, .01);
に対応するように、x と y を入れ替えてみよう。
・弾のスピード(yの変化量)を -1 から別の値に変えて速度を上げてみよう(例 -3)。
・弾の数を増やしてみよう
例)
多数の弾を表示する座標を記録するため、配列(Array)で、1000個のメモリを準備。
マウスを押したときに、マウスのxy座標を弾の位置として記録。
記録された全ての弾を移動させ、表示するための for ループの追加。
// Where is the circle
var x, y;
var mx, my;
var osc;
var ax = new Array(1000);
var ay = new Array(1000);
function setup() {
createCanvas(720, 400);
noSmooth();
// Starts in the middle
x = width / 2;
y = height;
osc = new p5.TriOsc(); // set frequency and type
osc.amp(.5);
osc.start();
}
function draw() {
background(0);
// Draw a circle
stroke(50);
fill(100);
ellipse(mx,my, 24, 24);
// Jiggling randomly on the horizontal axis
x = x + random(-10, 10);
// Moving up at a constant speed
y = y - 1;
// Reset to the bottom
if (y < 0) {
y = height;
}
// Draw white points
stroke(0,255,0);
strokeWeight(4);
point(x, y);
// change oscillator frequency based on mouseX
var freq = map(y, 0, width, 40, 880);
osc.freq(freq);
var amp = map(x, 0, height, 1, .01);
osc.amp(amp);
if (mouseIsPressed) {
ax.pop();
ay.pop();
ax.unshift(mx);
ay.unshift(my);
}
for(var i=0; i<ax.length; i++) {
ax[i] = ax[i] + random(-1, 1);
ay[i] = ay[i] - 1;
point(ax[i], ay[i]);
}
}
// When the user clicks the mouse
function mousePressed() {
mx = mouseX;
my = mouseY;
x = mx;
y = my;
}
課題4
p5.js で作成したプログラムが動いている様子が分かるタイミングで、スクリーンショットを撮る。
※ 弾の動きが早いので、 キーボードの PrintScreen キー を押してメモリーにスクショを記録
→ ペイントブラシ(スタート→検索→pbrush)に貼り付け
を利用するとよい。
いろいろと工夫してみた↓
自身のy座標を3で割り、30で割った余りを求め、-3 ~ +3 の範囲に割り当てる。その値分、x座標をずらす。
課題1~4 の4つのスクリーンショットを WebClass にアップロードする。
弾幕アニメーション生成 → 今回はパス。
次回予告
テーマ Swift Playground でプログラム学習
準備:
iPad を iOS10 にアップデート
Swit Playgroud をapp store からダウンロード
iPad を持参