Processingにおいて、ベクトルは大変重要な概念で、物理的な量を表現したり、空間内の点を操作したりする際に利用されます。ベクトルを用いることで、空間上の位置、速度、加速度、力など物理的な量をシンプルに表現することができます。Processingでは、PVector
クラスを用いて、ベクトルを表現し、操作できます。
目次
ベクトルの基本
PVectorクラスの基本
PVector
クラスは、2Dまたは3Dのベクトルを表現します。一般的には、2Dベクトルの場合、x成分とy成分を、3Dベクトルの場合、x成分、y成分、z成分を持ちます。
PVector vec = new PVector(3, 4); // x=3, y=4の2Dベクトルを作成
ベクトルの基本操作
PVector
クラスには、ベクトルに対する基本的な数学的操作が用意されています。
加算
PVector v1 = new PVector(3, 4);
PVector v2 = new PVector(1, 2);
PVector sum = PVector.add(v1, v2); // (4, 6)のベクトルが得られる
減算
PVector v1 = new PVector(3, 4);
PVector v2 = new PVector(1, 2);
PVector diff = PVector.sub(v1, v2); // (2, 2)のベクトルが得られる
スカラー倍(乗算)
PVector v1 = new PVector(3, 4);
PVector v2 = new PVector(1, 2);
PVector scaled = PVector.mult(v1, 2); // (6, 8)のベクトルが得られる
正規化
PVector v1 = new PVector(3, 4);
PVector norm = v1.copy();
norm.normalize(); // ベクトルの長さ(マグニチュード)が1になる
その他にも様々にベクトルに関する演算が用意されています。
mag() : ベクトルの大きさを計算
setMag() : ベクトルの大きさを任意の値に設定
limit() : ベクトルの大きさを制限
heading() : 角度で表される2次元ベクトルの方向
rotate() : 指定した角度2次元ベクトルを回転
lerp() : 別のベクトルに関して線形補完(2つのベクトルを始点、終点としてその間の点を終点とするベクトルを生成する)
dist() : 2つのベクトルの終点の間のユークリッド距離
angleBetween() : 2つのベクトル間の角度
dot() : 2つのベクトルのドット積(内積)
cross() : 3次元ベクトルの2つのベクトルのクロス積(外積)
random2D() : ランダムな2次元ベクトルの生成
random3D() : ランダムな3次元ベクトルの生成
なぜベクトルを用いるのか?
ベクトルを用いることで、コンピュータグラフィックスや物理シミュレーションにおいて多くの利点があります。以下は、ベクトルを使用する理由とその利点です。
1. 空間の表現:
ベクトルは空間内の点や方向を表現するのに適しています。2Dや3D空間において、位置、速度、加速度などを効率的に表現できます。
2. 直感的な操作:
ベクトルは幾何学的な操作が直感的に行えます。加算、減算、スカラー倍、内積、外積などの操作が定義されており、これにより、回転、拡大縮小、投影などの幾何学的な変換が容易になります。
3. 物理シミュレーション:
ベクトルを使用すると、力の加算、速度の計算、運動のシミュレーションなど、物理的な挙動を効率的かつ正確にシミュレートできます。
4. コードの整理:
x、y、z座標を個別の変数として扱う代わりに、一つのベクトルオブジェクトとして管理できます。これにより、コードが整理され、バグの発生が減少します。
5. 効率の向上:
特定の操作、例えば、ベクトルの正規化や距離の計算などは、ライブラリに最適化されたメソッドが提供されているため、手作業で計算するより効率が良いです。
6. アニメーションとトランジション:
ベクトルの補間機能を使用すると、アニメーションやトランジションを滑らかに表現できます。オブジェクトの初期位置と終了位置の間での移動は、ベクトルの線形補間によって容易に実現できます。
7. 相互作用の記述:
ベクトルを用いると、オブジェクトの衝突検知や反射など、他のオブジェクトや境界との相互作用を計算するのが容易になります。
ベクトルで「運動」を記述する
ベクトルを用いて運動を記述するには、「位置」、「速度」、「加速度」という3つの要素をベクトルで表現し、それらの関係を用いて物体の運動をシミュレートします。
1. 位置ベクトルの実装
位置ベクトルは、オブジェクトの空間内の位置を表します。2D空間の場合、x成分とy成分を持つベクトルで表現されます。
PVector position = new PVector(100, 100); // x=100, y=100の位置に設定
2. 速度ベクトルの実装
速度ベクトルは、オブジェクトの速度を表します。位置ベクトルに速度ベクトルを加えることで、オブジェクトの新しい位置を計算できます。
PVector velocity = new PVector(2, 3); // x方向に2, y方向に3の速度を設定
3. アニメーションの実装
draw関数内で、位置ベクトルに速度ベクトルを加えることで、フレームごとにオブジェクトの位置を更新し、アニメーションを実現します。
PVector position = new PVector(100, 100); //位置ベクトル
PVector velocity = new PVector(2, 3); //速度ベクトル
void setup(){
size(400, 400);
}
void draw() {
background(255);
ellipse(position.x, position.y, 20, 20); // 現在の位置に円を描画
position.add(velocity); // 位置ベクトルに速度ベクトルを加えて、位置を更新
}
※位置ベクトル、速度ベクトルというのはベクトルに種類があるわけではなく、位置を表すベクトル、速度を表すベクトルという意味で使われる言葉で本質はどちらもただのベクトルです。
4. 加速度ベクトルの実装
加速度ベクトルは、オブジェクトの速度の変化を表します。速度ベクトルに加速度ベクトルを加えることで、オブジェクトの新しい速度を計算できます。
PVector acceleration = new PVector(0.1, 0.2); // x方向に0.1, y方向に0.2の加速度を設定
5. 加速度を用いたアニメーションの実装
draw関数内で、速度ベクトルに加速度ベクトルを加え、位置ベクトルに速度ベクトルを加えることで、フレームごとにオブジェクトの速度と位置を更新し、加速度がかかるアニメーションを実現します。
PVector position = new PVector(100, 100); //位置ベクトル
PVector velocity = new PVector(2, 3); //速度ベクトル
PVector acceleration = new PVector(0.1, 0.2); //加速度ベクトル
void setup(){
size(400, 400);
}
void draw() {
background(255);
ellipse(position.x, position.y, 20, 20); // 現在の位置に円を描画
velocity.add(acceleration); // 速度ベクトルに加速度ベクトルを加えて、速度を更新
position.add(velocity); // 位置ベクトルに速度ベクトルを加えて、位置を更新
}
これらのステップを通じて、ベクトルを使用してオブジェクトの位置、速度、加速度を表現し、自然な動きのアニメーションを実現できます。これにより、物理法則に基づくリアルなシミュレーションやゲームの動きなど、多くのアプリケーションで利用することができます。
演習
問題1: 基本的なベクトルの作成
PVector
クラスを使用して、x=3,y=4の2Dベクトルを作成し、コンソールに出力してください。
問題2: ベクトルの加算
- 2つのベクトルv1(x=3,y=4)、v2(x=1,y=2)を作成し、これらの加算結果をコンソールに出力してください。
問題3: ベクトルの減算
- 2つのベクトルv1(x=5,y=3)、v2(x=2,y=1)を作成し、これらの減算結果をコンソールに出力してください。
問題4: ベクトルのスカラー倍
- ベクトルv1(x=2,y=3), v2(x=2,y=3)を作成し、スカラー値
5
で倍した結果をコンソールに出力してください。
問題5: ベクトルの正規化
- ベクトルv(x=3,y=4)を作成し、このベクトルを正規化してコンソールに出力してください。
問題6: ベクトルを用いた位置の移動
- ベクトルを使用して、円の位置を表現し、キーボードの矢印キーを用いて円を動かしてください。
問題7: ベクトルを用いた速度と加速度
- ベクトルを使用して、円の速度と加速度を表現し、円が加速度に従って動くアニメーションを作成してください。
問題8: マウス追跡
- マウスの位置ベクトルと円の位置ベクトルの差を計算し、円がマウスカーソルの位置に徐々に移動するアニメーションを作成してください。
問題9: 反射のシミュレーション
- ベクトルを用いて、壁に当たった時の円の反射をシミュレートしてください。
問題10: 重力のシミュレーション
- ベクトルを使用して、重力の影響を受けるオブジェクトの落下をシミュレートしてください。重力の強さは適当な値を自分で設定して良い(例えば、PVector gravity = new PVector(0, 0.01)など。※Processingではy軸は下向きであることに注意)