예제 #1
0
파일: VForm.cs 프로젝트: yellowarmy/roduino
        private void ChangeStateForElement(int index, Visibility visibility)
        {
            Storyboard         sbOpacity   = null;
            Storyboard         sbGrayScale = null;
            Storyboard         sbBlur      = null;
            Viewport2DVisual3D model       = (Viewport2DVisual3D)Owner._modelContainer.Children[index];
            LoginGrid          loginGrid   = (LoginGrid)model.Visual;

            loginGrid.imgMoveToRight.Visibility = Visibility.Collapsed;
            loginGrid.imgMoveToLeft.Visibility  = Visibility.Collapsed;

            if (visibility == Visibility.Visible)
            {
                sbOpacity   = (Storyboard)(loginGrid).FindResource("sbFadein");
                sbGrayScale = (Storyboard)(loginGrid).FindResource("sbGrayEffectOut");
                //                sbBlur = (Storyboard)((LoginGrid)model.Visual).FindResource("sbBlurEffectIn");
                ((BlurEffect)(loginGrid).Effect).Radius = 0;
            }
            else
            {
                sbOpacity   = (Storyboard)(loginGrid).FindResource("sbFadeout");
                sbGrayScale = (Storyboard)(loginGrid).FindResource("sbGrayEffectIn");
                //                sbBlur = (Storyboard)((LoginGrid)model.Visual).FindResource("sbBlurEffectOut");
                ((BlurEffect)(loginGrid).Effect).Radius = 7;
            }
            sbOpacity.Begin((loginGrid));
            sbGrayScale.Begin((loginGrid));
            //            sbBlur.Begin(((LoginGrid)model.Visual));
        }
예제 #2
0
        private Viewport2DVisual3D CreateMeshModel(Visual visualElement)
        {
            var model = new Viewport2DVisual3D
            {
                Geometry = new MeshGeometry3D
                {
                    TriangleIndices = new Int32Collection(
                        new int[] { 0, 1, 2, 2, 3, 0 }),
                    TextureCoordinates = new PointCollection(
                        new Point[]
                    {
                        new Point(0, 1),
                        new Point(1, 1),
                        new Point(1, 0),
                        new Point(0, 0)
                    }),
                    Positions = CreateMeshPositions(visualElement as FrameworkElement)
                },
                Material = new DiffuseMaterial(),

                // Host the 2D element in the 3D model.
                Visual = visualElement
            };

            model.Transform = (InternalResources["Transfrom3DGroup"] as Transform3DGroup).Clone();

            Viewport2DVisual3D.SetIsVisualHostMaterial(model.Material, true);

            return(model);
        }
예제 #3
0
        protected override void OnVisualAdded(UIElement elt)
        {
            if (elt is Viewport3D)
            {
                return;
            }

            int index = Children.IndexOf(elt);

            Viewport2DVisual3D model = CreateLoginViewPort(elt);
            //set binding
            LoginGrid loginGrid = (LoginGrid)model.Visual;

            loginGrid.DataContext = elt;
            //                        loginGrid.txtConnectionName.Text = ((ListBoxItem)loginGrid.DataContext).Content.ToString();
            loginGrid.imgMoveToLeft.MouseDown  += MoveToLeft;
            loginGrid.imgMoveToRight.MouseDown += MoveToRight;

            _modelContainer.Children.Insert(index, model);
            model.SetValue(LinkedElementProperty, elt);
            elt.SetValue(LinkedModelProperty, model);
            if (IsLoaded)
            {
                ReflowItems();
            }
            SelectedIndex = Children.Count - 1;
        }
예제 #4
0
        public Tab(FrameworkElement element, Color color, double depth)
        {
            this.element = element;
            this.depth   = depth;

            visualHostMaterial = new DiffuseMaterial(Brushes.White);
            visualHostMaterial.SetValue(Viewport2DVisual3D.IsVisualHostMaterialProperty, true);

            boxMesh    = Box.CreateBoxMesh(1.1, 2.04, depth, Box.Side.Right | Box.Side.Left | Box.Side.Top | Box.Side.Bottom | Box.Side.Back);
            visualMesh = Box.CreateBoxMesh(1.1, 2.04, depth, Box.Side.Front);


            front = new Viewport2DVisual3D
            {
                Geometry = visualMesh,
                Visual   = element,
                Material = visualHostMaterial
            };


            back = new ModelVisual3D
            {
                Content = new GeometryModel3D
                {
                    Geometry = boxMesh,
                    Material = new DiffuseMaterial(Brushes.DarkGray),
                }
            };

            Model = new ModelVisual3D();

            Model.Children.Add(back);
            Model.Children.Add(front);
        }
