04:Vector3Dクラス
Vector3Dクラスは,
ベクトルの内積
ベクトルの内積を計算すると,
A・B = |A||B|cosθ
Vector3D.
dotProduct(演算対象ベクトル:Vector3D):Number
表3 ベクトルの内積となす角
内積の値 | なす角(θ) | cosθ |
---|---|---|
正 | 90度より小さい(鋭角) | 正 |
0 | 90度(直角) | 0 |
負 | 90度より大きい(鈍角) | 負 |
内積を求める前掲の式|A||B|cosθで,
前に紹介した回転する立方体のように閉じた立体については,
以下のスクリプト005は,
スクリプト5 視線と面の方向のベクトルの内積で裏返った面を判定する
// タイムライン: メイン
// 第1フレームアクション
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
var nDeceleration:Number = 0.3;
var view:Vector3D = new Vector3D(0,0,1); // 視線のベクトル
var origin:Vector3D = new Vector3D(nX,nY,0); // 原点のベクトル
my_mc.z = -50;
addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
var nRotationY:Number = (mouseX - nX)*nDeceleration;
var nRotationX:Number = (mouseY - nY)*nDeceleration;
my_mc.transform.matrix3D.appendTranslation(-nX, -nY, 0);
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.appendTranslation(nX, nY, 0);
var myPosition:Vector3D = my_mc.transform.matrix3D.position;
var vector:Vector3D = myPosition.subtract(origin);
var nDotProduct:Number = view.dotProduct(vector);
if (nDotProduct > 0) {
my_mc.alpha = 0.5;
} else {
my_mc.alpha = 1;
}
}
新たなVector3Dインスタンスは,Vector3D()コンストラクタにxyz座標を引数に渡して生成する。z軸正方向の視線のベクトル
回転するインスタンスは基準点を真ん中に定めたので,
subtract(差引くベクトル:Vector3D):Vector3D
なお,
視線のベクトル
Matrix3Dクラスの応用サンプルでも,
Transform.
getRelativeMatrix3D(基準タイムライン:DisplayObject):Matrix3D
Matrix3D応用サンプル 立方体の裏側の面を非表示にする処理
function arrangeFaces():void {
var faceSprite:Sprite;
var nLastIndex:int = cubeSprite.numChildren - 1;
var nLength:Number;
var i:uint;
var view:Vector3D = new Vector3D(0,0,1);
nLength = faces_vector.length;
for (i=0; i < nLength; ++i) {
faceSprite = faces_vector[i];
var myPosition:Vector3D = faceSprite.transform.getRelativeMatrix3D(this).position;
var vector:Vector3D = myPosition.subtract(cubeSprite.transform.matrix3D.position);
var nDotProduct:Number = view.dotProduct(myPosition);
if (nDotProduct > 0) {
faceSprite.visible = false;
} else {
faceSprite.visible = true;
}
}
}
透視投影
透視投影とは,
相似の三角形と辺の比の関係から,
投影像の大きさ/オリジナルの大きさ = 焦点距離/(焦点距離+z方向距離)
投影像の大きさ = オリジナルの大きさ×焦点距離/(焦点距離+z方向距離)
Vector3D.
function project():void
Vector3Dインスタンスは,
Vector3D.
Vector3D.wプロパティ = (焦点距離 + Vector3D.zプロパティ値)/焦点距離
Vector3Dクラスの応用サンプル
Vector3D応用サンプル Vector3Dインスタンスの3次元座標をVector3d.
function xGetProjectedPoints(myVertices:Vector.<Vector3D>):Vector.<Point> {
var nLength:uint = myVertices.length;
var projectedPoints:Vector.<Point> = new Vector.<Point>();
for (var i:int = 0; i<nLength; i++) {
var myVector:Vector3D = myVertices[i];
var cloneVector:Vector3D = myVector.clone();
cloneVector.w = (focalLength+myVector.z)/focalLength;
cloneVector.project();
projectedPoints.push(new Point(cloneVector.x, cloneVector.y));
}
return projectedPoints;
}
Vector3D.
clone():Vector3D
Matrix3Dクラスを用いたVector3Dの座標変換
Matrix3Dクラスとの関わりで,
transformVector(変換対象べクトル:Vector3D):Vector3D
Vector3Dクラスの応用サンプルでは,
Vector3D応用サンプル Vector3DインスタンスにMatrix3D.
function xTransform(myVertices:Vector.<Vector3D>, speed:Point):void {
var myMatrix:Matrix3D = new Matrix3D();
myMatrix.appendRotation(speed.x, Vector3D.Y_AXIS);
myMatrix.appendRotation(speed.y, Vector3D.X_AXIS);
var nLength:uint = myVertices.length;
for (var i:int = 0; i<nLength; i++) {
myVertices[i] = myMatrix.transformVector(myVertices[i]);
}
}
- [※4]
- 併せて,
「Vector3Dクラス 」を参照してほしい。 - [※5]
- Vector3D.
dotProduct()メソッドおよび内積について詳しくは, 「 Vector3D. dotProduct()メソッド 」をお読みいただきたい。 - [※6]
- cosなどの三角関数の意義については,
AdobeのTechNote 「角度と座標の計算 - Flash の三角関数を使う」 が参考になる。