Применение преобразований на месте к 3D-модели в WPF


У меня есть простой 3D-куб, который я могу вращать, используя следующий код:

void mui3D_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
            RotateTransform3D rotation = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0), mui.Model.Bounds.Location);

            DoubleAnimation rotateAnim = new DoubleAnimation(0, 130d TimeSpan.FromMilliseconds(3000));

            rotateAnim.Completed += new EventHandler(rotateAnim_Completed); 

            mui.Transform = rotation;

            rotation.Rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, rotateAnim);
    }

Каждый раз, когда он выполняется, этот код поворачивает куб с помощью анимации вокруг оси Y под углом от 0 до 130 градусов.

Однако я хотел бы применить вращение "кумулятивно" так, чтобы учитывалось любое предыдущее вращение и куб начинал каждое вращение с угла, под которым он закончил предыдущее вращение.

Например: конструктор анимации, вместо требуя значения" от "и" до " для угла, просто поворачивает куб на дополнительные 130 градусов на основе любого текущего угла поворота.

Я мог бы легко использовать переменную-член, содержащую текущий угол, передать ее в анимацию и затем обновить ее, когда анимация завершится. Но мне интересно, существует ли стандартный подход с использованием WPF для достижения этой цели.

1 2

1 ответ:

Я уверен, что существует метод получения текущего угла поворота Эйлера в градусах из матрицы преобразования объекта. Затем вы можете использовать его как значение " от "и анимировать в значение" до".

В противном случае просто создайте переменную где-нибудь в приложении, которая запоминает количество градусов, на которые был повернут куб. Каждый раз, когда функция запускается, просто добавьте количество градусов, которое вы хотите, чтобы она вращалась, а затем сохраните результат обратно в свой переменная.

Некоторый псевдокод:

angle = 0
function onClick:
    new_angle = angle + 30
    Animate(angle, new_angle)
    angle = new_angle