Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Практикум по КГ (версия 6).docx
Скачиваний:
165
Добавлен:
29.05.2015
Размер:
10.09 Mб
Скачать

Создание анимации с помощью таймера

В данном разделе рассмотрим создание простейшей анимации без использования специальных классов для анимации, таких как Vector3DAnimation,Vector3DAnimationUsingKeyFramesи пр. Анимация будет создаваться с помощью таймера.

Для работы с таймером в WPFиспользуется классDispatcherTimer, который инициализируется в процедурном коде следующим образом.

MyTimer = new DispatcherTimer();

MyTimer.Tick += new EventHandler(MyTimer_Tick);

MyTimer.Interval = new TimeSpan(100000);

Свойство Intervalопределяет частоту срабатывания таймера. Через свойствоTickопределяется метод (в нашем случаеMyTimer_Tick), который будет запускаться по тику таймера. Метод, запускающийся по тику таймера, например, можно описать следующим образом.

private void MyTimer_Tick(object sender, EventArgs e)

{

}

Для запуска и остановки таймера необходимо использовать его методы Start()иStop().

Для задания различных трехмерных преобразований к различным объектом не только описываются разные 3Dмодели, но и создаются различные объекты из классаTransform3D. Рассмотрим пример поворота двух граней вокруг осейyиzв разных направлениях. При описании 3Dмоделей в отличие от предыдущего примера добавим описание цвета обратной стороны грани.XAML описание для элементаViewport3D будет следующее.

<Viewport3D ClipToBounds="True" Width="300" Margin="102,0,102,71">

<!-- Определяем положение и направление камеры. -->

<Viewport3D.Camera>

<PerspectiveCamera Position="0,0,2" LookDirection="0,0,-1" FieldOfView="45"/>

</Viewport3D.Camera>

<!-- Определяем дочернии объекты для Viewport3D -->

<Viewport3D.Children>

<!-- Устанавливаем направления и цвет источника освещения. -->

<ModelVisual3D>

<ModelVisual3D.Content>

<DirectionalLight Color="#FFFFFF" Direction="-1,-1,-1" />

</ModelVisual3D.Content>

</ModelVisual3D>

<!-- Определяем первую 3D модель -->

<ModelVisual3D x:Name="MyModel">

<ModelVisual3D.Content>

<GeometryModel3D>

<!-- Определяем 3D объект -->

<GeometryModel3D.Geometry>

<MeshGeometry3D

TriangleIndices="0,1,2"

Positions="-0.1,-0.1,0.1 0.1,-0.1,0.1 0.1,0.1,0.1">

</MeshGeometry3D>

</GeometryModel3D.Geometry>

<!-- Зададим материал (цвет) объекта -->

<GeometryModel3D.Material>

<MaterialGroup>

<DiffuseMaterial Brush="Blue"/>

</MaterialGroup>

</GeometryModel3D.Material>

<!-- Зададим цвет обратной стороны -->

<GeometryModel3D.BackMaterial>

<MaterialGroup>

<DiffuseMaterial Brush="Green"/>

</MaterialGroup>

</GeometryModel3D.BackMaterial>

<!-- Перенесем объект влево -->

<GeometryModel3D.Transform>

<TranslateTransform3D OffsetX="-0.5"/>

</GeometryModel3D.Transform>

</GeometryModel3D>

</ModelVisual3D.Content>

</ModelVisual3D>

<!-- Определяем вторую 3D модель -->

<ModelVisual3D x:Name="MyModel2">

<ModelVisual3D.Content>

<GeometryModel3D>

<!-- Определяем 3D объект -->

<GeometryModel3D.Geometry>

<MeshGeometry3D

TriangleIndices="0,1,2"

Positions="-0.1,-0.1,0.1 0.1,-0.1,0.1 0.1,0.1,0.1">

</MeshGeometry3D>

</GeometryModel3D.Geometry>

<!-- Зададим материал (цвет) объекта -->

<GeometryModel3D.Material>

<MaterialGroup>

<DiffuseMaterial Brush="Red"/>

</MaterialGroup>

</GeometryModel3D.Material>

<!-- Зададим цвет обратной стороны -->

<GeometryModel3D.BackMaterial>

<MaterialGroup>

<DiffuseMaterial Brush="Yellow"/>

</MaterialGroup>

</GeometryModel3D.BackMaterial>

<!-- Перенесем объект вправо -->

<GeometryModel3D.Transform>

<TranslateTransform3D OffsetX="0.5"/>

</GeometryModel3D.Transform>

</GeometryModel3D>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D.Children>

</Viewport3D>

Обработчик события Loadedбудет выглядеть следующим образом.

private void Window_Loaded(object sender, RoutedEventArgs e)

{

//Создаем преобразования для 1 объекта

myYRotate = new RotateTransform3D();

myYAxis = new AxisAngleRotation3D();

myYAxis.Axis = new Vector3D(0, 1, 0);

myYAxis.Angle = 0;

myYRotate.Rotation = myYAxis;

myZRotate = new RotateTransform3D();

myZAxis = new AxisAngleRotation3D();

myZAxis.Axis = new Vector3D(0, 0, 1);

myZAxis.Angle = 0;

myZRotate.Rotation = myZAxis;

myTransform1 = new Transform3DGroup();

MyModel.Transform = myTransform1;

myTransform1.Children.Add(myYRotate);

myTransform1.Children.Add(myZRotate);

//Создаем преобразования для 2 объекта

myYRotate2 = new RotateTransform3D();

myYAxis2 = new AxisAngleRotation3D();

myYAxis2.Axis = new Vector3D(0, 1, 0);

myYAxis2.Angle = 0;

myYRotate2.Rotation = myYAxis2;

myZRotate2 = new RotateTransform3D();

myZAxis2 = new AxisAngleRotation3D();

myZAxis2.Axis = new Vector3D(0, 0, 1);

myZAxis2.Angle = 0;

myZRotate2.Rotation = myZAxis2;

myTransform2 = new Transform3DGroup();

MyModel2.Transform = myTransform2;

myTransform2.Children.Add(myYRotate2);

myTransform2.Children.Add(myZRotate2);

// Подготоваливаем таймер к работа

MyTimer = new DispatcherTimer();

MyTimer.Tick += new EventHandler(MyTimer_Tick);

MyTimer.Interval = new TimeSpan(100000); }

Тик таймера выглядит следующим образом.

private void MyTimer_Tick(object sender, EventArgs e)

{

myYAxis.Angle += 1;

myZAxis.Angle += 1;

myYAxis2.Angle -= 2;

myZAxis2.Angle -= 2;

}

Остается добавить две кнопки для запуска и остановки таймера и их обработчики.

private void button1_Click(object sender, RoutedEventArgs e)

{

MyTimer.Start();

}

private void button2_Click(object sender, RoutedEventArgs e)

{

MyTimer.Stop();

}