private void Window_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { Point currentPosition = e.GetPosition(Cube); Point realDifference = new Point(previousMousePosition.X - currentPosition.X, previousMousePosition.Y - currentPosition.Y); Point difference = new Point(Math.Abs(previousMousePosition.X - currentPosition.X), Math.Abs(previousMousePosition.Y - currentPosition.Y)); var swipe = difference.X > difference.Y ? (Difference : difference.X, Axis : "X") : (Difference : difference.Y, Axis : "Y"); if (swipe.Difference > 100) { double angle = swipe.Axis == "X" ? realDifference.X : realDifference.Y; if (angle < 0) { angle = 270; //поворот влево либо вверх (-90 градусов) реализован поворотом вправо/вниз на 3 грани (270 градусов) во избежания отрицательных значений и ошибки } else { angle = 90; } Vector3D axis = swipe.Axis == "X" ? new Vector3D(0, 1, 0) : new Vector3D(1, 0, 0); Quaternion newPosition; Console.WriteLine($"Current axis {currentCubePosition.Axis}"); Console.WriteLine($"Current angle {currentCubePosition.Angle}"); if (currentCubePosition.Axis != axis) { newPosition = new Quaternion(axis, angle); } else { newPosition = new Quaternion(axis, currentCubePosition.Angle + angle); } if (currentCubePosition.Axis.X == 1 && currentCubePosition.Angle == 90 && newPosition.Axis.X == 1 && newPosition.Angle == 180) { Console.WriteLine("bot to back"); newPosition = new Quaternion(new Vector3D(0, 1, 0), 180); } if (currentCubePosition.Axis.X == 1 && currentCubePosition.Angle == 270 && newPosition.Axis.X == 1 && newPosition.Angle == 180) { Console.WriteLine("top to back"); newPosition = new Quaternion(new Vector3D(0, 1, 0), 180); } var rotation = new QuaternionAnimation(currentCubePosition, newPosition, new Duration(TimeSpan.FromSeconds(1))); currentCubePosition = newPosition; CameraRotation.BeginAnimation(QuaternionRotation3D.QuaternionProperty, rotation); } }