예제 #5
0
        /**
         * This updates the target-names used for animations and also updates the
         * ItemIndex dependency property
         */

        private void UpdateElementIndexes(UIElement affectedElement, bool attach)
        {
            NameScope scope = (NameScope)NameScope.GetNameScope(_viewport);

            if (attach)
            {
                // Register name
                int childIndex           = VisibleChildrenCount - 1;
                Viewport2DVisual3D model = _modelGroup[childIndex];
                scope.RegisterName(ElementIdentifier + childIndex, model);
                affectedElement.SetValue(ItemIndexProperty, childIndex);
            }
            else // Element was detached
            {
                int index = (int)affectedElement.GetValue(ItemIndexProperty);

                // Unregister the previous set of names
                for (int i = index; i < VisibleChildrenCount; i++)
                {
                    scope.UnregisterName(ElementIdentifier + i);
                }

                // Re-register names and indexes
                int newIndex = index;
                for (int i = index + 1; i < VisibleChildrenCount; i++, newIndex++)
                {
                    UIElement elt = _modelGroup[i].Visual as UIElement;
                    elt.SetValue(ItemIndexProperty, newIndex);
                    scope.RegisterName(ElementIdentifier + newIndex, _modelGroup[i]);
                }
            }
        }
예제 #6
0
        public void RotateLeft(bool animated)
        {
            // If there's only 1 item here, there's nothing to rotate.
            if (base.Children.Count < 2)
            {
                return;
            }

            Viewport2DVisual3D frontMostItem = null;

            if (!this.TransparencySupportRequired)
            {
                // The children are not sorted by anything.
                frontMostItem = this.viewport3D.Children.OfType <Viewport2DVisual3D>()
                                .OrderByDescending(c => c.GetTransform3D <TranslateTransform3D>().OffsetZ)
                                .First();
            }
            else
            {
                // We know the viewport children are sorted by depth, so the last item is
                // the front most item.
                frontMostItem = this.viewport3D.Children.Last() as Viewport2DVisual3D;
            }

            var frontIndex = this.Children.IndexOf(frontMostItem.Visual as UIElement);
            var nextIndex  = frontIndex - 1 < 0 ? this.Children.Count - 1 : frontIndex - 1;

            this.AnimateIntoView(base.Children[nextIndex], animated);
        }
예제 #7
0
        /// <summary>
        /// Instantiates a new instance of the <see cref="Carousel3DPanel"/> class.
        /// </summary>
        public Carousel3DPanel()
        {
            this.elementModelMap = new Dictionary <UIElement, Viewport2DVisual3D>();

            this.geometry = new MeshGeometry3D()
            {
                Positions          = new Point3DCollection(new[] { new Point3D(-1, -1, 0), new Point3D(1, -1, 0), new Point3D(1, 1, 0), new Point3D(-1, 1, 0) }),
                TextureCoordinates = new PointCollection(new[] { new Point(0, 1), new Point(1, 1), new Point(1, 0), new Point(0, 0) }),
                TriangleIndices    = new Int32Collection(new[] { 0, 1, 2, 0, 2, 3 })
            };

            this.geometry.Freeze();

            this.material = new DiffuseMaterial();
            Viewport2DVisual3D.SetIsVisualHostMaterial(this.material, true);
            this.material.Freeze();

            this.viewport3D        = new Viewport3D();
            this.viewport3D.Camera = this.Camera;
            this.viewport3D.Children.Add(new ModelVisual3D()
            {
                Content = this.Light
            });

            //base.AddVisualChild(this.viewport3D);

            EllipseSizeChanged(this, new DependencyPropertyChangedEventArgs());
        }
