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

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

三次元ベクトルの特殊な計算

次のベクトルの特殊な計算「ベクトルの長さ」「ベクトルの正規化」「内積」「外積」「ベクトルの増分」については、「class Vector3D { ここ }」の中にコーディングしてください。具体的な実装方法は、次のURLの「DOWNLOAD」からサンプルをダウンロードしてください。

・UltraMotion3DのWebサイト(必ずパソコンのGoogle Chromeで見てください)
https://webgpu.roxiga.com

ベクトルの長さ

ベクトルの長さ(距離)を計算するには「ピタゴラスの定理」を使います(図2)。ここでは二次元の距離を求めていますが、三次元では(X*X+Y*Y+Z*Z)の平方根を求めます。

図2:ピタゴラスの定理

・サンプルコード「lib」→「Vector3D.js」
  length() {
    return Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z);
  }

【サンプルコードの解説】
【サンプルコードの解説】
「length」メソッドでxプロパティの2乗とyプロパティの2乗、zプロパティの2乗を足したルート(sqrt関数)を戻り値にスカラで返します。

ベクトルの正規化

「正規化(ノーマライズ)」とは、ベクトルの長さを1にすることです。ベクトルをベクトルの長さで除算すると、長さ1のベクトルに変換できます。もしベクトルの長さが0の場合は、数学で0の除算(ZeroDivide)はあり得ないため場合分けをします。よく考えると、ここはベクトルの除算をしていました(汗)。

・サンプルコード「lib」→「Vector3D.js」
  normalize() {
    var l = this.length();
    if ( l == 0 ) {
      this.x = 0;
      this.y = 0;
      this.z = 1;
    } else {
      this.x /= l;
      this.y /= l;
      this.z /= l;
    }
  }

【サンプルコードの解説】
「normalize」メソッドでベクトルの長さを取得し、その長さが0の場合は(X,Y,Z)=(0,0,1)にして0以外はベクトルを長さで除算します。

内積

「内積(Dot Product)」は、2つのベクトルの向きの違いなどを調べることができます。AとBの内積を「A・B」のようにDot(ドット)で表記します。例えば、2つのベクトルが垂直より同じ方向に近いか反対向きに近いかをスカラで調べられます。

・サンプルコード「lib」→「Vector3D.js」
  dotProduct(v) {
    return (v.x * this.x + v.y * this.y + v.z * this.z);
  }

【サンプルコードの解説】
「dotProduct」メソッドでX1*X2+Y1*Y2+Z1*Z2を計算して内積を求め、戻り値で返します。

外積

外積(Cross Product)は2つのベクトルで表される平面に垂直なベクトル(法線)を求める計算です(図3)。AとBの外積を「A×B」のようにCross(クロス)で表記します。

図3:外積の概要図

・サンプルコード「lib」→「Vector3D.js」
  crossProduct(v) {
    const x = (this.y*v.z) - (this.z*v.y);
    const y = (this.z*v.x) - (this.x*v.z);
    const z = (this.x*v.y) - (this.y*v.x);
    return new Vector3D(x,y,z);
  }

【サンプルコードの解説】
「crossProduct」メソッドで(X,Y,Z)=(Y1*Z2-Z1*Y2,Z1*X2-X1*Z2,X1*Y2-Y1*X2)を計算して外積を求め、戻り値でそのベクトルを返します。

その他のベクトルの増分の計算

このUltraMotion3Dライブラリで使うその他の計算も実装しておきましょう。デルタ(増分)だけXとYとZに加算したとき、0度より小さければ360度加算し、360度以上なら360度減算して必ず0~360度未満にします。

・サンプルコード「lib」→「Vector3D.js」
  addX(delta) {
    this.x += delta;
    if ( this.x < 0 ) this.x += 360;
    if ( this.x >= 360 ) this.x -= 360;
  }
  addY(delta) {
    this.y += delta;
    if ( this.y < 0 ) this.y += 360;
    if ( this.y >= 360 ) this.y -= 360;
  }
  addZ(delta) {
    this.z += delta;
    if ( this.z < 0 ) this.z += 360;
    if ( this.z >= 360 ) this.z -= 360;
  }

【サンプルコードの解説】
「addX」メソッドでxプロパティにdelta引数を加算し、0より小さければ360加算し、360以上なら360減算します。
「addY」メソッドでyプロパティにdelta引数を加算し、0より小さければ360加算し、360以上なら360減算します。
「addZ」メソッドでzプロパティにdelta引数を加算し、0より小さければ360加算し、360以上なら360減算します。

おわりに

今回は二次元(2D)ベクトルの(X,Y)と三次元(3D)ベクトルの(X,Y,Z)、四次元(4D)ベクトルの(X,Y,Z,W)について、基礎知識とその計算方法について解説しました。

次回は「行列」を取り上げます。具体的には「三角関数」と「行列の計算の実装」について解説します。

著者
大西 武 (オオニシ タケシ)
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メルマガ会員のサービス内容を見る

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