Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






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

В данном разделе рассмотрим создание простейшей анимации без использования специальных классов для анимации, таких как 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();

}

 

Задание по лабораторной работе

Разработайте приложение, анимирующее трехмерную сцену в соответствии со своим вариантом.

 

1) Разработайте программу визуализирующую движение треугольника, прямоугольника, окружности, пирамиды, призмы по разным траекториям с плавно меняющейся скоростью движения.

2) Спроектируйте приложение отображающие различные объекты (пирамидки, кубики, отдельные грани), плавающие в невесомости. Вращение производится также вокруг собственной оси.

3) Реализуйте игру для развития памяти. Перед Вами несколько парных карт. На короткое время игра показывает, где какие карты лежат, затем все карты поворачиваются рубашками вверх. Необходимо вспомнить, где расположены одинаковые карты и выбрать их. При нажатии на карту реализуйте поворот карты вокруг собственной оси. При выборе двух одинаковых карт удалите данные карты по трехмерной траектории.

4) Разработайте программу анимирующую полет бабочки.

5) Создайте приложение анимирующее падение снежинок в 3D пространстве.

6) Реализуйте программу, визуализирующее несколько этапов складывания какого либо оригами.

7) Разработайте приложение анимирующее падение листочков с дерева в 3D пространстве.

8) Спроектируйте приложение отображающее многогранник. При нажатии на кнопку многогранник должен «взорваться», то есть грани должны разлететься в разные стороны, вращаясь вокруг своих осей.

9) Создайте программу визуализации движения планет в солнечной системе по 3D траекториям. Вместо сферической модели планет можно использовать упрощенные тела (куб, пирамид).

10) Разработайте приложение, выводящее 3D модель книги с переворачивающимися страницами.

11) Реализуйте программу, имитирующую полет бумеранга в 3D пространстве.

12) Разработайте 3D сцену пролета по сложным траекториям двух космических кораблей.

13) Создайте приложение, визуализирующее 3D модель удара кием по шару в биллиарде.

14) Спроектируйте программу анимирующую бросание игральных костей.

15) Создайте анимированную модель 3D шкафа, с возможностью открывания дверей и выдвижения ящиков.

16) Создайте анимированную модель 3D парусника с косым парусом. Реализуйте возможность движения модели не только в одной плоскости (движение по волнам) и возможность поворота паруса.

17) Разработайте анимированную 3D модель растения со стеблем и листочками.

18) Разработайте анимированную 3D модель цветка.

19) Создайте анимированную 3D модель дома, с возможностью открывания дверей и окон.

20) Спроектируйте приложение для анимации полета двух самолетов (разных фигур высшего пилотажа).

 

Последнее изменение этой страницы: 2016-06-10

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...