サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

VectorクラスとMatrix3DクラスおよびVector3Dクラス

ID: FN0809001 Product: Flash Platform: All Version: 10 and above/ActionScript 3.0

Flash Player 10の正式版候補(Release Candidate)が公開され、Adobe Creative Suite 4の米国発売も間近になりました。Flash Player 10に実装される新たなクラスについても、Adobeその他のblog等で情報が明らかになりつつあります。それらの公開情報をもとに、本稿ではVectorクラスとMatrix3DクラスおよびVector3Dクラスについて簡単にご紹介します。

1. Vectorクラス[*1]
Vectorクラスは、ベクトルを扱います。ベクトルとは、複数の値をひと組にして演算するための数学的な概念です。ActionScriptにおける性質は、配列(Arrayクラス)にとても似ています。

    【配列と似ている点】
  • 複数のエレメントを操作できます。
  • lengthプロパティやpush()pop()slice()sort()などのメソッドを備えています。
    【配列と異なる点】
  • すべてのエレメントをひとつのデータ型で指定し、他の型のデータをエレメントにすることはできません。
  • エレメントのインデックスは連番でなければならず、lengthプロパティの値より大きいインデックスにはエレメントが加えられません。

Vectorクラスのコンストラクタは、つぎのようなシンタックスです。

Vector.<データ型>(長さ:uint=0, 長さの固定:Boolean=false)

第1引数の長さには、エレメント数を指定します。デフォルトは0です。第2引数は、長さを固定するかどうかをブール(論理)値で渡します。デフォルトはfalseで、長さは固定されません。

Vectorクラスを使うと、エレメントにデータ型が指定されるため、エレメントへの値の設定だけでなく取出した値についても型のチェックが行われます。また、エレメントへのアクセスも、配列と比べて高速です。

Vectorインスタンスの生成とエレメントの値の追加、変更、取出しは、つぎのように行います。

var myVector:Vector.<int> = new Vector.<int>();
myVector.push(0);
myVector.push(2);
myVector[1] = 1;
// myVector[5] = 5;   // インデックスが長さを超えるためエラー
var n:int = myVector[0];
// var my_str:String = myVector[1];   // データ型が一致しないためエラー


[*1] Vectorクラスについては、つぎのようなサイトの情報が参考になります。Francis Cheng「Vectors in ECMAScript 4」、「Type Parameters in ECMAScript 4th Edition」、BeInteractive!「FlashPlayer10のVectorについて分かっていることまとめ」、「FlashPlayer10のVectorについて更に色々」、閃光的網站・弛緩複合体「[Astro] Vector クラス(1)」〜。


2. Matrix3Dクラス[*2]
Matrix3Dクラスは、3次元の変換行列です。3次元のDisplayObjectに、平行移動や回転、拡大・縮小などの変換を適用します。2次元の変換行列Matrixクラスを3次元に拡張したもので、Matrixクラスが3×3の行列であるのに対して、4×4の正方行列になります。

2次元のDisplayObjectのDisplayObject.transformプロパティには、Transform.matrix3Dプロパティの初期値としてはnullが与えられます。DisplayObjectインスタンスに3次元の操作を加えると、そのインスタンスのDisplayObject.transformプロパティにTransform.matrix3Dプロパティが自動的に生成されます。

Matrix3Dクラスには、たとえばつぎのようなメソッドが備わっています。

メソッド 説明
Matrix3D(ベクトル:Vector.<Number> = null) コンストラクタメソッド。Matrix3Dインスタンスを生成します。
appendRotation(角度:Number, 軸:Vector3D, 中心点:Vector3D = null):void Matrix3Dインスタンスに回転を加えます。
appendScale(xの伸縮率:Number, yの伸縮率:Number, zの伸縮率:Number):void Matrix3Dインスタンスに、x軸y軸z軸のそれぞれの方向への拡大・縮小を加えます。
appendTranslation(x:Number, y:Number, z:Number):void Matrix3Dインスタンスに、x軸y軸z軸のそれぞれの方向への平行移動を加えます。

[*2] Matrix3Dクラスについては、つぎのサイトの情報が参考になります。閃光的網站・弛緩複合体 「Astro de 3D(6) 〜明示的 Matrix3D 使用編〜」〜。


3. Vector3Dクラス
Vector3Dクラスは、3次元空間におけるベクトルを扱います。xyz座標に加えて、Matrix3Dとの演算に対応するため、第4のプロパティとしてwをもちます。したがって、Vector3Dインスタンスを列ベクトルとして表すと、つぎのようになります。

z軸は奥に向かって値が増えます[*3]

[*3] 3次元の「右手座標系」と呼ばれます。右手座標系はzが手前に向かって増えると覚えている人もいますが、Flashの座標系はy軸が下向きであることに注意が必要です。


作成者: 野中文雄
作成日: 2008年9月28日


Copyright © 2001-2008 Fumio Nonaka.  All rights reserved.