Astro de 3D(8) ~Matrix3D の 暗黙的生成~
2008/06/09 21:49 - Astro
前回のコードでは明示的に二種類の Matrix3D を生成しました。
ところで、表示オブジェクトを生成すると、それに対応した二次元マトリクスが暗黙的に生成されますよね。 そしてその暗黙的に生成された二次元マトリクスは、以下のプロパティでもってアクセスすることができます。
DisplayObject.transform.matrix
三次元マトリクスもそんな風に暗黙的な生成が成されるのか否か、というのが今回のテーマです。
Astro ASDoc の flash.geom.Transform クラスについて見てみると、matrix3D というプロパティが存在すると記されています。
ということは二次元マトリクス同様に、表示オブジェクトを生成すると三次元マトリクスも暗黙的に生成され、以下のプロパティでアクセスができそうな予感がします。
DisplayObject.transform.matrix3D
以下、それを確かめるためにいろいろ実験してみました。
まずは Sprite を生成した直後に Sprite.transform.matrix と Sprite.transform.matrix3D を trace した結果です。
Sprite.transform.matrix: (a=1, b=0, c=0, d=1, tx=0, ty=0) Sprite.transform.matrix3D: null
エラーなしにちゃんとコンパイルされた、ということは、DiplayObject.transform.matrix3D というプロパティは存在し、そのプロパティで三次元マトリクスにアクセスできるらしいということが分かります。
しかし Sprite.transform.matrix3D は null という結果が出ました。
プロパティとして存在はしているけど中身は null。 これは一体どう考えるべきか。
ま、ようするに、表示オブジェクトを生成しただけでは、暗黙的に三次元マトリクスの生成はおこなわれないってことですな。 おそらくメモリ使用量的な観点からこうなってるんじゃなかろうか、ということが推測されます。
となると、何となーく今後の展開が見えてくるじゃぁありませんか。
flash.geom.Matrix3D は三次元表現に関わるマトリクスです。
Flash Player 10 では DisplayObject に対して三次元表現に関わるプロパティが追加されています。 それらのプロパティを設定をした後でなら matrix3D が null ではなくなるのではないか。
三次元表現に関わるプロパティとしては以下のものがあります。
- DisplayObject.z
- DisplayObject.rotationX
- DisplayObject.rotationY
- DisplayObject.rotationZ
これらを定義した後に、Sprite.transform.matrix と Sprite.transform.matrix3D を trace してみましょう。
まずは座標に関わるプロパティの結果。
define Sprite.x Sprite.transform.matrix: (a=1, b=0, c=0, d=1, tx=0, ty=0) Sprite.transform.matrix3D: null define Sprite.y Sprite.transform.matrix: (a=1, b=0, c=0, d=1, tx=0, ty=0) Sprite.transform.matrix3D: null define Sprite.z Sprite.transform.matrix: null Sprite.transform.matrix3D: [object Matrix3D]
次に回転に関わるプロパティの結果。
define Sprite.rotation Sprite.transform.matrix: (a=1, b=0, c=0, d=1, tx=0, ty=0) Sprite.transform.matrix3D: null define Sprite.rotationX Sprite.transform.matrix: null Sprite.transform.matrix3D: [object Matrix3D] define Sprite.rotationY Sprite.transform.matrix: null Sprite.transform.matrix3D: [object Matrix3D] define Sprite.rotationZ Sprite.transform.matrix: null Sprite.transform.matrix3D: [object Matrix3D]
予想どおりです。
座標および回転に関わるプロパティのうち、三次元表現に必要十分条件ではない x、y、rotation の定義をしても DisplayObject.transform.matrix3D は null ですが、z、rotation[X|Y|Z] を定義すると DisplayObject.transform.matrix3D に値が入ります。
もうひとつ興味深いことが判明しましたね。
暗黙的な Matrix3D が生成されると、暗黙的な Matrix が null になります。
三次元マトリクスは二次元マトリクスをカバー可能。 メモリ節約の観点から Matrix が消去されるんでしょうね。
以上、表示オブジェクトの暗黙的な Matrix3D 生成について検証しました。
- 今回の使用コード ( require Flash Player 10 )