変換の合成
記号の意味
- ベクトル- 矢印付きの文字
- 長さ- ベクトルの大きさ
- 単位ベクトル- 長さ1のベクトル
- 内積- 2つのベクトルから数値を計算
- シータ- 角度を表すギリシャ文字
- 余弦- 角度から比率を求める関数
概要
行列の積を使って複数の変換(回転・拡大縮小・移動)を組み合わせ、複雑な動きを効率的に実装する方法を学びます。
変換合成の基本
変換の合成は、複数の変換を組み合わせることです。行列の積を使うと、回転しながら拡大するような複雑な動きを簡潔に表現できます。
実用例
- 回転しながら拡大: アイテムが回転しながら大きくなる演出
- 移動しながら回転: 弾が飛びながら回転する
- 複雑なアニメーション: 複数のエフェクトを重ねる
- キャラクターの関節構造: 腕や足の階層的な動き
行列の積
複数の変換を1つにまとめるには、行列を掛け算します:
この合成行列 を点に適用すると、、、 を順番に適用したのと同じ結果になります。
行列の掛け算
2×2行列の積は次のように計算します:
変換の順序
重要: 行列の掛け算は非可換です。つまり、順序を変えると結果が変わります:
非可換とは?順序が重要な理由
可換と非可換
- 可換: 順序を入れ替えても結果が同じ(例: 普通の足し算
2 + 3 = 3 + 2) - 非可換: 順序を入れ替えると結果が変わる(例: 行列の積)
具体例で理解する
想像してみてください:
- 「北に5歩進んでから、90度右回転」
- 「90度右回転してから、北に5歩進む」
この2つは全く違う場所に到着しますよね?
行列の積も同じで:
- 「回転 → 拡大」: 回転してから拡大(形が変わらない)
- 「拡大 → 回転」: 拡大してから回転(同じ結果)
でも:
- 「回転 → 移動」: 回転してから移動
- 「移動 → 回転」: 移動してから回転(違う場所に行く!)
変換を合成する時は、適用する順序を必ず意識しましょう。
例えば:
- 回転 → 拡大: 回転してから拡大
- 拡大 → 回転: 拡大してから回転
この2つは異なる結果になります。
JavaScriptでの実装
行列の積を計算
JavaScript
function multiplyMatrices(m1, m2) {
return {
a: m1.a * m2.a + m1.b * m2.c,
b: m1.a * m2.b + m1.b * m2.d,
c: m1.c * m2.a + m1.d * m2.c,
d: m1.c * m2.b + m1.d * m2.d
};
}
複数の変換を合成
JavaScript
// 回転行列を生成
function createRotation(angle) {
const rad = angle * Math.PI / 180;
return {
a: Math.cos(rad),
b: -Math.sin(rad),
c: Math.sin(rad),
d: Math.cos(rad)
};
}
// スケーリング行列を生成
function createScale(scaleX, scaleY) {
return {
a: scaleX,
b: 0,
c: 0,
d: scaleY
};
}
// 合成変換: 回転してから拡大
const rotation = createRotation(45);
const scale = createScale(2, 2);
const combined = multiplyMatrices(scale, rotation);
インタラクティブデモ
変換の順序を入れ替えて、結果の違いを確認しましょう。
変換の順序に注目
変換の順序を変えると、結果が変わります。ラジオボタンを切り替えて、矢印の向きと長さの違いを観察してみましょう。
回転 → 拡大の合成
拡大
1.500
0.000
0.000
1.500
回転
0.707
-0.707
0.707
0.707
合成
1.061
-1.061
1.061
1.061