예제 #8
0
        protected override void OnVisualAdded(UIElement elt)
        {
            if (elt is Viewport3D)
            {
                return;
            }

            int index = Children.IndexOf(elt);

            Viewport2DVisual3D model = CreateApplicationViewPort(elt);
            //set binding
            ApplicationGrid visual = (ApplicationGrid)model.Visual;

            visual.AllowDrop          = true;
            visual.DataContext        = elt;
            visual.DragEnter         += TabsElementFlow_DragEnter;
            visual.MouseEnter        += TabsElementFlow_MouseEnter;
            visual.MouseDown         += TabsElementFlow_MouseDown;
            visual.CloseButton.Click += CloseButtonClicked;
            _modelContainer.Children.Insert(index, model);
            model.SetValue(LinkedElementProperty, elt);
            elt.SetValue(LinkedModelProperty, model);
            if (IsLoaded)
            {
                ReflowItems();
            }
            SelectedIndex = Children.Count - 1;
        }
        protected Viewport2DBillboardBase()
        {
            Material material = new DiffuseMaterial(Brushes.White);

            Viewport2DVisual3D.SetIsVisualHostMaterial(material, true);
            material.Freeze();

            viewport2DVisual.Material = material;

            Children.Add(viewport2DVisual);

            meshGeometry.TextureCoordinates.Add(new Point(0, 1));
            meshGeometry.TextureCoordinates.Add(new Point(1, 1));
            meshGeometry.TextureCoordinates.Add(new Point(0, 0));
            meshGeometry.TextureCoordinates.Add(new Point(1, 0));

            meshGeometry.TriangleIndices.Add(0);
            meshGeometry.TriangleIndices.Add(1);
            meshGeometry.TriangleIndices.Add(3);
            meshGeometry.TriangleIndices.Add(0);
            meshGeometry.TriangleIndices.Add(3);
            meshGeometry.TriangleIndices.Add(2);

            viewport2DVisual.Geometry = meshGeometry;
        }
예제 #10
0
        protected void initializeVisualChildren()
        {
            if (visualList == null || visualList.Count == 0)
            {
                throw new Exception("Visual list must has visual for rendering");
            }

            camera             = new PerspectiveCamera();
            camera.FieldOfView = 120;

            modelVisual3D         = new ModelVisual3D();
            modelVisual3D.Content = new DirectionalLight(System.Windows.Media.Colors.White, new Vector3D(0, 0, -1));

            viewportList = new List <Viewport2DVisual3D>();
            meshList     = new List <MeshGeometry3D>();

            foreach (var visual in visualList)
            {
                var viewport = new Viewport2DVisual3D();
                viewport.Material = new DiffuseMaterial();
                viewport.Material.SetValue(Viewport2DVisual3D.IsVisualHostMaterialProperty, true);
                var meshGeometry = new MeshGeometry3D();
                viewport.Geometry = meshGeometry;
                viewport.Visual   = visual;
                viewportList.Add(viewport);
                meshList.Add(meshGeometry);
            }

            this.Camera = camera;
            this.Children.Add(modelVisual3D);
            foreach (var viewport in viewportList)
            {
                this.Children.Add(viewport);
            }
        }
예제 #11
0
        /// <summary>
        /// Returns an interactive 3D model that hosts
        /// the specified UIElement.
        /// </summary>
        Viewport2DVisual3D BuildModel(UIElement element)
        {
            var model = new Viewport2DVisual3D
            {
                Geometry = new MeshGeometry3D
                {
                    TriangleIndices = new Int32Collection(
                        new int[] { 0, 1, 2, 2, 3, 0 }),
                    TextureCoordinates = new PointCollection(
                        new Point[]
                    {
                        new Point(0, 1),
                        new Point(1, 1),
                        new Point(1, 0),
                        new Point(0, 0)
                    }),
                    Positions = new Point3DCollection(
                        new Point3D[]
                    {
                        new Point3D(-1, -1, 0),
                        new Point3D(+1, -1, 0),
                        new Point3D(+1, +1, 0),
                        new Point3D(-1, +1, 0)
                    })
                },
                Material  = new DiffuseMaterial(),
                Transform = new TranslateTransform3D(),
                // Host the 2D element in the 3D model.
                Visual = element
            };

            Viewport2DVisual3D.SetIsVisualHostMaterial(model.Material, true);

            return(model);
        }
