重复旋转无动画c# Wpf

本文关键字:Wpf 动画 旋转 | 更新日期: 2023-09-27 18:04:15

我有这个函数,每次我用鼠标双击模型时,都会将模型旋转15度。它在Y轴上旋转,每次旋转时,相机都会向上移动,因此模型将留在场景中,并且在双击3次后不会消失。

需要双击24次才能使模型旋转并回到初始位置,所以我想做的是只双击一次,模型就会自动旋转360度,但我不想使用动画。我试图在"SpatialMouse-Doubleclick"功能中使用for循环,但没有工作。例如,如果我在For循环

for (int i = 0; i < 20; i++)

模型将只显示在它的最终位置。

无论如何,我可以查看for循环的步骤像动画,而不是最后一步吗?或者是否有其他方法可以使用我的代码而不使用动画来进行旋转?

private void SetViewPosition()
{
    Vector3D vAxis = new Vector3D(0, 1, 0);
    //R= AxisAngleRotation3D
    AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, -45);
    RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
    gCamWC = myRotationTransform.Value;
    gCamWC.M14 = -13;
    gCamWC.M24 = 0;
    gCamWC.M34 = 13;
    Point3D camPosition = new Point3D(gCamWC.M14,gCamWC.M24, gCamWC.M34);
    Vector3D startLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
    Vector3D startLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
    DrawingControl.Viewport.SetView(camPosition, startLookAt, startLookUp, 0);
}
private void SpatialControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    Vector3D vAxis = new Vector3D(0, 1, 0);
    AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, -15);
    RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
    Matrix3D doTranslation = new Matrix3D();
    doTranslation.M34 = 4;
    gCamWC.Append(myRotationTransform.Value);
    gCamWC.Append(doTranslation);
    Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
    Vector3D camLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
    Vector3D camLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
    DrawingControl.Viewport.SetView(camPosition, camLookAt, camLookUp,0);
}
<<p> 解决方案/strong>

我将函数SpatialControl_MouseDoubleClick重命名为RotatingModel并将"MouseButtonEventArgs"更改为"EventArgs"。

然后我将以下代码添加到我想要调用RotatingModel()的函数。

//Add Dispatcer Time so the Rotation will be repeated
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += RotatingModel;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);//(h,m,s)
dispatcherTimer.Start();

现在,当我调试我的项目模型自动旋转15度每1秒

重复旋转无动画c# Wpf

如果问题是缺少延迟导致for循环完成得太快,一个可能的解决方案可能是使用Timer对象:https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

计时器有一个间隔,你可以设置为任意毫秒数,它有一个经过的事件。您可以尝试使用Interval,直到旋转速度看起来合适为止。

注意:如果在WPF应用程序中使用了System.Timers.Timer,那么值得注意的是System.Timers.Timer在不同的线程上运行,而不是在用户界面(UI)线程上运行。为了访问用户界面(UI)线程上的对象,有必要使用Invoke或BeginInvoke将操作发布到用户界面(UI)线程的Dispatcher上。使用DispatcherTimer而不是System.Timers.Timer的原因是DispatcherTimer与Dispatcher运行在同一个线程上,并且DispatcherPriority可以在DispatcherTimer上设置。(来源:https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer (v = vs.110) . aspx)