Resumé

Tweener(Of T) e 3D in WPF

Cristian Merighi () 5,00

Coivolgimento del Tweener, nato per Silverlight, in scenari di animazione 3D prerogativa di WPF. Eccone un esempio.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.

A chiusura del mio ultimo post sul Tweener(Of T) per Silverlight, ho lasciato promettendomi di testarne il funzionamento in ambiente WPF 3D.
Ora che ho fatto tali tests. Eccone i risultati...

tweener on 3D hedra

Lo screenshot sopra illustra una scena 3D nella quale i cinque poliedri classici ruotano attorno all'asse Y (in WPF l'asse X percorre lo schermo da sinistra a destra, l'asse Y dal basso in alto mentre l'asse Z entra perpendicolarmente nello schermo come il nostro sguardo).
Si tratta di un applictivo WPF dummy, di puro test, ed installabile da qui via ClickOnce.

Non è accompagnato da istruzioni, quindi è bene che sappiate che per far "ballare" i poliedri dovete pigiare sui tasti Left e Right!
Il ModelVisual3D che contiene tutti i poliedri viene ruotato (con Easing.Back easing) cosicché i vari poliedri si succedono come protagonisti della scena.
Il solido che riceve questa sorta di "focus" comincia a ruotare (l'asse di rotazione è un asse generico passante per il centro del sistema riferimento solidale al poliedro), e continua a ruotare in Loop (*novità) finché il focus non passa ad un altro oggetto.

Il codice C# per la realizzazione dell'applicativo - piuttosto banale - è presto illustrato: ho messo in azione il tweener su diversi AxisAngleRotation3D DependencyObjects modificandone la AngleProperty DependencyProperty.
Ecco come:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using Pacem.Media.Tweening;

using System.Windows.Media.Media3D;

using Pacem.Media.Media3D;

 

namespace Test_WpfApp

{

    public partial class Window1 : Window

    {

        public Window1()

        {

            InitializeComponent();

            solids = new Solid[] { dodeca, tetra, octa, hexa, icosa };

        }

 

        private Tween<double> tween;

        private Tween<double> tween2;

        private int jTick = 0;

        private Solid[] solids = null;

 

        private void RootPage_KeyUp(object sender, KeyEventArgs e)

        {

            switch (e.Key)

            {

                case Key.Left:

                    if (tween != null) Tweener<double>.Stop(tween, true);

                    tween = Tweener<double>.CreateTween(

                        rotation,

                        AxisAngleRotation3D.AngleProperty,

                        Pacem.Media.Tweening.Easing.Back.EaseOut,

                        rotation.Angle, 72D * (double)++jTick,

                        TimeSpan.FromSeconds(1D));

                    break;

                case Key.Right:

                    if (tween != null) Tweener<double>.Stop(tween, true);

                    tween = Tweener<double>.CreateTween(

                        rotation,

                        AxisAngleRotation3D.AngleProperty,

                        Pacem.Media.Tweening.Easing.Back.EaseOut,

                        rotation.Angle, 72 * (double)--jTick,

                        TimeSpan.FromSeconds(1D));

 

                    break;

            }

            if (tween != null)

            {

                tween.MotionStarted += new EventHandler(tween_MotionStarted);

                tween.MotionFinished += new EventHandler(tween_MotionFinished);

            }

        }

 

        void tween_MotionFinished(object sender, EventArgs e)

        {

            int index = (int)(((Tween<double>)sender).Finish / -72D) % 5;

            if (index < 0) index = 5 + index;

            AxisAngleRotation3D rotation = ((RotateTransform3D)

                ((Transform3DGroup)solids[index].Transform).Children[1]).Rotation

                as AxisAngleRotation3D;

            tween2 = Tweener<double>.CreateTween(

                rotation,

                AxisAngleRotation3D.AngleProperty,

                Pacem.Media.Tweening.Easing.Quad.EaseInOut,

                rotation.Angle, rotation.Angle+360D,

                TimeSpan.FromSeconds(2.5D));

            tween2.FinishedBehavior = ClockFinishedBehavior.Loop;

        }

 

        void tween_MotionStarted(object sender, EventArgs e)

        {

            int index = (int)(((Tween<double>)sender).Start / -72D) % 5;

            if (index < 0) index = 5 + index;

            if (tween2 != null) Tweener<double>.Stop(tween2, true);

        }

    }

}

E qui un estratto esemplificativo dello XAML:

<Window x:Class="Test_WpfApp.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006"

    xmlns:pacemHedra="clr-namespace:Pacem.Media.Media3D.Hedra;assembly=Pacem.Media"

    xmlns:primitives="clr-namespace:Pacem.Media.Media3D.Primitives;assembly=Pacem.Media"

    xmlns:pacem="clr-namespace:Pacem.Media.Media3D;assembly=Pacem.Media"

    x:Name="RootPage" Width="640" Height="250"

    Title="Cristian Merighi Polyhedra" KeyUp="RootPage_KeyUp">

<!--

...[OMITTED XAML]...

-->

 

<ModelVisual3D x:Name="scene">

    <ModelVisual3D.Transform>

        <RotateTransform3D>

            <RotateTransform3D.Rotation>

<AxisAngleRotation3D x:Name="rotation" Angle="0" Axis="0,1,0" />

            </RotateTransform3D.Rotation>

        </RotateTransform3D>

    </ModelVisual3D.Transform>

<!--

...[OMITTED XAML]...

-->

<!-- octahedron -->

<pacemHedra:Octahedron x:Name="octa">

    <ModelVisual3D.Transform>

        <Transform3DGroup>

        <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="-3" />

            <RotateTransform3D CenterX="0" CenterY="0" CenterZ="-3">

                <RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="-1,.15,.65" Angle="0"/>

                </RotateTransform3D.Rotation>

            </RotateTransform3D>

            <RotateTransform3D>

            <RotateTransform3D.Rotation>

                <AxisAngleRotation3D Axis="0,1,0" Angle="144" />

            </RotateTransform3D.Rotation>

        </RotateTransform3D>

        </Transform3DGroup>

    </ModelVisual3D.Transform>

    <pacemHedra:Octahedron.Material>

        <MaterialGroup>

            <DiffuseMaterial>

                <DiffuseMaterial.Brush>

<SolidColorBrush Color="#c00099ff" />

                </DiffuseMaterial.Brush>

            </DiffuseMaterial>

            <SpecularMaterial>

                <SpecularMaterial.Brush>

<SolidColorBrush Color="#ff00ccff" />

                </SpecularMaterial.Brush>

            </SpecularMaterial>

        </MaterialGroup>

    </pacemHedra:Octahedron.Material>

</pacemHedra:Octahedron>

<!--

...[OMITTED XAML]...

-->

</ModelVisual3D>

Il risultato è stato davvero incoraggiante!
Come già fatto per Silvelight, aggiungerò probabilmente delle compatibilità ad hoc per gli oggetti Visual3D, con supporto di Point3D e Vector3D.
A presto quindi...

Take care. Bye.

Feedbacks

  • Re: Tweener(Of T) and 3D in WPF

    Adam Hill giovedì 24 luglio 2008 5,00

    Cristian, Awesome, awesome library. Any chance you can (or are) going to post your Tweener libs for WPF? I was about to start cutting and pasting, but was wondering if there would be an *official* version from you soon?

  • Re: Tweener(Of T) and 3D in WPF

    CMerighi mercoledì 6 agosto 2008 0,00

    Hi Adam, I've no plans about publishing WPF libraries (it's about a trivial cut'n'paste work), but I will update my Tweener component along with the publishing of my forthcoming 3D engine for SL. I'll keep the names similar to those found in PresentationCore.dll (Vector3D, Point3D...) so cut'n'paste process will be still viable ;)

  • Re: Tweener(Of T) and 3D in WPF

    hello mercoledì 17 dicembre 2008 0,00

    Why the cube for menu can't Exsit Menu's Name!

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds