【ベクトル】をわかりやすくするコツ〜『ベクトル』はただの数値の組み合わせです(4)【P5.js】
2020/6/5追記 ベクトルに関する動画を追加しました。
遊ぶようにプログラミングができて、
デザインやアートをつくれる『クリエイティブコーディング』を、
『P5.js(ProcessingのJavaScript版)』を使っていろいろ試しているうちに、
もっと自然に、
ボールや図形を動かしたいなと思うようになってきて。
自然に動かすとなると『数学』や『物理』の知識が必要になってきます。
今回のお題は『ベクトル』。
できるだけわかりやすく、使えるこなせるようになるために、
『ベクトル』についてまとめてみることにしました。
『ベクトル』とは、ただの数字の組み合わせ
『物理』の教科書や参考書を見るとよく、
『ベクトル』とは、向きと大きさです。
という表現がでてくるのですが、
プログラミング的に見ると、
『ベクトル』といっても、ただの座標や数字だよなぁ・・
と思ったりします。
いろいろググってふに落ちたのは、
という表現。
他にも、
という表現もありました。
要は、
2つ以上の数字のセットが
『ベクトル』という名前になっているだけ
という事。
2次元(2D)の場合は、X座標とY座標の2つの値で、
3次元(3D)の場合は、X座標、Y座標、Z座標の3つの値がセットということになります。
ただの数字の組み合わせなので、
4つや5つの数字の組み合わせ、ということもありえますが、
図にできないので、
『クリエイティブコーディング』的には対象外かなと思います。
4つ以上の『ベクトル』は、『機械学習』などの『分析』で必要になるようです。
『ベクトル』の使い方 足し算・引き算
2次元(2D)に限定すると、
『ベクトル』は、XとYの2つの数字をもった値になります。
例えばXが1、Yが2なら、
となり、
Xが 3、Yが5なら
になります。
『ベクトル』を足し算する場合は、
XとXを足して、YとYを足し算すればOKなので、
(1 + 3 , 2 + 5) = (4 , 7)
ということになります。
引き算も同じように、XとYでそれぞれ引き算すればOKです。
『P5.js(ProcessingのJavaScript版)』の場合は、
『translate』関数が『ベクトル』の足し算や引き算と同じような動きをします。
『push』関数と『pop』関数を使ってリセットをしないと、
ずっと座標が足し算(もしくは引き算)されていきます。
参考記事
『ベクトル』を使わないでボールを動かしてみる
『ベクトル』と言っても数字の組み合わせなだけなので、
『ベクトル』として使わなくても、
X座標、Y座標をそれぞれ作って変化させていけば、
ボールを動かすことはできます。
See the Pen
p5.js vector-test by aoki_monpro (@suica)
on CodePen.
ちょうどいい資料があったのでご紹介しておきます。
参考資料
第5回: 動きを生みだす – アニメーションとベクトル
コードはこちら。
let locationX, locationY;
let velocityX, velocityY;
function setup() {
createCanvas(200, 200);
colorMode(HSL, 360, 100, 100, 100);
locationX = width / 2; // Xの位置
locationY = height / 2; // Yの位置
velocityX = 2; // Xの速度
velocityY = 3; // Yの速度
}
function draw() {
background(0);
locationX = locationX + velocityX; // Xの位置にXの速度を足してXの位置を変えている
locationY = locationY + velocityY; // Yの位置にYの速度を足してYの位置を変えている
fill(160, 100, 50, 100);
ellipse(locationX, locationY, 20, 20);
if( locationX < 0 || locationX > width){
velocityX = velocityX * -1;
}
if(locationY < 0 || locationY > height){
velocityY = velocityY * -1;
}
}
座標の値を locationX, locationY という変数で設定して、
速度を velocityX、velocityY という変数で設定しています。
変数の名前はなんでもいいんですが、意味がわかるように、
座標位置を表すならpositionやlocation
速度を表すなら velocity がいいのかなと思います。
locationX(座標のX(横)に velocityX(Xの速度)を足して、
locationY(座標のYに(縦))に velocityY(Yの速度)を足す、
というような内容で、ボールの動きを実現しています。
『ベクトル』を使ってボールを動かしてみる
次に、『ベクトル』を使ってボールを動かしてみます。
See the Pen
p5.js vector-test2 by aoki_monpro (@suica)
on CodePen.
こちらも下記資料を参考にさせていただいています。
参考資料
第5回: 動きを生みだす – アニメーションとベクトル
コードはこちら。
let vecLocation;
let vecVelocity;
function setup() {
createCanvas(200, 200);
colorMode(HSL, 360, 100, 100, 100);
vecLocation = createVector(width / 2, height / 2); // ベクトルとすると、XとYまとめて位置を指定できる
vecVelocity = createVector(2, 3); // ベクトルとすると、XとYまとめて速度を指定できる
}
function draw() {
background(0);
vecLocation.add(vecVelocity);
fill(160, 100, 50, 100);
ellipse(vecLocation.x, vecLocation.y, 20, 20); // .xや.yとつけることで、X成分 Y成分それぞれを指定できる
if( vecLocation.x < 0 || vecLocation.x > width){
vecVelocity.x = vecVelocity.x * -1;
}
if(vecLocation.y < 0 || vecLocation.y > height){
vecVelocity.y = vecVelocity.y * -1;
}
}
先ほどは、
- 座標位置 locationXとlocationY
- 速度 velocityXとvelocityY
とそれぞれ2つ、計4つの変数を設定していたのに対し、
ベクトルを使うと2つの変数に収まります。
- 座標位置 vecLocation
- 速度 vecVelocity
2Dの『ベクトル』なので、1つの変数の中にXとY 2つ設定できるかたちです。
『createVector(X, Y)』という関数で、『Vector(ベクトル)』クラスをインスタンス化します。
『Vector』はクラスなので、実際に使う際はインスタンス化(実体化)させる必要があります。
参考記事
『P5.js(ProcessingのJavaScript版)』の『Vector』にはいくつかのメソッド(命令)が用意されていて、
例えば『ベクトル』の足し算をする場合は、
『Vector.add』メソッドを使うことで実現できます。
『ベクトル』は2つ以上の数値を持っているので、
- 『ベクトル』のX座標・・『Vector.x』
- 『ベクトル』のY座標・・『Vector.y』
という形で指定する必要があります。
例) ellipse(vecLocation.x, vecLocation.y, 20, 20);
変数を4つつくってそれぞれ動かすよりも、
『ベクトル』・・XとY 2つのセット
としておく方が認識しやすいし、
便利なメソッドも使えるので、
慣れてきたらなるべく『ベクトル』を使えるようにしたいですね。
『Vector』クラスにはadd以外にももいろんなメソッドがあります。詳しくはリファレンスを参照ください。
『P5.js』リファレンス p5.Vector
『ベクトル』の使い方 まとめ とりあえず動かしてみる
『ベクトル』と聞くとなんとも難しい印象を受けるし、
という状態だったので、
という理解でプログラミングを描くようにすると、
すんなり理解することができるようになりました。
教科書だけ読んでいてもなんかピンとこないなぁと思ったら、
レッツプログラミング、ですな。
2019/9/21追記
『ベクトル』は向きと大きさ、というのがようやくわかった感があります。
『ベクトル場』はまさにドラクエでいうところの『すべる床』ですな。
参考記事
『数学・物理』関係ではこんな記事も読まれています。
1.
【P5.js】初心者向けの動画をリリースしました(プログラミング×数学物理)【Udemy】2.
【ベクトル】をわかりやすくするコツ〜『ベクトル』はただの数値の組み合わせです(4)【P5.js】3.
プログラムで数学も身につく 一石四鳥なクリエイティブコーディング4.
【三角関数】の使い方〜わかりやすさ重視でまとめてみた【動画あり】
5.
【ラジアン】とは わかりやすくまとめてみた【初心者向け】6.
【図解】波の用語や動きをプログラムも交えてまとめてみる【数学&物理】7.
【微分】とは わかりやすくまとめてみた〜めっちゃすごいわり算【初心者向け】
8.
【シグマ(∑)】計算をわかりやすくまとめてみた【エクセルのsum】【初心者向け】
9.
【極座標 】とは【直交座標 】との違いや変換方法についてまとめてみた
10.
【虚数】【複素数】とは わかりやすくまとめてみた【初心者向け】11.
【指数】とは わかりやすくまとめてみた【初心者向け】12.
【対数】とは わかりやすくまとめてみた【初心者向け】13.
順列・組み合わせ・階乗とは わかりやすくまとめてみた【数学】14.
【確率(加法定理)】とは わかりやすくまとめてみた【初心者向け】15.
【ベクトル場】と【速度ベクトル】とは わかりやすく【ドラクエのすべる床】↓ ここから下は物理関連
1.
プログラムで【加速度】をわかりやすくするために実際に動かしてみる(5)【P5.js】2.
【流体力学】とは 圧力・密度・浮力をまとめてみた【初心者向け】
↓ ここから下はちょいムズカシイ
1.
【ネイピア数】とは わかりやすくまとめてみた【自然対数の底(e)】2.
【ベクトル解析 勾配(grad)】わかりやすくまとめてみた3.
【ベクトル解析 発散(div)】わかりやすくまとめてみた4.
【テイラー展開】をわかりやすくまとめてみた【おすすめ動画あり】
『クリエイティブコーディング』関係ではこんな記事も読まれています。
1.
【P5.js】初心者向けの動画をリリースしました(プログラミング×数学物理)【Udemy】2.
【JavaScript】初心者向けの動画をリリースしました【Udemy】3.
プログラミング実況をやってみた その1【P5.js】
4.
【P5.js】遊ぶようにプログラムできるクリエイティブコーディング〜はじめのいっぽ〜(1)5.
移動・回転・拡大縮小を覚えると表現に幅がでてきます(2)【P5.js】6.
【CSS】色の指定なら『RGB』より『HSL』の方が使いやすい件〜ランダムで使いたい(3)【P5.js】7.
『ベクトル』の使い方のコツ〜『ベクトル』はただの数値の組み合わせです(4)【P5.js】8.
プログラムで【加速度】【速度】の使い方をわかりやすく (5)【P5.js】9.
プログラムの【配列】をわかりやすく『ゴディバ』で例えてみる(6)【P5.js】10.
プログラムの関数をわかりやすく使ってみる〜自動販売機に例えてみる〜(7)【P5.js】11.
プログラムで色や大きさをランダムにして遊んでみる(8)【P5.js】12.
【3Dプログラム】初心者にオススメな方法はこれ(9)【P5.js】13.
プログラムで図形の描き方~頂点と【バラ曲線】を使って〜 (10)【P5.js】14.
【三角関数】をプログラムで使う方法をまとめてみた(11)【P5.js】15.
プログラムで数学も身につく 一石四鳥なクリエイティブコーディング
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m
アオキのツイッターアカウント。
関連
この記事へのコメントはありません。