예제 #12
0
파일: VForm.cs 프로젝트: yellowarmy/roduino
        protected override Motion GetSelectionMotion(int index)
        {
            Motion m = new Motion();

            m.Axis = new Vector3D(0, 1, 0);
            m.Z    = Owner.PopoutDistance + Owner.ZOffset;
            m.Y    = Owner.YOffset;
            m.X    = Owner.XOffset;
            ChangeStateForElement(index, Visibility.Visible);

            Viewport2DVisual3D model     = (Viewport2DVisual3D)Owner._modelContainer.Children[index];
            LoginGrid          loginGrid = (LoginGrid)model.Visual;

            if (Owner._modelContainer.Children.Count <= 1)
            {
                loginGrid.imgMoveToRight.Visibility = Visibility.Collapsed;
                loginGrid.imgMoveToLeft.Visibility  = Visibility.Collapsed;
            }
            else
            {
                loginGrid.imgMoveToLeft.Visibility = Owner.SelectedIndex < Owner._modelContainer.Children.Count - 1
                                                         ? Visibility.Visible
                                                         : Visibility.Collapsed;
                loginGrid.imgMoveToRight.Visibility = Owner.SelectedIndex > 0
                                                          ? Visibility.Visible
                                                          : Visibility.Collapsed;
            }

            return(m);
        }
        AxisAngleRotation3D FindAxisAngleRotation3D(int index)
        {
            Viewport2DVisual3D contentSurface = _viewport.Children[index] as Viewport2DVisual3D;
            RotateTransform3D  transform      = contentSurface.Transform as RotateTransform3D;

            return(transform.Rotation as AxisAngleRotation3D);
        }
예제 #14
0
        protected override void OnContainerLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Viewport2DVisual3D model = e.Source as Viewport2DVisual3D;

            if (model != null)
            {
                SelectedIndex = _modelContainer.Children.IndexOf(model);
            }
        }
예제 #15
0
        Viewport2DVisual3D BuildVisualHost()
        {
            Viewport2DVisual3D vis = new Viewport2DVisual3D();

            vis.Material = GetMaterial();
            vis.Geometry = GetGeomatryMesh();

            return(vis);
        }
        public static Material CreateMaterial()
        {
            DiffuseMaterial material = new DiffuseMaterial {
                Brush = Brushes.White
            };

            Viewport2DVisual3D.SetIsVisualHostMaterial(material, true);
            return(material);
        }
예제 #17
0
        private FrameworkElement CreateVisualChild()
        {
            var simpleQuad = new MeshGeometry3D
            {
                Positions          = new Point3DCollection(Mesh),
                TextureCoordinates = new PointCollection(TexCoords),
                TriangleIndices    = new Int32Collection(Indices)
            };

            // Front material is interactive, back material is not.
            Material frontMaterial = new DiffuseMaterial(Brushes.White);

            frontMaterial.SetValue(Viewport2DVisual3D.IsVisualHostMaterialProperty, true);

            var vb = new VisualBrush(_logicalChild);

            SetCachingForObject(vb);  // big perf wins by caching!!
            Material backMaterial = new DiffuseMaterial(vb);

            _rotationTransform.Rotation = _quaternionRotation;
            var xfGroup = new Transform3DGroup {
                Children = { _scaleTransform, _rotationTransform }
            };

            var backModel = new GeometryModel3D {
                Geometry = simpleQuad, Transform = xfGroup, BackMaterial = backMaterial
            };
            var m3DGroup = new Model3DGroup
            {
                Children = { new DirectionalLight(Colors.White, new Vector3D(0,      0, -1)),
                             new DirectionalLight(Colors.White, new Vector3D(0.1, -0.1,  1)),
                             backModel }
            };

            // Non-interactive Visual3D consisting of the backside, and two lights.
            var mv3D = new ModelVisual3D {
                Content = m3DGroup
            };

            // Interactive frontside Visual3D
            var frontModel = new Viewport2DVisual3D {
                Geometry = simpleQuad, Visual = _logicalChild, Material = frontMaterial, Transform = xfGroup
            };

            // Cache the brush in the VP2V3 by setting caching on it.  Big perf wins.
            SetCachingForObject(frontModel);

            // Scene consists of both the above Visual3D's.
            _viewport3D = new Viewport3D {
                ClipToBounds = false, Children = { mv3D, frontModel }
            };

            UpdateRotation();

            return(_viewport3D);
        }
예제 #18
0
        /// <summary>
        /// Small helper method to wrap a Visual in a Viewport2DVisual3D.
        /// </summary>
        /// <param name="wrapMe"></param>
        /// <returns></returns>
        private Viewport2DVisual3D WrapUIElement(Visual wrapMe)
        {
            Viewport2DVisual3D result = new Viewport2DVisual3D();

            result.Geometry = this.geometry;
            result.Material = this.material;
            result.Visual   = wrapMe;

            return(result);
        }
예제 #19
0
 /// <summary>
 /// Adds the specified model to the front of the 3D scene.
 /// </summary>
 /// <param name="model">The front item in the scene.</param>
 internal void AddToFront(Viewport2DVisual3D model)
 {
     if (this.AllowTransparency)
     {
         base.Children.Add(model);
     }
     else
     {
         base.Children.Insert(1, model);
     }
 }
예제 #20
0
        protected virtual void OnContainerLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //should be implemented in inherited object
            Focus();
            Viewport2DVisual3D model = e.Source as Viewport2DVisual3D;

            if (model != null)
            {
                SelectedIndex = _modelContainer.Children.IndexOf(model);
            }
        }
예제 #21
0
 /// <summary>
 ///     Adds the specified model to the rear of the 3D scene.
 /// </summary>
 /// <param name="model">The rear item in the scene.</param>
 internal void AddToBack(Viewport2DVisual3D model)
 {
     if (AllowTransparency)
     {
         Children.Insert(1, model);
     }
     else
     {
         Children.Add(model);
     }
 }
예제 #22
0
        /// <summary>
        ///     Removes and returns the front model in the scene.
        /// </summary>
        internal Viewport2DVisual3D RemoveFrontModel()
        {
            Viewport2DVisual3D frontModel = FrontModel;

            if (frontModel == null)
            {
                return(null);
            }

            Children.Remove(frontModel);
            return(frontModel);
        }
예제 #23
0
        /// <summary>
        ///     Removes and returns the back model in the scene.
        /// </summary>
        internal Viewport2DVisual3D RemoveBackModel()
        {
            Viewport2DVisual3D backModel = BackModel;

            if (backModel == null)
            {
                return(null);
            }

            Children.Remove(backModel);
            return(backModel);
        }
예제 #24
0
 /// <summary>
 /// Get a display by looking up it's visual 3d model.  This is useful for handling hit test results.
 /// </summary>
 /// <param name="pVisual3D">The 3D model.</param>
 /// <returns>Null if not found or the display reference if found.</returns>
 public Display GetDisplayByViewport(Viewport2DVisual3D pVisual3D)
 {
     // For each display, find a matching visual.
     foreach (var d in dDisplays.Values)
     {
         if (d.Viewport2DVisual3D == pVisual3D)
         {
             return(d);
         }
     }
     return(null);
 }
예제 #25
0
            /// <summary>
            /// Construct a new display object.
            /// </summary>
            /// <param name="Key">The key it is stored at.</param>
            /// <param name="pRenderer">The renderer which created it.</param>
            internal Display(object Key, Renderer pRenderer)
            {
                // Store the renderer.
                this.Renderer = pRenderer;
                this.Key      = Key;

                // Identities.
                HomographyTransform = new MatrixTransform3D();

                // Create the model visual.
                Viewport2DVisual3D = new Viewport2DVisual3D();

                // Geom (create a texturemapped rectangle).
                var pMeshGeometry3D = new MeshGeometry3D();

                pMeshGeometry3D.Positions.Add(new Point3D(0, 0, 0));
                pMeshGeometry3D.Positions.Add(new Point3D(0, 1, 0));
                pMeshGeometry3D.Positions.Add(new Point3D(1, 0, 0));
                pMeshGeometry3D.Positions.Add(new Point3D(1, 1, 0));

                pMeshGeometry3D.TextureCoordinates.Add(new Point(0, 0));
                pMeshGeometry3D.TextureCoordinates.Add(new Point(1, 0));
                pMeshGeometry3D.TextureCoordinates.Add(new Point(0, 1));
                pMeshGeometry3D.TextureCoordinates.Add(new Point(1, 1));
                //pMeshGeometry3D.TextureCoordinates.Add(new Point(0, 1));
                //pMeshGeometry3D.TextureCoordinates.Add(new Point(0, 0));
                //pMeshGeometry3D.TextureCoordinates.Add(new Point(1, 1));
                //pMeshGeometry3D.TextureCoordinates.Add(new Point(1, 0));

                pMeshGeometry3D.TriangleIndices.Add(0);
                pMeshGeometry3D.TriangleIndices.Add(2);
                pMeshGeometry3D.TriangleIndices.Add(1);
                pMeshGeometry3D.TriangleIndices.Add(2);
                pMeshGeometry3D.TriangleIndices.Add(3);
                pMeshGeometry3D.TriangleIndices.Add(1);
                Viewport2DVisual3D.Geometry = pMeshGeometry3D;

                // Create a visual brush which we apply to our material.
                VisualBrush        = new VisualBrush();
                VisualBrush.Visual = Content;

                // Create a material which wraps this brush.
                var pDiffuse = new DiffuseMaterial();

                pDiffuse.Brush = Brushes.White;
                Viewport2DVisual3D.SetIsVisualHostMaterial(pDiffuse, true);
                Viewport2DVisual3D.Material = new DiffuseMaterial(VisualBrush);
                Viewport2DVisual3D.Visual   = Content;

                // Transform.
                Viewport2DVisual3D.Transform = HomographyTransform;
            }
