如何使用matrix3D在AS3中心周围进行3D旋转?

时间:2009-12-14 22:51:35

标签: flex actionscript-3 3d rotation

我试图围绕其中心点以三维方式旋转Sprite,我正在努力理解matrix3D的一些行为。

我已经重写了Sprite的set rotationX,rotationY和rotationZ方法,如下所示:

override public function set rotationX (_rotationX:Number) : void {  

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
    this.transform.matrix3D.prependRotation(-this.rotationX, Vector3D.X_AXIS);
    this.transform.matrix3D.prependRotation(_rotationX, Vector3D.X_AXIS);
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);

}

override public function set rotationY (_rotationY:Number) : void {

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
    this.transform.matrix3D.prependRotation(-this.rotationY, Vector3D.Y_AXIS);   
    this.transform.matrix3D.prependRotation(_rotationY, Vector3D.Y_AXIS);
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);   

}

override public function set rotationZ (_rotationZ:Number) : void {

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
    this.transform.matrix3D.prependRotation(-this.rotationZ, Vector3D.Z_AXIS);   
    this.transform.matrix3D.prependRotation(_rotationZ, Vector3D.Z_AXIS);
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);   

} 

我使用prependTranslation来校正旋转的中心点,并使用第一个prependRotation来取消任何先前应用的旋转。

测试它,rotationX完全按预期工作,并且Sprite围绕其水平轴旋转。

rotationY和rotationZ也似乎工作正常。但是,存在一个问题:每当设置rotationY或rotationZ时,所有其他旋转值也会改变。这对rotateX来说不是问题 - 如果我设置了rotationX,则没有其他更改。但是如果我设置了rotationY或者旋转Z,则所有旋转值都会改变,这对我的应用程序来说是个问题(它试图保存和恢复值)。

我认为我对matrix3D的情况缺乏了解。我如何实现这一点,以便值之间没有相互依赖性?

3 个答案:

答案 0 :(得分:3)

另一个简单的解决方案是添加对象并将其置于容器精灵中,并对包含的精灵进行3D变换。

答案 1 :(得分:1)

我对AS3等一无所知。但是只看你的代码,我想知道你为什么要使用我所理解的x和y值(宽度和高度)来转换z轴。不应该使用像“深度”这样的东西翻译z轴吗?

答案 2 :(得分:0)

这很简单,您可以尝试使用以下代码:

var matrix3d:Matrix3D = s.transform.matrix3D;
matrix3d.appendRotation( -1, Vector3D.Z_AXIS , new Vector3D( 390, 360, 0 ) );

当s是你的精灵时,第三个参数Vector3D表示你的精灵的中心位置。

上面的代码会使精灵旋转-1度。