03:Matrix3Dクラス
Matrix3Dクラスを使うと,
変換のprependとappend
Matrix3Dクラスによる平行移動や拡大・
表2 Matrix3Dクラスの移動/拡大・
変換 | 変換を前に適用するメソッド | 変換を後に適用するメソッド |
---|---|---|
平行移動 | Matrix3D. | Matrix3D. |
拡大・ | Matrix3D. | Matrix3D. |
回転 | Matrix3D. | Matrix3D. |
座標変換を前
Matrix3D.prependRotation()メソッド
Matrix3D.
prependRotation(度数角:Number, 回転軸:Vector3D):void
マウスポインタの水平座標に応じた速さで,
スクリプト3 3次元座標空間におけるインスタンスをy軸で回転させる
// タイムライン: メイン
// 第1フレームアクション
var nX:Number = my_mc.x;
var nDeceleration:Number = 0.3; // 回転スピードの調整係数
my_mc.z = 0; // 3次元座標のプロパティを操作
addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
var nRotationY:Number = (mouseX - nX)*nDeceleration;
// 3次元座標空間においてy軸でインスタンスを回転
my_mc.transform.matrix3D.prependRotation(nRotationY, Vector3D.Y_AXIS);
}
ひとつ注意しなければならないのは,
[ムービープレビュー]を見ると,
Matrix3D.appendRotation()メソッド
前掲スクリプト003のリスナー関数xRotate()で,
appendRotation(度数角:Number, 回転軸:Vector3D):void
書替えてみると,
function xRotate(eventObject:Event):void {
var nRotationY:Number = (mouseX - nX)*nDeceleration;
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
}
実は,
座標変換が適用される順序
インスタンスのもつMatrix3Dオブジェクトに,
my_mc.transform.matrix3D = new Matrix3D()
インスタンスのDisplayObject.
変換を前
変換を後
前掲スクリプト003のリスナー関数xRotate()で, Matrix3D.
function xRotate(eventObject:Event):void {
var nRotationY:Number = (mouseX - nX)*nDeceleration;
var myMatrix3D:Matrix3D = my_mc.transform.matrix3D; // もとのMatrix3Dオブジェクトを保持
my_mc.transform.matrix3D = new Matrix3D(); // デフォルト状態に戻す
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS); // 回転を先に適用
my_mc.transform.matrix3D.append(myMatrix3D); // もとのMatrix3Dオブジェクトを適用
}
なお,Matrix3D.
append(後から適用する変換:Matrix3D):void
複数の座標変換を組合わせる
前に適用
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
var nDeceleration:Number = 0.3;
my_mc.z = 0;
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.prependRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.prependRotation(nRotationX, Vector3D.X_AXIS);
}
[ムービープレビュー]で確かめると,
後に適用
appendTranslation(x:Number, y:Number, z:Number):void
スクリプト4 3次元座標空間におけるインスタンスをx軸とy軸で回転させる
// タイムライン: メイン
// 第1フレームアクション
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
var nDeceleration:Number = 0.3;
my_mc.z = 0;
addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
var nRotationY:Number = (mouseX - nX)*nDeceleration;
var nRotationX:Number = (mouseY - nY)*nDeceleration;
// 3次元座標空間でインスタンスを回転
my_mc.transform.matrix3D.appendTranslation(-nX, -nY, 0);
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.appendRotation(nRotationX, Vector3D.X_AXIS);
my_mc.transform.matrix3D.appendTranslation(nX, nY, 0);
}
Spriteインスタンスに6面で立方体を作成したMatrix3Dクラスの応用サンプル
Matrix3D応用サンプル 立方体の回転の処理
var nX:Number = stage.stageWidth / 2;
var nY:Number = stage.stageHeight / 2;
var nSensitivity:Number = 0.2;
var cubeSprite:Sprite = new Sprite(); // 中に別途立方体を作成
function rotateCube(eventObject:Event):void {
var nRotationX:Number = -(mouseY - nY) * nSensitivity;
var nRotationY:Number = (mouseX - nX) * nSensitivity;
rotateSprite(cubeSprite, nRotationX, nRotationY);
}
function rotateSprite(mySprite:Sprite, nRotationX:Number, nRotationY:Number):void {
var myMatrix3D:Matrix3D = mySprite.transform.matrix3D;
myMatrix3D.appendTranslation(-nX, -nY, 0);
myMatrix3D.appendRotation(nRotationX, Vector3D.X_AXIS);
myMatrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
myMatrix3D.appendTranslation(nX, nY, 0);
}
- [※3]
- Matrix3Dクラスについては,
併せてAdobeデベロッパーセンターに寄稿した 「Matrix3Dクラス - 変換行列2」 も参考にしてほしい。