三次元頂点
2008/05/15 21:32 - AS3.0
三次元座標クラス Point3D と、三次元変換行列クラス Matrix3D を定義しました。
いよいよこの二つを使って三次元空間上で物体がグリグリ動くサンプルを作りたいと思います。
とその前に、もう一つ別のクラスを整備しますよ。 頂点についてのクラスです。
「三次元座標」クラス作ったじゃん。何だよ頂点クラスって。同じだろーが。
と、罵る前にまぁ人の話を聞いてくれ給え。
三次元座標クラスを頂点として扱うことはもちろん可能なんでしょうが、三次元座標クラスだけだと不便なんですよ。
今回の自作 3D フレームワークでは、三次元変換行列を用いて三次元座標の変換をおこなうことにより、三次元表現をおこなうというのがテーマです。
言うまでもなく、一番最初に設定した座標と、行列によって変換された座標では、その値は当然違うものになります。
そして、行列による座標変換をおこない続けようとする場合、一番最初に設定した座標の値はおそらく破棄できないんじゃないかと。 ゆえに一つの頂点に対し、最低二つは三次元座標を持つ必要があるんじゃないかと。
例えば、30度回転させる「行列1」と60度回転させる「行列2」があったとします。
そして、座標Aを行列1によって座標Bに変換し、さらに行列2によって座標Cに変換するという動きをさせるとします。最終的に90度回転した位置に座標が移動するというのが期待された動きですね。
この場合、行列1で座標Aを変換し座標B(30度回転した位置に移動)を得た後、行列1と行列2を合成して、その合成行列で座標Cを得るという過程を経ることになります。
その場合、座標Bに合成した行列を適用すると期待した座標が求まりません。 一方、座標Aに対して合成行列を適用させると、期待どおりの動きになります。
<期待した動きをしないプロセス> 座標A → 行列1 → 座標B → 行列1に行列2を合成 → 座標C <期待した動きをするプロセス> 座標A → 行列1 → 座標B 座標A → 行列1に行列2を合成 → 座標C
行列の本とか三次元表現の本とか何冊か読みましたが、数学苦手なんで未だによくは分かりません。
逆行列とか使ったりすると合成行列と座標Bから座標Cが求まるのかもしれませんが、今のところ得た知識の範囲では、行列に合成を重ねていく場合、一番最初の座標に対して行列を適用するという方法でないと期待どおりの動きをしません。
一番最初に設定した座標を保持し続けるメリットは、もう一つあると考えます。
座標群が何らかの編隊を取っていた場合、一番最初の座標を途中で変えることにより、その編隊を変えることができます。
このことについては、のちのち実際にコーディングする局面が出てくるかも知れないので、この程度の説明にとどめます。
てなわけで、頂点クラスには、一番最初に設定した座標を永遠に持ち続けてもらいます。そして行列によって得られた射影座標も併せて持ってもらいます。 三次元座標オブジェクトを二つ内包するわけです。
で、通常は射影された座標の値のみ参照できるようにしておけば、onEnterFrame などで頂点を回転させ続けたりさせるのに都合が良いんではないかと。
そんなわけでできたクラスがコレ。
なお、このクラスはとりあえず暫定的に作ったクラスです。 のちのちどころか、次回サンプルを作るときにすら変更が発生する可能性があります。 それくらい一時的なクラスなのでプロパティ名もメソッドコードもかなり杜撰です。