拡大縮小とせん断

記号の意味
ベクトル- 矢印付きの文字
長さ- ベクトルの大きさ
単位ベクトル- 長さ1のベクトル
内積- 2つのベクトルから数値を計算
シータ- 角度を表すギリシャ文字
余弦- 角度から比率を求める関数

概要

拡大縮小(スケーリング)とせん断(シアー)の行列変換を使って、オブジェクトのサイズや形を変える方法を学びます。

スケーリング(拡大縮小)

スケーリングは、オブジェクトのサイズを変える変換です。キャラクターを大きくしたり、ズーム効果を作ったりできます。

実用例

  • キャラクターの大きさ変更: プレイヤーのサイズを変える
  • ズーム効果: カメラのズームイン・ズームアウト
  • パワーアップ演出: アイテム取得時に一瞬大きくする

スケーリング行列

等方性スケーリング(縦横同じ倍率)

縦横を同じ倍率 ss で拡大縮小する場合:

[s00s]\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix}

例えば、2倍に拡大する行列は:

[2002]\begin{bmatrix} 2 & 0 \\ 0 & 2 \end{bmatrix}

非等方性スケーリング(縦横別々の倍率)

x方向を sxs_x、y方向を sys_y で拡大縮小する場合:

[sx00sy]\begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix}

例えば、横に2倍、縦に0.5倍(半分)にする行列は:

[2000.5]\begin{bmatrix} 2 & 0 \\ 0 & 0.5 \end{bmatrix}

スケーリングの使い分け

  • 等方性スケーリング: オブジェクト全体を拡大・縮小(形を保つ)
  • 非等方性スケーリング: 縦横比を変える(引き伸ばす・潰す)

ゲームでは、ジャンプの着地時に少し潰すような演出で非等方性スケーリングがよく使われます。

JavaScriptでの実装

スケーリング行列の生成

JavaScript
function createScaleMatrix(scaleX, scaleY) {
  return {
    a: scaleX,
    b: 0,
    c: 0,
    d: scaleY
  };
}

点をスケーリング

JavaScript
function scalePoint(x, y, scaleX, scaleY) {
  const matrix = createScaleMatrix(scaleX, scaleY);
  return {
    x: matrix.a * x + matrix.b * y,
    y: matrix.c * x + matrix.d * y
  };
}

// 使用例
const scaled = scalePoint(1, 1, 2, 0.5);
console.log(scaled); // { x: 2, y: 0.5 }

インタラクティブデモ

x方向とy方向の倍率を個別に変更して、スケーリングの効果を確認しましょう。

スケーリング行列
X倍率
1.50
0.00
0.00
Y倍率
1.50

スケーリングタイプ: 等方性(縦横同じ)