2D〜4Dで向きや大きさを持つ数字の集まり「ベクトル」について学ぼう

はじめに
今回は「ベクトル」と、ベクトルの最低限必要な実装について解説します。普通の数字のことを「スカラ」と呼びますが、図1のようにベクトルは向きや大きさを持つ数字の集まりで、一般に「二次元」「三次元」「四次元」のベクトルがあります。作ろうと思えば何次元でもベクトルにできると思いますが、基本的に3DCGではこの3つだけです。
ベクトルとは
二次元(2D)ベクトルは(X,Y)、三次元(3D)ベクトルは(X,Y,Z)、四次元(4D)ベクトルは(X,Y,Z,W)で表されます。高校の数学で習うので皆さんもご存知でしょう。四次元ベクトルは高校数学では習いませんが、三次元ベクトルと同じように使います。四次元ベクトルは三次元ベクトルに1つ「W」座標のオマケが付いています(後述)。
それでは、これらのベクトルをプログラミングして、使えるようになりましょう。
二次元ベクトル
横のX座標と縦のY座標がある二次元で向きや大きさを持つのが二次元ベクトルです。「横にいくら進んだか」「縦にいくら進んだか」「どれだけの距離進んだか」を表します。また原点0からどの方向にどれだけ進んだかで頂点の座標を表すこともできます。モニターの画面はまさに横と縦しかない二次元です。
・二次元ベクトルの書式class Vector2D { constructor(x,y) { this.x = x; this.y = y; } } let v = new Vector2D(0,0);
三次元ベクトル
横のX座標と縦のY座標、奥行きのZ座標がある三次元で向きや大きさを持つのが三次元ベクトルです。「横にいくら進んだか」「縦にいくら進んだか」「手前奥にいくら進んだか」「どれだけの距離進んだか」を表します。また原点0からどの方向にどれだけ進んだかで頂点の座標を表すこともできます。ちょっと話は逸れますが、よく耳にする「3DCG」は表示するモニター画面は横と縦しかない二次元なので、結局2DCGの一種と言えます。
・三次元ベクトルの書式class Vector3D { constructor(x,y,z) { this.x = x; this.y = y; this.z = z; } } let v = new Vector3D(0,0,0);
四次元ベクトル
横のX座標と縦のY座標、奥行きのZ座標と、さらにもう1つW座標がある四次元で向きや大きさを持つのが四次元ベクトルです。XYZについては三次元ベクトルと同じく、「横にいくら進んだか」「縦にいくら進んだか」「手前奥にいくら進んだか」「どれだけの距離進んだか」を表します。また原点0からどの方向にどれだけ進んだかで頂点の座標を表すこともできます。
厳密には違うと思いますが、次回で解説する「行列」は4行×4列で、ベクトルを行列に乗算するには4列のベクトルがなくては計算できません。そのため四次元ベクトルが必要になります。Wの値が1のとき(X,Y,Z)は平行移動を表し、それ以外のときは回転を表します。
・四次元ベクトルの書式class Vector4D { constructor(x,y,z,w) { this.x = x; this.y = y; this.z = z; this.w = w; } } let v = new Vector4D(0,0,0,1);
三次元ベクトルの四則演算
ベクトルの加算には「add」関数を、減算には「subtract」関数を、乗算には「mul」関数を実装します(UltraMotion3Dではベクトルの除算を使用しないため省略)。
なお、次のサンプルコードでベクトルの加減乗除を計算する際は「class Vector3D { ここ }」の中にコーディングしてください。
・サンプルコード「lib」→「Vector3D.js」add(v) { const x = this.x + v.x; const y = this.y + v.y; const z = this.z + v.z; return new Vector3D(x,y,z); } subtract(v) { const x = this.x - v.x; const y = this.y - v.y; const z = this.z - v.z; return new Vector3D(x,y,z); } mul(v) { const x = this.x * v; const y = this.y * v; const z = this.z * v; return new Vector3D(x,y,z); }
【サンプルコードの解説】
add関数はベクトル同士の加算で(X,Y,Z)=(X1+X2,Y1+Y2,Z1+Z2)です。
subtract関数はベクトル同士の減算で(X,Y,Z)=(X1-X2,Y1-Y2,Z1-Z2)です。
mul関数はベクトルにスカラを乗算する計算で(X,Y,Z)=(X1*値1,Y1*値1,Z1*値1)です。
3Dプログラミングと言えば、やっぱり3Dゲームですよね。例えば、ローラースケートは一般のレースゲームのように車などを買うのではなく、RPGのようにバトルで能力がレベルアップしたり、装備を買ったり、マシンと違ってスタミナの要素もあったり、怪我したりして面白くならないでしょうか?
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 「WebGPU」でシェーダーを使って三角形を1つだけ描画してみよう
- 物理エンジン「Tiny2D.js」のソースコード詳説
- WebGPUライブラリ「UltraMotion3D」で3DのサンプルWebコンテンツを動かしてみよう
- Android Studioサンプルアプリ解説集- 箱入り娘ゲームBoxGirl
- はじめての「WebGPU」で背景色を塗りつぶしてみよう
- ES2015で導入された、より洗練された構文 Part 1
- 「Flutter」のプロジェクト構造と状態管理でアプリ開発を標準化する
- ECMAScript
- WebGPUを使うための「HTML5+CSS+JavaScript」の文法を学ぼう
- JDO APIとLow-Level APIの違いと基本CRUD処理