四元数动画不具有动画效果

时间:2017-10-22 19:39:25

标签: uwp

我正在尝试在可视层中执行四元数动画。但后来我运行它没有动画的代码,它只是在两个状态之间跳转。我做错了什么?

        var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

        var visual = compositor.CreateSpriteVisual();

        visual.Size = new Vector2(25, 25);
        visual.Offset = new Vector3(150, 150, 0);
        visual.Brush = compositor.CreateColorBrush(Colors.Green);

        ElementCompositionPreview.SetElementChildVisual(this, visual);

        var orientationAnimation = compositor.CreateQuaternionKeyFrameAnimation();
        orientationAnimation.InsertKeyFrame(0f, new Quaternion(0, 0, 0, 0));
        orientationAnimation.InsertKeyFrame(0.25f, new Quaternion(0, 1, 2, 3));
        orientationAnimation.InsertKeyFrame(0.75f, new Quaternion(0, 0, 0, 0));
        orientationAnimation.Duration = TimeSpan.FromMilliseconds(1000);
        orientationAnimation.IterationBehavior = AnimationIterationBehavior.Forever;

        visual.StartAnimation(nameof(visual.Orientation), orientationAnimation);

        visual.StartAnimation(nameof(visual.Orientation), orientationAnimation);

缩放等动画效果很好:

        var scaleAnimation = compositor.CreateVector3KeyFrameAnimation();

        scaleAnimation.InsertKeyFrame(0f, new Vector3(1, 1, 0));
        scaleAnimation.InsertKeyFrame(1f, new Vector3(4, 4, 0));
        scaleAnimation.Duration = TimeSpan.FromMilliseconds(3500);
        scaleAnimation.IterationBehavior = AnimationIterationBehavior.Forever;

1 个答案:

答案 0 :(得分:1)

  

然后我运行它没有动画的代码,它只是在两个状态之间跳转。

对于“它只是在两个状态之间跳转”,通过运行上面的代码片段,这个效果应该只是结果动画。 “跳转”可能是由于持续时间太短而无法制作动画,“两个”状态取决于您如何定义关键帧的Quaternion值。

我不确定你想要的确切效果是什么,但我猜你不认为它是动画的原因是动画没有显示出明显平滑的旋转。在这种情况下,您可以尝试更改关键帧的Quaternion值以与其他角度一起旋转以进行测试。并且还添加更长的持续时间以让动画显示出来。例如:

ElementCompositionPreview.SetElementChildVisual(GlassHost, visual);
var orientationAnimation = compositor.CreateQuaternionKeyFrameAnimation();
orientationAnimation.InsertKeyFrame(0f, new Quaternion(0, 0, 0, 0));
// Create a Quaternion that represents a 45 degree rotation around X Axis
orientationAnimation.InsertKeyFrame(0.25f, new Quaternion(0.380f, 0f, 0.0f, 0.92f));
orientationAnimation.InsertKeyFrame(0.75f, new Quaternion(1f, 1f, 0f, 0f));          
orientationAnimation.Duration = TimeSpan.FromMilliseconds(5000);
orientationAnimation.IterationBehavior = AnimationIterationBehavior.Forever;
visual.StartAnimation(nameof(visual.Orientation), orientationAnimation);

有关详细信息,请参阅QuaternionKeyFrameAnimation,要计算Quaternion以满足您的要求,请自行尝试,因为它需要复杂的数学计算。