动画未在WPF 3D中运行

动画未在WPF 3D中运行,wpf,animation,3d,transformation,Wpf,Animation,3d,Transformation,有人能帮我找出这不起作用的原因吗: 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 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。请帮我找出我做错了什么。

您试图在类型为
ModelVisual3D
的对象上设置
ScaleTransform3D.ScaleZProperty
的动画,该对象没有该属性。你应该换衣服

var path = "Transform.Children[0].ScaleZ";
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(path));
Storyboard.SetTarget(scaleAnimation, modelVisual);
您还可以通过省略情节提要来简化代码。就打电话

scaleTransform3D.BeginAnimation(ScaleTransform3D.ScaleZProperty, scaleAnimation)
另外,您应该使用值为1的
ScaleZ
初始化
scaleTransform3D
,因为您希望将
ScaleZ
从1设置为2

var scaleTransform3D = new ScaleTransform3D(1, 1, 1);
或默认构造函数,因为所有比例值默认为1

var scaleTransform3D = new ScaleTransform3D();

嗨,克莱门斯,我尝试使用Storyboard.SetTarget(scaleAnimation,scaleTransform3D);但它不起作用。在我发表这篇文章之前,我确实尝试过scaleTransform3D.BeginAnimation(scaleTransform3D.ScaleZProperty,scaleAnimation),但是动画立即开始,而不是从我设置的起始时间开始。是的,故事板可能无法工作,因为动画目标不是框架元素。请参见我的编辑,我现在更改了属性路径而不是动画目标。尽管它仍然不是一个框架元素。嗯,我不确定。你能再检查一下
BeginAnimation
解决方案吗?嗨,克莱门斯,你的代码抛出异常,但从那以后我改为Storyboard.SetTarget(scaleAnimation,modelVisual);Storyboard.SetTargetProperty(scaleAnimation,新属性路径(“Transform.Children[0].ScaleZ”);动画开始了。但另一个奇怪的问题出现了:首先是缩放后的结果出现,然后在开始时,动画开始。为什么会这样?对不起,我不知道。事实上,我从来没有用过所有这些3D的东西,只是简单的2D变换和视觉效果。如果在动画声明中省略了From=1的
,会发生什么?如果我省略From=1,动画将不会运行,它需要From和To值才能知道从何处开始感谢Clemens的帮助,它现在正在工作:只需要更改两行:Storyboard.SetTargetProperty(scaleAnimation,new PropertyPath(“Transform.Children[0].ScaleZ”)); var scaleTransform3D=新的scaleTransform3D(1,1,1);