Применение преобразований на месте к 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 ответ:
Я уверен, что существует метод получения текущего угла поворота Эйлера в градусах из матрицы преобразования объекта. Затем вы можете использовать его как значение " от "и анимировать в значение" до".
В противном случае просто создайте переменную где-нибудь в приложении, которая запоминает количество градусов, на которые был повернут куб. Каждый раз, когда функция запускается, просто добавьте количество градусов, которое вы хотите, чтобы она вращалась, а затем сохраните результат обратно в свой переменная.
Некоторый псевдокод:
angle = 0 function onClick: new_angle = angle + 30 Animate(angle, new_angle) angle = new_angle