今回からまた3次元空間の話に戻る。新たに学ぶクラスはVector3Dだ。名前が示すとおり,
Vector3DインスタンスをMatrix3Dオブジェクトで座標変換する
まず,
new Vector3D(x座標, y座標, z座標)
Vector3Dインスタンスも,
Matrix3Dオブジェクト.transformVector(Vector3Dオブジェクト)
たとえば,
var myVector3D:Vector3D = new Vector3D(100, 0, 0);
var myMatrix3D:Matrix3D = new Matrix3D();
myMatrix3D.prependRotation(90, Vector3D.Y_AXIS);
trace(myMatrix3D.transformVector(myVector3D));
変換されたVector3Dインスタンスの座標情報が,
Vector3D(6.12323420998628e-15, 0, -100)
なお,
さて,
- ※1
- オプションの第4引数
(プロパティVector3D. w) については, 後の回で扱う。 - ※2
- 「指数表記」
と呼ばれ, 大きな数や小さい数を表すのに用いられる。たとえば, 「1. 23e-4」 は, つぎのように0. 000123を意味する。
1.23e-4 = 1.23×10-4 = 0.000123
Spriteインスタンスに直線を描く
3次元空間座標を行列変換しただけでは,
直線の描き方は,
Graphicsオブジェクト.lineStyle(太さ,カラー, アルファ)
Graphicsオブジェクト.moveTo(x座標, y座標)
Graphicsオブジェクト.lineTo(x座標, y座標)
ステージ中央に置いたSpriteインスタンスに,
var mySprite:Sprite = new Sprite();
// インスタンスから取出したGraphicsオブジェクトを変数に代入
var myGraphics:Graphics = mySprite.graphics;
mySprite.x = stage.stageWidth / 2;
mySprite.y = stage.stageHeight / 2;
addChild(mySprite);
// Graphicsクラスのメソッドで線描
myGraphics.lineStyle(2, 0x0000FF);
myGraphics.moveTo(-50, -50);
myGraphics.lineTo(50, -50);
myGraphics.lineTo(50, 50);
myGraphics.lineTo(-50, 50);
myGraphics.lineTo(-50, -50);
この座標を線で描く処理は,
でき上がったフレームアクションが,
スクリプト1 配列から取出したPointインスタンスの座標にしたがってSpriteに線を描く
// フレームアクション
var nUnit:Number = 100 / 2;
var mySprite:Sprite = new Sprite();
var vertices:Array = new Array(); // 座標のPointインスタンスを納める配列生成
var myGraphics:Graphics = mySprite.graphics;
mySprite.x = stage.stageWidth / 2;
mySprite.y = stage.stageHeight / 2;
// xy座標をPointインスタンスにして配列に納める
vertices.push(new Point(-nUnit, -nUnit));
vertices.push(new Point(nUnit, -nUnit));
vertices.push(new Point(nUnit, nUnit));
vertices.push(new Point(-nUnit, nUnit));
addChild(mySprite);
xDrawLines(vertices);
// 配列からPointインスタンスを取出して線描する関数
function xDrawLines(vertices:Array):void {
var nLength:uint = vertices.length;
var myPoint:Point = vertices[nLength - 1];
myGraphics.lineStyle(2, 0x0000FF);
myGraphics.moveTo(myPoint.x, myPoint.y);
for (var i:uint = 0; i < nLength; i++) {
myPoint = vertices[i];
myGraphics.lineTo(myPoint.x, myPoint.y);
}
}