三次元変換行列(8)
2008/05/13 21:35 - AS3.0
メソッドのコードの続き。
最後の移動系メソッドの話です。
拡大縮小(scale)
平行移動(translate)のときと同様、拡大縮小の行列と単位行列を見比べてみます。
単位行列 平行移動 | 1 0 0 0 | | sx 0 0 0 | | 0 1 0 0 | | 0 sy 0 0 | | 0 0 1 0 | | 0 0 sz 0 | | 0 0 0 1 | | 0 0 0 1 |
これまた両者の構造はよく似ています。
ただ、対角線上の1の部分の成分の値が変化しているので、平行移動のときよりも計算結果の変動の幅は大きそうです。
こいつも実際に掛け算をおこない、concat() をトレースしてみましょう。
| na nb nc ntx | | sx 0 0 0 | | a b c tx | | nd ne nf nty | = | 0 sy 0 0 | * | d e f ty | | ng nh ni ntz | | 0 0 sz 0 | | g h i tz | | 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 | ↓ na = sx*a + 0*d + 0*g + 0*0; nb = sx*b + 0*e + 0*h + 0*0; nc = sx*c + 0*f + 0*i + 0*0; ntx = sx*tx + 0*ty + 0*tz + 0*1; nd = 0*a + sy*d + 0*g + 0*0; ne = 0*b + sy*e + 0*h + 0*0; nf = 0*c + sy*h + 0*i + 0*0; nty = 0*tx + sy*ty + 0*tz + 0*1; ng = 0*a + 0*d + sz*g + 0*0; nh = 0*b + 0*e + sz*h + 0*0; ni = 0*c + 0*f + sz*i + 0*0; ntz = 0*tx + 0*ty + sz*tz + 0*1; ↓ na = sx * a; nb = sx * b; nc = sx * c; ntx = sx * tx; nd = sy * d; ne = sy * e; nf = sy * f; nty = sy * ty; ng = sz * g; nh = sz * h; ni = sz * i; ntz = sz * tz;
平行移動よりは複雑になりましたが、しかし無思慮に concat() で処理するよりは遥かに速くなりそうです。
てなわけで、拡大縮小(scale)のコードは以下のようにします。
/** * 拡大縮小 * | sx 0 0 0 | * | 0 sy 0 0 | * | 0 0 sz 0 | * | 0 0 0 1 | */ public function scale( sx:Number, sy:Number, sz:Number ):void { _a *= sx; _b *= sx; _c *= sx; _tx *= sx; _d *= sy; _e *= sy; _f *= sy; _ty *= sy; _g *= sz; _h *= sz; _i *= sz; _tz *= sz; }
スポンサーサイト