Actionscript 3 flex 4.6三维旋转轴

Actionscript 3 flex 4.6三维旋转轴,actionscript-3,apache-flex,3d,flex4.6,Actionscript 3,Apache Flex,3d,Flex4.6,我试图在图片上执行一些3D旋转,但这比看起来更难。 事实上,当您在X轴和/或Y轴上旋转图片时,它看起来是拉伸的(但这是正常的)。但是,当您从Z轴旋转时,图片将绕屏幕的Z轴旋转,而不是绕其自身的轴旋转。因此,从侧面看,它看起来像一张绕轴旋转的拉伸图片,而不是一张围绕中心旋转的平板图片 因为我知道这有点混乱,下面是我正在使用的函数。你可以试着用一张圆形的图片来达到更好的效果。想象一下你想要一个旋转的圆,不管方向如何。您将看到图片围绕屏幕的轴旋转,而不是围绕其自身的轴旋转 public functio

我试图在图片上执行一些3D旋转,但这比看起来更难。 事实上,当您在X轴和/或Y轴上旋转图片时,它看起来是拉伸的(但这是正常的)。但是,当您从Z轴旋转时,图片将绕屏幕的Z轴旋转,而不是绕其自身的轴旋转。因此,从侧面看,它看起来像一张绕轴旋转的拉伸图片,而不是一张围绕中心旋转的平板图片

因为我知道这有点混乱,下面是我正在使用的函数。你可以试着用一张圆形的图片来达到更好的效果。想象一下你想要一个旋转的圆,不管方向如何。您将看到图片围绕屏幕的轴旋转,而不是围绕其自身的轴旋转

public function rotate(target:IVisualElement, x:Number = 0, y:Number = 0, z:Number = 0, duration:Number = 1000):void
{
    var rotation:Rotate3D = new Rotate3D();
    rotation.autoCenterTransform = true;
    rotation.angleXTo = x;
    rotation.angleYTo = y;
    rotation.angleZTo = z;
    rotation.duration = duration;
    rotation.target = target;

    rotation.play();
}

有没有一种简单易行的方法可以在不重新开发轮子的情况下执行这些旋转?

最后,我找到了一种工作完美且无需外部库的方法。这个把戏太简单了,我不明白为什么我以前没有试过

我没有在同一个元素上应用X、Y和Z变换,而是在容器上应用X和Y旋转,在容器内的图片上应用Z轴

像这样,Z轴旋转不再干扰另一个轴

以下是工作测试代码:

<fx:Script>
    <![CDATA[
        private function init():void
        {
            moveZ();
            var timer:Timer = new Timer(5000);
            timer.addEventListener(TimerEvent.TIMER, repeat);
            timer.start();
        }

        private function repeat(e:TimerEvent):void
        {
            moveZ();
        }

        private function moveX():void
        {
            rotX += 20;
            fx.angleXTo = rotX;
            fx.angleYTo = rotY;
            fx.angleZTo = 0;
            fx.duration = 1000;
            fx.play(new Array(container));
        }
        private function moveY():void
        {
            rotY += 20;
            fx.angleXTo = rotX;
            fx.angleYTo = rotY;
            fx.angleZTo = 0;
            fx.duration = 1000;
            fx.play(new Array(container));
        }
        private function moveZ():void
        {
            rotZ += 360;
            fx.angleXTo = 0;
            fx.angleYTo = 0;
            fx.angleZTo = rotZ;
            fx.duration = 5000;
            fx.play(new Array(image));
        }
    ]]>
</fx:Script>

<fx:Declarations>
    <fx:Number id="rotX">0</fx:Number>
    <fx:Number id="rotY">0</fx:Number>
    <fx:Number id="rotZ">0</fx:Number>
    <s:Rotate3D id="fx" autoCenterProjection="true" autoCenterTransform="true"/>
</fx:Declarations>
<s:VGroup id="vGroup" left="10" top="10">
    <s:Button label="X" buttonDown="moveX()"/>
    <s:Button label="Y" buttonDown="moveY()"/>
</s:VGroup>
<s:BorderContainer id="container" width="200" height="200" horizontalCenter="0"
                   verticalCenter="0">
    <s:BitmapImage id="image" width="200" height="200" horizontalCenter="0" smooth="true"
                   source="@Embed('assets/circle.png')" verticalCenter="0"/>
</s:BorderContainer>

0
0
0

查看AutoCenter Transform。它看起来很可疑。AutoCenter Transform将旋转中心放在目标的中心,而不是左上角。我试过不用,但它不能解决问题。好吧,不管怎样,这都很可能是投影点问题,投影点太深或太远。尝试将
autoCenterProjection
设置为
false
,并将
autoCenterTransform
分别设置为
true
false
。看看这能不能解决你的问题!这个想法真的很好,但是在尝试了所有4种可能的解决方案后,通过切换
autoCenterProjection
autoCenterTransform
,什么都不起作用。看起来不管目标的方位如何,X、Y和Z轴都是固定的。不幸的是,我没能让旋转3D像我一样工作。所以,我很难过,但我必须使用外部库。有人知道一个非常轻的库,它在
IVisualElement
上执行3D旋转,而没有恼人的z轴吗?