创建和移动 3D 显示对象

Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本

若要将 2D 显示对象转换为 3D 显示对象,可将其 z 属性明确设置为一个数值。如果为 z 属性指定一个值,则会为显示对象创建一个新的 Transform 对象。设置 DisplayObject.rotationX DisplayObject.rotationY 属性也会创建新的 Transform 对象。Transform 对象包含 Matrix3D 属性,该属性控制显示对象在 3D 空间中的表示方式。

下面的代码设置名为“leaf”的显示对象的坐标:

leaf.x = 100; leaf.y = 50; leaf.z = -30;

在 leaf 的 Transform 对象的 matrix3D 属性中,可以查看这些值以及从这些值派生的属性:

var leafMatrix:Matrix3D  = leaf.transform.matrix3D; 
 
trace(leafMatrix.position.x); 
trace(leafMatrix.position.y); 
trace(leafMatrix.position.z); 
trace(leafMatrix.position.length); 
trace(leafMatrix.position.lengthSquared);

有关 Transform 对象的属性的信息,请参阅 Transform 类。有关 Matrix3D 对象的属性的信息,请参阅 Matrix3D 类。

在 3D 空间中移动对象

通过更改对象的 x、y 或 z 属性的值,可以在 3D 空间中移动对象。如果更改 z 属性的值,对象看起来就会相应地靠近或远离观察者。

下面的代码在响应事件时,通过更改两个椭圆的 z 属性的值,沿着各自的 z 轴前后移动这两个椭圆。 ellipse2 的移动速度比 ellipse1 快:其 z 属性针对每个 Frame 事件增加 20 倍,而 ellipse1 z 属性增加 10 倍:

var depth:int = 1000; 
 
function ellipse1FrameHandler(e:Event):void 
{ 
    ellipse1Back = setDepth(e, ellipse1Back); 
    e.currentTarget.z += ellipse1Back * 10; 
} 
function ellipse2FrameHandler(e:Event):void 
{ 
    ellipse2Back = setDepth(e, ellipse1Back); 
    e.currentTarget.z += ellipse1Back * 20; 
} 
function setDepth(e:Event, d:int):int 
{ 
    if(e.currentTarget.z > depth) 
    { 
        e.currentTarget.z = depth; 
        d = -1; 
    } 
    else if (e.currentTarget.z <  0) 
    { 
        e.currentTarget.z = 0; 
        d = 1; 
    } 
}

在 3D 空间中旋转对象

可以通过三种方式旋转对象,具体采用哪一种取决于设置对象的 rotationX rotationY rotationZ 这三个旋转属性的方式。

下图显示两个未旋转的正方形:

下一个图显示两个正方形,它们在正方形容器的 rotationY 属性增大时在 y 轴上旋转。通过旋转这两个正方形的容器或父显示对象,可以旋转这两个正方形:

container.rotationY += 10;

下一个图显示当设置正方形容器的 rotationX 属性时发生的变化。此操作会在 x 轴上旋转正方形。

下一个图显示当增大正方形容器的 rotationZ 属性时发生的变化。此操作会在 z 轴上旋转正方形。

显示对象可以在 3D 空间中同时移动和旋转。