重复旋转无动画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秒
如果问题是缺少延迟导致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)