Processing の transform(4) ~rotate 後編~
2010/06/25 21:56 - Processing
前回のあらすじ。
Processing における rotate と translate を、ActionScript の Matrix クラスの tansform 系メソッドで表現しようとしたら、メチャクチャ面倒臭くなった。
それは、行列の乗算は交換法則が成り立たない、という数学的性質に起因する問題。 でも二次元の Matrix ではなく、三次元の Matrix3D なら transform 系メソッドで乗算の順序をコーダがたしか制御できたよなぁ、と私のゴーストが囁くのよ。
それを確認するために「ActionScript 3.0による三次元表現ガイドブック」を本置き場から拾い上げたのだった。
Matrix の transform 系メソッドは、平行移動の translate、拡大縮小の scale、回転の rotate が存在します。
しかし Matrix3D はその3つはそれぞれ append と prepend の2種類に分かれています。
translate に対して appendTranslation と prependTranslation。
scale に対して appendScale と prependScale。
rotate に対して appendRotation と prependRotation。

それぞれ prepend は対象の変更を Matrix3D の先頭に、append は対象の変更を Matrix3D の末尾に付け加えます。
で、Processing のサンプルと同じような結果にするには ActionScript では Matrix3D を使ってどう書くのか。
↓のように書けば良いようです。
なお、1つの Matrix3D を複数の DisplayObject に適用することはできないとのこと。 ↑の17行目を↓のように書いたら、コンパイラに怒られちゃいましたよ。
なので clone() を実行しています。
ちなみに prepend×××ではなく append×××を使うとどのようなコードになるのかを以下に示します。
前回、Matrix の translate と rotate で試したのと、全く同じウザい処理が必要になるのでした(20、23行目)。