Студопедия

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

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

    }

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.