WPF 3D旋转动画

时间:2009-11-16 01:54:28

标签: wpf animation 3d rotation

我的屏幕上有几个3d矩形,我想围绕Y轴旋转。

我想用鼠标按下,然后将3d对象旋转到最大旋转,但是当用户移动鼠标时,我想稍微旋转它,使其看起来像跷跷板(从一个范围旋转在Y轴上-13到13度。)

目前,我可以做到这一点,但是当我快速移动鼠标时,我的帧率确实很差。因此,例如,当我单击矩形的左侧时,我生成一个故事板和动画对象,然后将3d对象旋转到-13度。然后,当我稍微向右移动鼠标时,我想将其旋转到-12.5,依此类推......

同样,我可以做到这一切,只是性能受到很大影响!在某些情况下,它降至5-FPS ......这是不可接受的。

我的问题是我这样做是最好的方式吗?你怎么能在屏幕上的用户位置上设置旋转动画?

感谢您提供的任何帮助! 标记

2 个答案:

答案 0 :(得分:2)

我假设您正在执行以下操作:

  • 为您正在旋转的物体使用单独的Model3D&将它包含在Model3DGroup中
  • 给它一个包含AxisAngleRotation3D的RotateTransform3D
  • 在Storyboard中为AxisAngle3D的Axis属性设置动画

如果我的假设是正确的,我认为我们可以得出结论,问题在于渲染的效率,因为更新单个Axis值,重新计算Transform以及更新MILCore所需的CPU可以忽略不计。

我可以想到几种可以提高渲染性能的方法:

  1. 如果您正在旋转的Model3D是由MeshGeometry3D支持的GeometryModel3D,请尽可能多地简化网格和使用的材质。它还可以帮助替换不同的网格物体。

  2. 如果正在旋转的Model3D是使用VisualBrush画笔的GeometryModel3D,则在动画期间暂时将VisualBrush替换为包含BitmapImage的ImageBrush,该BitmapImage是动画启动瞬间VisualBrush的Visual底层快照。当动画结束时,放回VisualBrush。用户可能不会注意到对象的内容在旋转时会暂时冻结。 (请注意,如果您的Visual3D是Viewport2DVisual3D,则可以使用相同的技术。)

  3. 如果正在旋转的Model3D与其他对象组合成Model3DGroup但完全位于其他组的前面或后面,请将模型分离到各自独立的Viewport3DVisual中,并进行适当的分层以获得所需的效果。 / p>

  4. 简化灯光或材质类型

  5. 监控实际帧速率,如果在使用情节提要时它过低,请立即将对象旋转到鼠标指示的位置,而不使用动画。

答案 1 :(得分:0)

MSDN提供some tips有关WPF 3D性能的影响。如果您还没有发现它,请检查“性能影响:高”列表中的项目。

编辑: 2009年3月,Josh Smith在CodeProject上发布了an article,涉及旋转3D对象。也许你想检查他的解决方案。