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

2025年8月8日(金)
大西 武 (オオニシ タケシ)
第6回の今回は、向きや大きさを持つ数字の集まりである「ベクトル」について解説します。

はじめに

今回は「ベクトル」と、ベクトルの最低限必要な実装について解説します。普通の数字のことを「スカラ」と呼びますが、図1のようにベクトルは向きや大きさを持つ数字の集まりで、一般に「二次元」「三次元」「四次元」のベクトルがあります。作ろうと思えば何次元でもベクトルにできると思いますが、基本的に3DCGではこの3つだけです。

図1:三次元ベクトルの概要

ベクトルとは

二次元(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のようにバトルで能力がレベルアップしたり、装備を買ったり、マシンと違ってスタミナの要素もあったり、怪我したりして面白くならないでしょうか?

著者
大西 武 (オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書など30冊以上を商業出版する作家。Microsoftで大賞やNTTドコモでグランプリなど20回以上全国区のコンテストに入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」が全国放送のTVで約10回出題。
https://profile.vixar.jp

連載バックナンバー

開発言語技術解説
第6回

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

2025/8/8
第6回の今回は、向きや大きさを持つ数字の集まりである「ベクトル」について解説します。
開発言語技術解説
第5回

「WebGPU」でシェーダーを使って三角形を1つだけ描画してみよう

2025/7/17
第5回の今回は、WebGPUでシンプルなシェーダーを使って三角形を描画する解説をします。
開発言語技術解説
第4回

はじめての「WebGPU」で背景色を塗りつぶしてみよう

2025/6/25
第4回の今回は、WebGPUを初期化してタグを真っ黒な背景色で塗りつぶしてみる解説をします。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています