Применение преобразований на месте к 3D-модели в WPF - PullRequest
2 голосов
/ 05 февраля 2009

У меня есть простой 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 Ответ

1 голос
/ 05 февраля 2009

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

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

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

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