【问题标题】:The animation not running in WPF 3D动画未在 WPF 3D 中运行
【发布时间】:2013-01-12 18:55:32
【问题描述】:

谁能帮我找出为什么这不起作用:

var story = new Storyboard {Duration = TimeSpan.FromSeconds(10)};

var meshBuilder = new MeshBuilder();
meshBuilder.AddCone(new Point3D(0, 0, 0), new Vector3D(0, 0, 1), 15, 10, 50, false, false, 20);

var mesh = meshBuilder.ToMesh();
var geometryModel = new GeometryModel3D
{
    Geometry = mesh,
    Material = new DiffuseMaterial(new SolidColorBrush(Colors.DeepSkyBlue)),
    BackMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.LightBlue)),
};
var modelVisual = new ModelVisual3D { Content = geometryModel };
helixViewport.Children.Add(modelVisual);

var scaleAnimation = new DoubleAnimation
{
    BeginTime = TimeSpan.FromSeconds(1),
    From = 1,
    To = 2,
    Duration = new Duration(TimeSpan.FromSeconds(10))
};
var scaleTransform3D = new ScaleTransform3D(1, 1, 2);

var transform3DGroup = new Transform3DGroup();
transform3DGroup.Children.Add(scaleTransform3D);

modelVisual.Transform = transform3DGroup;

story.Children.Add(scaleAnimation);
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(ScaleTransform3D.ScaleZProperty));
Storyboard.SetTarget(scaleAnimation, modelVisual);

story.Begin();

首先我只是使用 HelixToolkit 创建一个圆锥体,然后我想对其进行缩放。动画将持续 10 秒,从第 1 秒开始,持续 10 秒。但是动画没有执行,视口只显示了缩放后的最终结果。 注意:这是整个代码的简化部分,实际代码将有多个动画应用于多个模型,每个动画将在不同的时间开始。这就是为什么我想在这里使用故事板和 BeginTime。请帮我找出我做错了什么。

【问题讨论】:

  • 感谢 Clemens 的帮助,它现在正在工作:只需要更改 2 行: Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath("Transform.Children[0].ScaleZ"));和 var scaleTransform3D = new ScaleTransform3D(1, 1, 1);

标签: wpf animation 3d transformation


【解决方案1】:

您正在尝试为不具有该属性的ModelVisual3D 类型的对象上的ScaleTransform3D.ScaleZProperty 设置动画。你应该改变

var path = "Transform.Children[0].ScaleZ";
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(path));
Storyboard.SetTarget(scaleAnimation, modelVisual);

您还可以通过省略情节提要来简化代码。只需拨打电话

scaleTransform3D.BeginAnimation(ScaleTransform3D.ScaleZProperty, scaleAnimation)

此外,您应该将 scaleTransform3D 初始化为 ScaleZ 值 1,因为您希望将 ScaleZ 从 1 设置为 2。

var scaleTransform3D = new ScaleTransform3D(1, 1, 1);

或使用默认构造函数,因为所有比例值默认为 1。

var scaleTransform3D = new ScaleTransform3D();

【讨论】:

  • 嗨 Clemens,我尝试使用 Storyboard.SetTarget(scaleAnimation, scaleTransform3D);但它不工作。在我发布这篇文章之前,我确实尝试了 scaleTransform3D.BeginAnimation(ScaleTransform3D.ScaleZProperty, scaleAnimation) 但动画立即开始,而不是从我设置的 BeginTime 开始
  • 是的,Storyboard 可能无法工作,因为动画目标不是 FrameworkElement。查看我的编辑,我现在更改了属性路径而不是动画目标。尽管它仍然不是 FrameworkElement。好吧,我不确定这一点。您能否再次检查BeginAnimation 解决方案?
  • 嗨克莱门斯,你的代码抛出异常,但从那我改为 Storyboard.SetTarget(scaleAnimation, modelVisual); Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath("Transform.Children[0].ScaleZ"));动画开始。但是出现了另一个奇怪的问题:首先出现缩放后的结果,然后在 BeginTime 处开始动画。为什么会这样?
  • 对不起,我不知道。实际上我从来没有使用过所有这些 3D 的东西,只是简单的 2D 变换和视觉效果。如果在动画声明中省略 From = 1 会发生什么?
  • 如果我省略 From = 1,动画将不会运行,它需要 From 和 To 值才能知道从哪里开始
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2021-11-19
相关资源
最近更新 更多