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

第6回の今回は、向きや大きさを持つ数字の集まりである「ベクトル」について解説します。

大西 武 (オオニシ タケシ)

2025年8月8日 6:30

はじめに

今回は「ベクトル」と、ベクトルの最低限必要な実装について解説します。普通の数字のことを「スカラ」と呼びますが、図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のようにバトルで能力がレベルアップしたり、装備を買ったり、マシンと違ってスタミナの要素もあったり、怪我したりして面白くならないでしょうか?

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30