예제 #26
0
        protected override void OnContainerLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Viewport2DVisual3D model = e.Source as Viewport2DVisual3D;

            if (model != null)
            {
                SelectedIndex = _modelContainer.Children.IndexOf(model);

                //raise event to load
                ListBoxItem item = (ListBoxItem)model.GetValue(LinkedElementProperty);
                RaiseTabLoadedEvent((Tab)item.Content);
            }
        }
예제 #27
0
 /// <summary>
 /// select UIElement by current tab
 /// </summary>
 /// <param name="current"></param>
 public void SelectIndexByTab(Tab current)
 {
     for (int i = 0; i < _modelContainer.Children.Count; i++)
     {
         Viewport2DVisual3D newSelectedModel = (Viewport2DVisual3D)_modelContainer.Children[i];
         ListBoxItem        item             = (ListBoxItem)newSelectedModel.GetValue(LinkedElementProperty);
         if (current.Id == ((Tab)item.Content).Id)
         {
             SelectedIndex = i;
             return;
         }
     }
 }
예제 #28
0
        /// <summary>
        /// create login element
        /// </summary>
        /// <param name="visualBrush"></param>
        /// <returns></returns>
        protected Viewport2DVisual3D CreateLoginViewPort(UIElement visualBrush)
        {
            VisualBrush        brush = new VisualBrush(visualBrush);
            Viewport2DVisual3D view  =
                Application.LoadComponent(
                    new Uri("/RoDuino.SMS;component/Components/RoApplicationMenu/Viewport2DVisual3D.xaml",
                            UriKind.Relative)) as
                Viewport2DVisual3D;

            view.Visual = new LoginGrid();

            ((MeshGeometry3D)view.Geometry).Positions = CreateMeshPositionsForLogin();
            return(view);
        }
예제 #29
0
        public static Viewport2DVisual3D CreateVisual3D(MeshGeometry3D geometry3D, Material material)
        {
            Viewport2DVisual3D visual3DModel = new Viewport2DVisual3D();

            visual3DModel.Geometry = geometry3D;

            if (material != null)
            {
                visual3DModel.Material = material;
            }

            visual3DModel.Transform = CreateTransform3DGroup();

            return(visual3DModel);
        }
예제 #30
0
        public void Rotate()
        {
            if (_isRotating)
            {
                ++_rotationRequests;
                return;
            }
            else
            {
                _isRotating = true;
            }

            if (_viewport != null)
            {
                // Find front rotation
                Viewport2DVisual3D  backContentSurface = _viewport.Children[1] as Viewport2DVisual3D;
                RotateTransform3D   backTransform      = backContentSurface.Transform as RotateTransform3D;
                AxisAngleRotation3D backRotation       = backTransform.Rotation as AxisAngleRotation3D;

                // Find back rotation
                Viewport2DVisual3D  frontContentSurface = _viewport.Children[2] as Viewport2DVisual3D;
                RotateTransform3D   frontTransform      = frontContentSurface.Transform as RotateTransform3D;
                AxisAngleRotation3D frontRotation       = frontTransform.Rotation as AxisAngleRotation3D;

                // Create a new camera each time, to avoid trying to animate a frozen instance.
                PerspectiveCamera camera = this.CreateCamera();
                _viewport.Camera = camera;

                // Create animations.
                DoubleAnimation rotationAnim = new DoubleAnimation
                {
                    Duration = new Duration(TimeSpan.FromMilliseconds(this.AnimationLength)),
                    By       = 180
                };
                Point3DAnimation cameraZoomAnim = new Point3DAnimation
                {
                    To          = new Point3D(0, 0, 2.5),
                    Duration    = new Duration(TimeSpan.FromMilliseconds(this.AnimationLength / 2)),
                    AutoReverse = true
                };
                cameraZoomAnim.Completed += this.OnRotationCompleted;

                // Start the animations.
                frontRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, rotationAnim);
                backRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, rotationAnim);
                camera.BeginAnimation(PerspectiveCamera.PositionProperty, cameraZoomAnim);
            }
        }