protected void ProceedRotate(Dictionary <string, object> parlist) { ParamTimer tmr = (ParamTimer)parlist["timer"]; double interval = 0; double stepX = (double)parlist["stepz"]; double stepY = (double)parlist["stepy"]; CameraTransformHandler stepCallback = (CameraTransformHandler)parlist["stepcallback"]; CameraTransformHandler callback = (CameraTransformHandler)parlist["callback"]; double remains = 0; if (tmr != null) { interval = tmr.Interval; remains = (double)parlist["timeremains"]; } //Quaternion delta = new Quaternion(Vector3D.CrossProduct(cmr.UpDirection, cmr.LookDirection), stepZ); //new Quaternion(cmr.UpDirection, stepY); //delta *= new Quaternion(cmr.UpDirection, stepY); try { Matrix3D m = MatrixHelper.CalcRotationMatrix(-stepX, stepY, 0, cmr.Position, new Vector3D(0, 1, 0), cmr.LookDirection, cmr.Transform, MatrixHelper.RotationType.LockAxisY); parlist["timeremains"] = remains - interval; //m.RotateAt(delta, cmr.Position); //m.RotateAtPrepend(delta, cmr.Position); MatrixTransform3D o = (MatrixTransform3D)cmr.Transform; cmr.Transform = new MatrixTransform3D(Matrix3D.Multiply(o.Matrix, m)); if (tmr != null && remains - interval <= 0) { tmr.Stop(); if (callback != null) { callback(this); } return; } if (stepCallback != null) { stepCallback(this); } if (OnCameraStatusChange != null) { OnCameraStatusChange(this); } } catch (Exception err) { Exceptions.LogOnly(err); } }
void ProceedOffset(object sender, Model3DParams mp) { ParamTimer tmr = (ParamTimer)sender; if (IsHostReady) { double remains = mp.Remains; double interval = mp.Interval; mp.Remains = remains - interval; FrequentMessage msg = (FrequentMessage)tmr.Param; hostVisual.Transform = MatrixHelper.Offset(hostVisual.Transform, mp.OffsetVector.X, mp.OffsetVector.Y, mp.OffsetVector.Z); if (remains > interval) { tmr.Start(); } else { msg.Release(); } } }
void ProceedRotate(object sender, Model3DParams mp) { ParamTimer tmr = (ParamTimer)sender; if (IsHostReady) { double remains = mp.Remains; double interval = mp.Interval; mp.Remains = remains - interval; FrequentMessage msg = (FrequentMessage)tmr.Param; hostVisual.Transform = MatrixHelper.Rotate3D(hostVisual.Transform, mp.StepX, mp.StepY, mp.StepZ, hostVisual.OriginPosition, hostVisual.OriginUpDir, hostVisual.OriginLookDir, MatrixHelper.RotationType.LockAxisY); if (remains > interval) { tmr.Start(); } else { msg.Release(); } } }