我正在尝试使用WPF在3D中旋转一些旋转,如果我手动触发它们(在点击时)一切都很好,但是如果我计算应该在Viewport3D上进行的动作,所有动画似乎都会在同一时间。
计算运动的代码如下:
for(int i=0; i<40; i++){
foo(i);
}
foo(int i)
的样子:
//compute axis, angle
AxisAngleRotation3D rotation = new AxisAngleRotation3D(axis, angle);
RotateTransform3D transform = new RotateTransform3D(rotation, new Point3D(0, 0, 0));
DoubleAnimation animation = new DoubleAnimation(0, angle, TimeSpan.FromMilliseconds(370));
rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, animation);
axis
和angle
的计算不是耗时,简单的归因,所以我猜问题是所有动画都会触发下一帧,因为当前帧已经完成计算时“上方”。
如何在代码(而不是XAML)中按顺序而不是一次性显示这些动画?
PS:一切都在C#中,没有XAML。
答案 0 :(得分:1)
您可以向Storyboard添加多个动画,并将每个动画的BeginTime设置为上一个动画的持续时间总和:
var storyboard = new Storyboard();
var totalDuration = TimeSpan.Zero;
for (...)
{
var rotation = new AxisAngleRotation3D(axis, angle);
var transform = new RotateTransform3D(rotation, new Point3D(0, 0, 0));
var duration = TimeSpan.FromMilliseconds(370);
var animation = new DoubleAnimation(0, angle, duration);
animation.BeginTime = totalDuration;
totalDuration += duration;
Storyboard.SetTarget(animation, rotation);
Storyboard.SetTargetProperty(animation, new PropertyPath(AxisAngleRotation3D.AngleProperty));
storyboard.Children.Add(animation);
}
storyboard.Begin();
请注意,我没有测试过上面的代码,对于任何错误都很抱歉。
或者您创建动画的方式是每个动画(从第二个动画开始)在前一个动画的Completed处理程序中启动。