Wonderfl に投稿してみた 第2作目
2008/12/25 21:49 - AS3.0
昨日、flash.geom.Matrix を使った歪み変形をおこなうマウスストーカーを Wonderfl 投稿しました。
ところで FlashPlayer10 から Matrix3D という三次元を扱うための変換行列クラスが導入されたのは皆さんご承知のことと思います。 今回は上記のマウスストーカーを Matrix ではなく Matrix3D で作ってみようじゃないの、というお話。
Matrix は a、b、c、d、tx、ty というプロパティを使って、その行列要素に個別にアクセスすることができますね。
オブジェクトを単に移動・回転・拡大縮小させるだけなら専用のメソッドが用意されているので、これらのプロパティを意識する必要はありません。 しかし歪み変形をさせたい場合は意識せざるを得ない。
ヘルプによると、c はX軸方向、b はY軸方向に影響を与えるとなっています。
ですので、b もしくは c に 0 以外の数値を代入すると、オブジェクトが平行四辺形に歪むわけです。
では Matrix3D はどうか。
Matrix3D は Matrix と異なり、その行列要素に個別にアクセスするプロパティは存在しません。 かといって、歪み変形をさせるメソッドを持っているわけでもありません。
じゃあどんすんだよ。
Matrix3D はその要素に個別にアクセスすることはできませんが、16個の要素に一括してアクセスする手段が用意されているのでした。
Matrix3D.rawData というプロパティがそれです。 rawData はゲッター、セッター両方あり。 こいつを使えば、歪み変形ができそうです。
ところで rawData は Vector.<Number> ですが、アクセス演算子[ ] を使ってダイレクトに行列個別要素を書き換えることはできないようです。
別途 Vector.<Number> の変数を用意して、一旦その変数に代入、その変数を更新して、あらためて rawData を更新するという手段をとらなければならないことがわかりました。
ダメな例
このようなコードでは行列要素を更新することはできない。
良い例
このようなコードで行列要素を更新する。
Matrix に比べると、ほんのちょっとだけ面倒といえば面倒かなーって感じすね。
上記ブログパーツのコードを見ていただくとお分かりのとおり、マウスを横に動かした場合は行列要素[2]に、マウスを縦に動かした場合は行列要素[6]に影響を与えるようになっています。 ↓な感じ。
┌ ┐ │1 0 vx 0│ │0 1 vy 0│ │0 0 1 0│ │0 0 0 1│ └ ┘
マウスを水平あるいは垂直に動かした場合は別にどうってことないんですが、マウスを対角線上に動かすと、オブジェクトの変形がファンキー過ぎて、自分でコーディングしといてこんなこと言うもの何ですが、ちょっとコワいです。
ちなみに行列要素[1]にvyを、行列要素[4]にvxを割り当てると Matrix と同じ状態になります。
┌ ┐ │ 1 vy 0 0│ │vx 1 0 0│ │ 0 0 1 0│ │ 0 0 0 1│ └ ┘