ベクトルの内積から面の向きがわかる
ベクトルは方向をもった大きさで,
つまり,
3次元空間のベクトルを表すために,
表1視線と面のベクトルの3次元座標
ベクトル | 座標 |
---|---|
視線 | (0, 0, 1) |
面(初期値) | (0, 0, -1) |
そして,
表2視線と面のベクトルの内積となす角
面の向き | ふたつのベクトルのなす角 | 内積の符号 |
---|---|---|
裏 | 90度より小さい | +(正) |
真横 | 90度 | 0 |
表 | 90度より大きい | -(負) |
ここまでくれば,
- Vector3Dオブジェクト.dotProduct
(もうひとつのVector3Dオブジェクト)
面の表と裏を塗替える
では,
第2は,
今回3次元空間の頂点座標は動かさない。変換のMatrix3Dオブジェクトに回転を加えて,
その結果のオブジェクトを変数 (worldMatrix3D) に残す。つまり, 座標ではなく変換行列で座標変換を管理するのだ。
したがって,
// フレームアクションに追加
var viewVector3D:Vector3D = Vector3D.Z_AXIS; // 視線のベクトル
var faceVector3D:Vector3D = new Vector3D(0, 0, -1); // 面のベクトル
function xRotate(eventObject:Event):void {
var nRotationY:Number = mySprite.mouseX * nDeceleration;
var vertices2D:Vector.<Number> = new Vector.<Number>();
xTransform(vertices2D, nRotationY);
var bFront:Boolean = xIsFront(faceVector3D, worldMatrix3D); // 面の表裏を調べる
trace(bFront); // 確認用
xDraw(vertices2D);
}
// 面の表裏を調べる関数の定義
function xIsFront(myVector3D:Vector3D, myMatrix3D:Matrix3D):Boolean {
var directionVector3D:Vector3D = myMatrix3D.transformVector(myVector3D);
var bFront:Boolean = (viewVector3D.dotProduct(directionVector3D) < 0);
return bFront;
}
面の表裏を調べる関数