乗算時のVector3D.wプロパティ [Edit]

[ActionScript 3.0言語およびコンポーネントリファレンス]の「Vector3D.project()メソッド」の項には、Matrix3DとVector3Dインスタンスを乗算したときのVector3D.wプロパティについて、つぎのように説明しています。

現在のVector3Dオブジェクトが、Vector3Dオブジェクトに投影Matrix3Dオブジェクトを乗算した結果の場合、wプロパティは変換値を保持できます。

しかし、Vector3D.wプロパティは、乗算前のプロパティ値を保持しません。Matrix3DクラスでVector3Dインスタンスとの乗算を行うのは、Matrix3D.transformVector()メソッドです。このメソッドを用いた簡単な演算結果で確かめてみましょう。

スクリプト001■Matrix3DにVector3DインスタンスをMatrix3D.transformVector()メソッドで乗算

// フレームアクション
var myMatrix3D:Matrix3D = new Matrix3D();
var myVector3D:Vector3D = new Vector3D();
trace(myVector3D, myVector3D.w); // Output: Vector3D(0, 0, 0) 0
myVector3D = myMatrix3D.transformVector(myVector3D);
trace(myVector3D, myVector3D.w); // Output: Vector3D(0, 0, 0) 1

Vector3D.wプロパティのデフォルト値は0です。しかし、Matrix3D.transformVector()メソッドで乗算した結果、その値は1になります。つまり、乗算前のプロパティ値は保持されていません。また、0と乗算して1になる数値は存在しません。

他方、Vector3D.add()やVector3D.subtract()メソッドは、Vector3D.wプロパティの値を0にリセットします。これらのメソッドは、Vector3D.wプロパティを無視するのです。

前掲スクリプト001で確かめたように、Matrix3D.transformVector()メソッドは、乗じるVector3D.wプロパティの値を1に設定します。ただし、このメソッドは、Vector3D.wプロパティを無視するのではなく、Matrix3Dインスタンスとの乗算を行います。

以下のスクリプト002は、4行目に[4, 3, 2, 5]という値が納められたMatrix3Dインスタンスを作成しています。すると、乗算結果のVector3D.wプロパティ値は34になります(図001)[*1]。この値は、Matrix3Dインスタンスの4行目とVector3Dインスタンス(ただし、Vector3D.wプロパティ値は1)との内積です[*2]

(4, 3, 2, 5)•(4, 3, 2, 1) = 4×4 + 3×3 + 2×2 + 5×1 = 34

図001■Matrix3Dの変換行列とVector3Dのベクトルとの乗算
Matrix3Dの変換行列とVector3Dのベクトルとの乗算

スクリプト002■Matrix3DにVector3DインスタンスをMatrix3D.transformVector()メソッドで乗算

// フレームアクション
var myMatrix3D:Matrix3D = new Matrix3D();
var myRawData:Vector. = myMatrix3D.rawData;
var myVector3D:Vector3D = new Vector3D(4,3,2);
trace(myVector3D, myVector3D.w); // Output: Vector3D(4, 3, 2) 0
myRawData[3] = 4;
myRawData[7] = 3;
myRawData[11] = 2;
myRawData[15] = 5;
myMatrix3D.rawData = myRawData;
myVector3D = myMatrix3D.transformVector(myVector3D);
trace(myVector3D, myVector3D.w); // Output: Vector3D(4, 3, 2) 34

おそらく[ヘルプ]の述べる「保持」(hold)というのは、もとのVector3D.wプロパティの値のことではなく、変換行列との乗算が行われてその結果の値をもつということではないかと推測されます。しかし、あいまいな言回しのうえ、乗じるVector3DインスタンスのVector3D.wプロパティ値が1に設定されることを明記していない点で不十分な記述というべきでしょう。


[*1] 変換行列とベクトルとの乗算については、「変換行列を数学的に捉える」をお読みください。

[*2] ベクトルの内積については、「Vector3D.dotProduct()メソッド」をご参照ください。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事