Adobe Flash非公式テクニカルノート [ライブラリ]のビットマップを3次元空間で水平に回す
[ライブラリ]に入れたビットマップをタイムラインに置いて、3次元空間の垂直軸つまりy軸で水平に回してみます。同じ表現でも、使うクラスによって組立ては違います。また、3次元空間における扱いも変わってきます。本稿では、3つの異なる手法をご紹介します。 [ライブラリ]のビットマップには、インスタンスが動的につくれるように、[クラス]としてImageという名前を設定しておきましょう(図001)。[ビットマッププロパティ]ダイアログボックスは、[ライブラリ]パネルのメニューから[プロパティ]で開きます。 図001■[ビットマッププロパティ]ダイアログボックスで[クラス]を設定する 01 BitmapをSpriteインスタンスの入れ子にしてDisplayObject.rotationYプロパティで回す BitmapはDisplayObjectクラスを継承しますので、DisplayObject.rotationYプロパティにより3次元空間で回すこともできます。ただし、注意しなければならないのは、基準点がビットマップイメージの左上角になることです(図002左図)。今回のお題では、真ん中を軸にして水平に回したいと思います。ところが、そのままインスタンスをDisplayObject.rotationYプロパティで回せば、ビットマップイメージの左端が中心軸になってしまいます。 そこでよく使われる手が、BitmapをSpriteインスタンスの入れ子にすることです。すると、Spriteインスタンスの基準点をビットマップイメージの中心に置けます(図002右図)。あとは、SpriteインスタンスをDisplayObject.rotationYプロパティで回せばよいのです。 図002■ビットマップが含まれたBitmapをSpriteインスタンスの入れ子にする
ビットマップ(クラスImage)のイメージが含まれたBitmapオブジェクトをSpriteインスタンスに入れ子にしたのが、以下のスクリプト001です[*1]。Spriteインスタンスは、マウスポインタの水平位置に応じた向きと速さで水平に回ります(図003)。 図003■[ライブラリ]のビットマップがマウスポインタの水平位置に応じた向きと速さで水平に回る
スクリプト001第4〜7行目は、[ライブラリ]のビットマップ(クラスImage)のインスタンス(myImage)が含まれたBitmapオブジェクト(myBitmap)を、Spriteインスタンス(myInstance)に入れ子にしてステージに配置しています。 スクリプト001第8〜11行目で、Spriteインスタンス(myInstance)はステージ中央に置いたうえで、ビットマップイメージの中心にSpriteインスタンスの基準点がくるようBitmapインスタンス(myBitmap)の位置を動かしています。これでSpriteインスタンスをイメージの中心で回せます。 そして、スクリプト001第12行目以降は、インスタンスのDisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナー関数(xRotate())を加えて(第12行目)、マウスポインタの水平位置に応じた向きと速さでインスタンスを水平に回します(第13〜16行目)。
02 ビットマップで塗ったShapeインスタンスをDisplayObject.rotationYプロパティで回す インスタンスのもつGraphicsオブジェクトにビットマップ(BitmapDataオブジェクト)を塗るのが、Graphics.beginBitmapFill()メソッドです。第1引数には塗りのイメージとなるBitmapDataオブジェクトを渡します。オプションの第2引数はMatrixオブジェクトで、塗りのイメージを変形します。 Graphicsオブジェクト.beginBitmapFill(BitmapDataオブジェクト, 変換Matrixオブジェクト) Graphics.beginBitmapFill()メソッドで塗ることができるインスタンスには、まずSpriteがあります。けれど、ただビットマップを塗って3次元空間で回すだけなら、もっと軽いShapeインスタンスで足ります。そこで、Shapeインスタンスにビットマップと同じ大きさの矩形を描き、ビットマップのイメージで塗ることにします。インスタンスがもつGraphicsオブジェクトは、Shape.graphicsプロパティから参照を得ます。 Graphicsオブジェクトに対してGraphics.beginBitmapFill()メソッドを呼出すとき、第1引数のビットマップインスタンスのみ渡すと、ビットマップのイメージは基準点を左上角としてタイル状に塗られます。インスタンスの真ん中を軸に回すためには、矩形は基準点が中心になるように描かなければなりません。すると、ビットマップが4つに分かれたように塗られてしまいます(図004)。 図004■Graphics.beginBitmapFill()メソッドの塗りはデフォルトでは基準点を左上角とする Graphics.beginBitmapFill()メソッドの第2引数にMatrixオブジェクトを渡せば、塗り位置は動かせます。Matrixクラスで座標を動かすメソッドはMatrix.translate()です[*2]。引数には移動するxy座標値をピクセル単位で定めます。 Matrixオブジェクト.translate(x座標, y座標) 以下のスクリプト002は、Shapeインスタンスの基準点を中心にビットマップと同じ大きさの矩形を描き、ビットマップで塗りました。そのShapeインスタンスを、前掲スクリプト001と同じように、マウスポインタの水平位置に応じた向きと速さで水平に回します。動きの見た目は、前掲スクリプト001とまったく変わりません(前掲図003)。 スクリプト002■ビットマップで塗ったShapeインスタンスの矩形をDisplayObject.rotationYプロパティで回す
スクリプト002第3〜4行目でShapeインスタンスからGraphicsオブジェクトの参照(Shape.graphicsプロパティ)を得て、第15〜17行目がビットマップ(クラスImage)と同じ大きさの矩形にビットマップイメージを塗っています。 スクリプト002第8行目はMatrixインスタンスをつくり、第14行目でMatrix.translate()メソッドによりビットマップイメージの中心が基準点になるよう座標を動かしています。そして、第15行目に、そのMatrixオブジェクトをGraphics.beginBitmapFill()メソッドの第2引数に渡しました。 スクリプト002のShapeインスタンスをつくってステージ中央に置く処理(第1〜3行目および第11〜13行目)は、インスタンスがShapeであること以外前掲スクリプト001と変わりません。また、インスタンスを3次元空間で水平に回すリスナー関数(第18〜22行目)は、スクリプト001とまったく同じです。
03 Bitmapインスタンスをビットマップイメージの中心で回す − Matrix3Dクラスを使う Matrix3Dクラスは、3次元座標空間における(平行)移動や回転、伸縮という3つの変換を定めます。これらの変換は、座標空間の原点(0, 0, 0)をもとに行われます。インスタンスに変換を加える場合、この原点は親インスタンス(タイムライン)の基準点になります。したがって、Matrix3Dクラスの座標変換をうまく組合わせれば、インスタンスの基準点以外を原点にすることができるのです。 今回のお題では、Bitmapインスタンスを一旦移動して、親タイムラインの基準点とビットマップイメージの中心を重ねます。その後インスタンスを回せば、親タイムラインの基準点つまりビットマップの中心が軸になります。そのうえで、改めてインスタンスをもとの位置に戻せばよいのです。 インスタンスのもつMatrix3Dオブジェクトは、DisplayObject.transformプロパティからTransformオブジェクトが得られるので、そのTransform.matrix3Dプロパティで参照します。そして、(平行)移動はMatrix3D.appendTranslation()、回転にはMatrix3D.appendRotation()メソッドを用います[*3]。 Matrix3Dオブジェクト.appendTranslation(x座標, y座標, z座標) Matrix3D.appendTranslation()メソッドに渡す3つの数値は、移動するxyzの各座標値です。Matrix3D.appendRotation()メソッドの第1引数は、回転角を度数で定めます。第2引数の回転軸はxyz軸がVector3Dクラスの定数で、それぞれVector3D.X_AXIS/Vector3D.Y_AXIS/Vector3D.Z_AXISとして備わっています。前者の座標も後者の角度も、ともにインスタンスの現在値に加算される値であることにご注意ください。 ビットマップが含まれたBitmapインスタンスをタイムラインに直置きして、Matrix3Dクラスによりビットマップイメージの中心で回したのがつぎのスクリプト003です。 スクリプト003■BitmapインスタンスをMatrix3Dクラスによりビットマップの中心で水平に回す
スクリプト003第5〜6行目が、BitmapインスタンスのDisplayObject.transformプロパティから得たTransform.matrix3Dプロパティに新たなMatrix3Dオブジェクトを設定しています。 インスタンスを回転するリスナー関数(xRotate())は、このMatrix3Dオブジェクトにビットマップイメージの中心で水平回転を加えます(スクリプト003第11〜16行目)。第13行目で3次元座標空間の原点にビットマップイメージの中心がくるよう、Matrix3D.appendTranslation()メソッドで移動させます。そのうえで、第14行目が原点を中心にした水平回転をMatrix3D.appendRotation()メソッドにより加えます。その後、改めてMatrix3D.appendTranslation()メソッドを呼出し、もとの位置に戻しています。結果として、この変換Matrix3DオブジェクトをもつBitmapインスタンスが、イメージの中心で水平に回ることになるのです。
作成者: 野中文雄 Copyright © 2001-2011 Fumio Nonaka. All rights reserved. |
||||||||||||||