2010-01-12 3 views
1

У меня есть ModelVisual3D куба. Я хочу перевести и повернуть его одновременно. Я хочу, чтобы центр вращения находился посредине куба (куб вращается вокруг собственной оси). Но когда я пытаюсь сделать это, применяя оба преобразования, эффект не то, что вы ожидаете. Поскольку объект переводится, центр вращения отличается тем, что он перемещается и вращается странным образом. Как получить желаемый эффект?3D анимация Вращение и перевод одновременно в WPF

Transform3DGroup transGroup = new Transform3DGroup(); 

DoubleAnimation cardAnimation = new DoubleAnimation(); 
cardAnimation.From = 0; 
cardAnimation.To = 3; 
cardAnimation.Duration = new Duration(TimeSpan.FromSeconds(2)); 

Transform3D transform = new TranslateTransform3D(0,0,0); 
transGroup.Children.Add(transform); 


RotateTransform3D rotateTransform = new RotateTransform3D(); 
AxisAngleRotation3D rotateAxis = 
    new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180); 
Rotation3DAnimation rotateAnimation = 
    new Rotation3DAnimation(rotateAxis, TimeSpan.FromSeconds(2)); 
rotateAnimation.DecelerationRatio = 0.8; 

transGroup.Children.Add(rotateTransform); 


Model.Transform = transGroup; 

transform.BeginAnimation(TranslateTransform3D.OffsetXProperty, 
    cardAnimation); 
rotateTransform.BeginAnimation(RotateTransform3D.RotationProperty, 
    rotateAnimation); 

ответ

2

Применить сначала поворот, а затем перевод. Это гарантирует, что куб вращается вокруг правильной точки - он центрирован, а затем переводится.

Что я имел в виду, это изменить порядок, в котором вы применяете свои преобразования. Матричное умножение не является коммутативным, поэтому вы получите разные результаты в зависимости от порядка применения преобразования.

Возможно, было бы проще обновить матрицы и повторно применить полное преобразование, а не применять дельта каждый раз.

+0

Вы имеете в виду вращение куба на месте, а затем переводить? Beacause это не то, что я хочу, я хочу, чтобы он был переведен и вращался так же, как земля двигается и вращается вокруг своей оси ... – synepis

+0

Спасибо за ваш ответ! Это то, что я искал. – synepis

0

Вот как это может быть сделано без перевода и преобразования:

rotateTransform.CenterX = 0; 
rotateTransform.CenterY = 0; 
rotateTransform.CenterZ = 0; 

Dont знает солнце в анимации. Он работает вручную после привязки его к ползунку

Смежные вопросы