示例#1
0
        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);
            }
        }