Пример #1
0
        protected override void UpdateModelFromMouse(Base3DElement selected3DElement, Vector mousePositionDelta)
        {
            Vector3D normal = this.CalculateTransformationForSpotLightAdorner().Transform(new Vector3D(0.0, 0.0, 1.0));

            normal.Normalize();
            Plane3D          plane3D            = new Plane3D(normal, this.centerOfCone);
            Viewport3DVisual adorningViewport3D = this.ActiveView.AdornerLayer.GetAdornerSet3DContainer(this.ActiveAdorner.Element.Viewport).ShadowAdorningViewport3D;
            Ray3D            ray = CameraRayHelpers.RayFromViewportPoint(adorningViewport3D.Viewport.Size, adorningViewport3D.Camera, this.LastMousePosition + mousePositionDelta);
            double           t;

            if (!plane3D.IntersectWithRay(ray, out t))
            {
                return;
            }
            double    num1      = Math.Atan((ray.Evaluate(t) - this.centerOfCone).Length / 1.0) / Math.PI * 180.0;
            SpotLight spotLight = (SpotLight)this.Selected3DElement.ViewObject.PlatformSpecificObject;

            if (this.ActiveAdorner.TypeOfConeAngle == SpotLightAdornerBehavior3D.TypeOfConeAngle.InnerConeAngle)
            {
                double num2 = spotLight.OuterConeAngle - spotLight.InnerConeAngle;
                this.Selected3DElement.SetValue(SpotLightElement.InnerConeAngleProperty, (object)num1);
                this.Selected3DElement.SetValue(SpotLightElement.OuterConeAngleProperty, (object)(num1 + num2));
            }
            else
            {
                this.Selected3DElement.SetValue(SpotLightElement.OuterConeAngleProperty, (object)num1);
            }
            this.ActiveAdorner.PositionAndOrientGeometry();
        }
Пример #2
0
        public static Matrix3D GetTotalTransform(Viewport3DVisual vis)
        {
            Matrix3D matx = GetCameraTransform(vis);

            matx.Append(GetViewportTransform(vis));
            return(matx);
        }
Пример #3
0
        private void AutoZoom()
        {
            bool             success;
            Viewport3DVisual vp3dv = MeshDiagram3DMath.GetViewport3DVisual(mainViewport, out success);

            if (TooBig(vp3dv, out success) && success)
            {
                while (TooBig(vp3dv, out success) && success)
                {
                    Scale += 0.1;
                }
                while (!TooBig(vp3dv, out success) && Scale > 0 && success)
                {
                    Scale -= 0.01;
                }
                Scale += 0.01;
            }
            else
            {
                while (!TooBig(vp3dv, out success) && success)
                {
                    Scale -= 0.1;
                    if (Scale <= 0)
                    {
                        Scale = 0.01;
                        break;
                    }
                }
                while (TooBig(vp3dv, out success) && success)
                {
                    Scale += 0.01;
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Gets the total transform (camera and viewport).
        /// </summary>
        /// <param name="viewport3DVisual">The viewport visual.</param>
        /// <returns>The total transform.</returns>
        public static Matrix3D GetTotalTransform(this Viewport3DVisual viewport3DVisual)
        {
            var m = GetCameraTransform(viewport3DVisual);

            m.Append(GetViewportTransform(viewport3DVisual));
            return(m);
        }
Пример #5
0
        /// <summary>
        /// Viewport3D Constructor
        /// </summary>
        public Viewport3D()
        {
            _viewport3DVisual = new Viewport3DVisual();

            // The value for the Camera property and the Children property on Viewport3D
            // will also be the value for these properties on the Viewport3DVisual we
            // create as an internal Visual child.  This then will cause these values to
            // be shared, which will break property inheritance, dynamic resource references
            // and databinding.  To prevent this, we mark the internal
            // Viewport3DVisual.CanBeInheritanceContext to be false, allowing Camera and
            // Children to only pick up value context from the Viewport3D (this).
            _viewport3DVisual.CanBeInheritanceContext = false;

            this.AddVisualChild(_viewport3DVisual);

            // NTRAID#Longhorn-1219113-7/11/2005-Microsoft XamlSerializer does not support RO DPs
            //
            //  The XamlSerializer currently only serializes locally set properties.  To
            //  work around this we intentionally promote our ReadOnly Children
            //  property to locally set.
            //
            SetValue(ChildrenPropertyKey, _viewport3DVisual.Children);

            _viewport3DVisual.SetInheritanceContextForChildren(this);
        }
Пример #6
0
 public static Matrix3D GetViewportTransform(Viewport3DVisual vis)
 {
     return(new Matrix3D(vis.Viewport.Width / 2, 0, 0, 0,
                         0, -vis.Viewport.Height / 2, 0, 0,
                         0, 0, 1, 0,
                         vis.Viewport.X + vis.Viewport.Width / 2,
                         vis.Viewport.Y + vis.Viewport.Height / 2, 0, 1));
 }
Пример #7
0
        /// <summary/>
        protected override Viewport3DVisual CreateVisual()
        {
            Viewport3DVisual visual = new Viewport3DVisual();

            visual.Camera = camera;
            visual.Children.Add(modelVisual);
            return(visual);
        }
Пример #8
0
        /// <summary>
        /// Gets the object space to world space transformation for the given DependencyObject
        /// </summary>
        /// <param name="visual">The visual whose world space transform should be found</param>
        /// <param name="viewport">The Viewport3DVisual the Visual is contained within</param>
        /// <returns>The world space transformation</returns>
        public static Matrix3D GetTransformToWorld(DependencyObject visual, out Viewport3DVisual viewport)
        {
            Matrix3D worldTransform = Matrix3D.Identity;

            viewport = null;

            if (visual == null)
            {
                return(worldTransform);
            }

            if (visual is Viewport3DVisual)
            {
                return(worldTransform);
            }

            if (!(visual is Visual3D))
            {
                throw new ArgumentException("Must be of type Visual3D or Viewport3DVisual.", "visual");
            }

            while (visual != null)
            {
                if (!(visual is ModelVisual3D))
                {
                    break;
                }

                Transform3D transform = (Transform3D)visual.GetValue(ModelVisual3D.TransformProperty);

                if (transform != null)
                {
                    worldTransform.Append(transform.Value);
                }

                visual = VisualTreeHelper.GetParent(visual);
            }

            viewport = visual as Viewport3DVisual;

            if (viewport == null)
            {
                if (visual != null)
                {
                    // In WPF 3D v1 the only possible configuration is a chain of
                    // ModelVisual3Ds leading up to a Viewport3DVisual.

                    throw new ApplicationException(
                              String.Format("Unsupported type: '{0}'.  Expected tree of ModelVisual3Ds leading up to a Viewport3DVisual.",
                                            visual.GetType().FullName));
                }

                return(ZeroMatrix);
            }

            return(worldTransform);
        }
Пример #9
0
        /// <summary>
        ///     Converts the given point or ray hit test result into a PointHitTestResult.
        ///     In the case of a RayHitTestResult this is done by walking up the
        ///     transforming the 3D intersection into the coordinate space of the
        ///     Viewport3DVisual which contains the Visual3D subtree.
        /// </summary>
        internal static PointHitTestResult AsNearestPointHitTestResult(HitTestResult result)
        {
            if (result == null)
            {
                return(null);
            }

            PointHitTestResult resultAsPointHitTestResult = result as PointHitTestResult;

            if (resultAsPointHitTestResult != null)
            {
                return(resultAsPointHitTestResult);
            }

            RayHitTestResult resultAsRayHitTestResult = result as RayHitTestResult;

            if (resultAsRayHitTestResult != null)
            {
                Visual3D current        = (Visual3D)resultAsRayHitTestResult.VisualHit;
                Matrix3D worldTransform = Matrix3D.Identity;

                while (true)
                {
                    if (current.Transform != null)
                    {
                        worldTransform.Append(current.Transform.Value);
                    }

                    Visual3D parent3D = current.InternalVisualParent as Visual3D;

                    if (parent3D == null)
                    {
                        break;
                    }

                    current = parent3D;
                }

                Viewport3DVisual viewport = current.InternalVisualParent as Viewport3DVisual;

                if (viewport != null)
                {
                    Point4D worldPoint    = ((Point4D)resultAsRayHitTestResult.PointHit) * worldTransform;
                    Point   viewportPoint = viewport.WorldToViewport(worldPoint);

                    return(new PointHitTestResult(viewport, viewportPoint));
                }

                Debug.Fail("How did a ray hit a Visual3D not parented to a Viewport3DVisual?");

                return(null);
            }

            Debug.Fail(String.Format("Unhandled HitTestResult type '{0}'", result.GetType().Name));

            return(null);
        }
 public static Matrix3D GetViewportTransform(this Viewport3DVisual viewport3DVisual)
 {
     return(new Matrix3D(
                viewport3DVisual.Viewport.Width / 2, 0, 0, 0,
                0, -viewport3DVisual.Viewport.Height / 2, 0, 0,
                0, 0, 1, 0,
                viewport3DVisual.Viewport.X + (viewport3DVisual.Viewport.Width / 2), viewport3DVisual.Viewport.Y + (viewport3DVisual.Viewport.Height / 2), 0, 1
                ));
 }
Пример #11
0
        public static Point Point3DToScreen2D(Point3D point3D, Viewport3D viewPort)
        {
            Viewport3DVisual vpv      = VisualTreeHelper.GetParent(viewPort.Children[0]) as Viewport3DVisual;
            Matrix3D         matrix3D = TryWorldToViewportTransform(vpv, out bool isOk);

            Point3D pb = matrix3D.Transform(point3D);

            return(new Point(pb.X, pb.Y));
        }
Пример #12
0
        /// <summary>
        ///     Computes the transform from the inner space of the given
        ///     Visual3D to the 2D space of the Viewport3DVisual which
        ///     contains it.
        ///
        ///     The result will contain the transform of the given visual.
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        /// <param name="visual"></param>
        /// <param name="success"></param>
        /// <returns></returns>
        public static Matrix3D TryTransformTo2DAncestor(DependencyObject visual, out Viewport3DVisual viewport, out bool success)
        {
            success = false;
            Matrix3D to2D = Matrix3D.Identity;

            viewport = null;

            if (!(visual is Visual3D))
            {
                throw new ArgumentException("Must be of type Visual3D.", "visual");
            }

            while (visual != null)
            {
                if (!(visual is ModelVisual3D))
                {
                    break;
                }

                Transform3D transform = (Transform3D)visual.GetValue(ModelVisual3D.TransformProperty);

                if (transform != null)
                {
                    to2D.Append(transform.Value);
                }

                visual = VisualTreeHelper.GetParent(visual);
            }

            viewport = visual as Viewport3DVisual;

            if (viewport == null)
            {
                if (visual != null)
                {
                    // In WPF 3D v1 the only possible configuration is a chain of
                    // ModelVisual3Ds leading up to a Viewport3DVisual.

                    throw new ApplicationException(
                              String.Format("Unsupported type: '{0}'.  Expected tree of ModelVisual3Ds leading up to a Viewport3DVisual.",
                                            visual.GetType().FullName));
                }

                return(ZeroMatrix);
            }

            success = true;
            to2D.Append(MathUtils.TryWorldToViewportTransform(viewport, out success));

            if (!success)
            {
                return(ZeroMatrix);
            }

            return(to2D);
        }
Пример #13
0
        // Convert a single point from 3D to 2D.
        public static Point Convert3DPoint(Point3D point3d, Viewport3D vp)
        {
            // Get the combined transformation matrix.
            Viewport3DVisual visual = VisualTreeHelper.GetParent(vp.Children[0]) as Viewport3DVisual;
            Matrix3D         matrix = GetWorldToViewportMatrix(visual);

            // Transform the point.
            point3d = matrix.Transform(point3d);
            return(new Point(point3d.X, point3d.Y));
        }
Пример #14
0
        /// <summary/>
        public SceneRenderer(Size windowSize, Viewport3DVisual visual, Color background, DepthTestFunction depthTest)
        {
            bool clipToBounds = visual.Clip != null && MathEx.ContainsCloseEnough(visual.Viewport, visual.Clip.Bounds);

            InitializeThis(
                visual.Camera,
                ExtractModels(visual.Children),
                new Bounds(windowSize, visual.Viewport, clipToBounds),
                background,
                depthTest);
        }
Пример #15
0
        /// <summary/>
        protected override Viewport3DVisual CreateVisual()
        {
            Viewport3DVisual visual = new Viewport3DVisual();

            visual.Camera = camera;

            foreach (Visual3D visual3D in visual3Ds)
            {
                visual.Children.Add(visual3D);
            }
            return(visual);
        }
Пример #16
0
        public static IList <FindResult <T> > FindAll <T>(Viewport3DVisual viewport)
            where T : DependencyObject
        {
            List <FindResult <T> > result = new List <FindResult <T> >();

            foreach (Visual3D item in viewport.Children)
            {
                Find <T>(item, result);
            }

            return(result);
        }
Пример #17
0
 /// <summary>
 /// Gets the 2D bounding box.
 /// </summary>
 /// <param name="modelVisual3D">The model visual 3D.</param>
 /// <param name="success">if set to <c>true</c> [success].</param>
 /// <returns></returns>
 public static Rect Get2DBoundingBox(ModelVisual3D modelVisual3D, out bool success)
 {
     if (modelVisual3D != null)
     {
         Viewport3DVisual vp3dv = GetViewport3DVisual(modelVisual3D, out success);
         if (success)
         {
             return(Get2DBoundingBox(modelVisual3D, vp3dv, out success));
         }
     }
     success = false;
     return(new Rect());
 }
Пример #18
0
        /// <summary>
        ///     Computes the transform from the inner space of the given
        ///     Visual3D to the 2D space of the Viewport3DVisual which
        ///     contains it.
        ///
        ///     The result will contain the transform of the given visual.
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        /// <param name="visual"></param>
        /// <param name="success"></param>
        /// <returns></returns>
        public static Matrix3D TryTransformTo2DAncestor(DependencyObject visual, out Viewport3DVisual viewport, out bool success)
        {
            Matrix3D to2D = GetWorldTransformationMatrix(visual, out viewport);

            to2D.Append(MUtils.TryWorldToViewportTransform(viewport, out success));

            if (!success)
            {
                return(ZeroMatrix);
            }

            return(to2D);
        }
Пример #19
0
        /// <summary>
        ///     Computes the transform from world space to the Viewport3DVisual's
        ///     inner 2D space.
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        public static Matrix3D TryWorldToViewportTransform(Viewport3DVisual visual, out bool success)
        {
            Matrix3D result = TryWorldToCameraTransform(visual, out success);

            if (success)
            {
                result.Append(GetProjectionMatrix(visual.Camera, Math2D.GetAspectRatio(visual.Viewport.Size)));
                result.Append(GetHomogeneousToViewportTransform(visual.Viewport));
                success = true;
            }

            return(result);
        }
Пример #20
0
        /// <summary>
        ///     Computes the transform from the inner space of the given
        ///     Visual3D to the camera coordinate space
        ///
        ///     The result will contain the transform of the given visual.
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        /// <param name="visual"></param>
        /// <param name="success"></param>
        /// <returns></returns>
        public static Matrix3D TryTransformToCameraSpace(DependencyObject visual, out Viewport3DVisual viewport, out bool success)
        {
            Matrix3D toViewSpace = GetWorldTransformationMatrix(visual, out viewport);

            toViewSpace.Append(MUtils.TryWorldToCameraTransform(viewport, out success));

            if (!success)
            {
                return(ZeroMatrix);
            }

            return(toViewSpace);
        }
Пример #21
0
        public static Rect Get2DBoundingBox(Viewport3D vp)
        {
            bool bOK;

            Viewport3DVisual vpv =
                VisualTreeHelper.GetParent(vp.Children[0]) as Viewport3DVisual;

            Matrix3D m =
                MathUtils.TryWorldToViewportTransform(vpv, out bOK);

            bool bFirst = true;
            Rect r      = new Rect();

            foreach (Visual3D v3d in vp.Children)
            {
                if (v3d is ModelVisual3D)
                {
                    ModelVisual3D mv3d = (ModelVisual3D)v3d;

                    if (mv3d.Content is GeometryModel3D)
                    {
                        GeometryModel3D gm3d =
                            (GeometryModel3D)mv3d.Content;

                        if (gm3d.Geometry is MeshGeometry3D)
                        {
                            MeshGeometry3D mg3d =
                                (MeshGeometry3D)gm3d.Geometry;

                            foreach (Point3D p3d in mg3d.Positions)
                            {
                                Point3D pb  = m.Transform(p3d);
                                Point   p2d = new Point(pb.X, pb.Y);
                                if (bFirst)
                                {
                                    r      = new Rect(p2d, new Size(1, 1));
                                    bFirst = false;
                                }
                                else
                                {
                                    r.Union(p2d);
                                }
                            }
                        }
                    }
                }
            }

            return(r);
        }
Пример #22
0
        /// <summary>
        /// Computes the transformation matrix to go from a 3D point in the given Visual3D's coordinate space out in to
        /// the Viewport3DVisual.
        /// </summary>
        internal static bool TryTransformToViewport3DVisual(Visual3D visual3D, out Viewport3DVisual viewport, out Matrix3D matrix)
        {
            matrix = GetWorldTransformationMatrix(visual3D, out viewport);

            if (viewport != null)
            {
                matrix *= GetWorldToViewportTransform3D(viewport.Camera, viewport.Viewport);
                return(true);
            }
            else
            {
                return(false);
            }
        }
Пример #23
0
        public static Matrix3D GetWorldToViewportTransform(Viewport3DVisual visual)
        {
            bool     success;
            Matrix3D result = TryWorldToViewportTransform(visual, out success);

            if (success)
            {
                return(result);
            }
            else
            {
                return(ZeroMatrix);
            }
        }
Пример #24
0
        public static Matrix3D GetViewportToWorldTransform(Viewport3DVisual viewport)
        {
            Matrix3D matrix = GetWorldToViewportTransform(viewport);

            if (matrix.HasInverse)
            {
                matrix.Invert();
                return(matrix);
            }
            else
            {
                return(ZeroMatrix);
            }
        }
Пример #25
0
        //private static Matrix3D GetTransformationMatrixFromViewPort2D( Viewport3DVisual viewPort3DVisual )
        //{
        //  bool transoformationMatrixCalculationFinishesOK;
        //  Matrix3D transoformationMatrix =
        //      MathUtils.TryWorldToViewportTransform(viewPort3DVisual,
        //      out transoformationMatrixCalculationFinishesOK);
        //  if (!transoformationMatrixCalculationFinishesOK)
        //    throw new Exception("Transormation matrix cannot be calculated");
        //  return transoformationMatrix;
        //}
        public static Point Get2DPoint(Point3D point3d, Viewport3DVisual viewport3Dvisual)
        {
            bool     TransformationResultOK;
            Matrix3D m = MathUtils.TryWorldToViewportTransform(viewport3Dvisual, out TransformationResultOK);

            if (!TransformationResultOK)
            {
                return(new Point(0, 0));
            }
            Point3D pb  = m.Transform(point3d);
            Point   p2d = new Point(pb.X, pb.Y);

            return(p2d);
        }
Пример #26
0
        public static FindResult <T> Find <T>(Viewport3DVisual viewport)
            where T : DependencyObject
        {
            foreach (Visual3D item in viewport.Children)
            {
                FindResult <T> result = Find <T>(item);
                if (result != null)
                {
                    return(result);
                }
            }

            return(null);
        }
Пример #27
0
        private bool TryUpadateTagLocations()
        {
            try
            {
                if (panorama.Viewport3D == null || panorama.Camera == null)
                {
                    return(false);
                }

                if (!_panoramaStatusChanged)
                {
                    return(false);
                }
                _panoramaStatusChanged = false;

                Vector3D cameraLookDirection;
                Matrix3D matrix3D;
                Dispatcher.Invoke(() =>
                {
                    cameraLookDirection  = panorama.Camera.LookDirection;
                    Viewport3DVisual vpv = VisualTreeHelper.GetParent(panorama.Viewport3D.Children[0]) as Viewport3DVisual;
                    matrix3D             = D3Helper.TryWorldToViewportTransform(vpv, out bool isOk);
                });

                Point3D point;
                Point3D point3D = new Point3D(1, 0, 0);
                if (Vector3D.DotProduct(cameraLookDirection, new Vector3D(point3D.X, point3D.Y, point3D.Z)) <= 0)
                {
                    point = new Point3D(-10000, -10000, -10000);
                }
                else
                {
                    //可能的耗时操作
                    point = matrix3D.Transform(new Point3D(1, 0, 0));
                }

                Dispatcher.Invoke(() =>
                {
                    Canvas.SetLeft(tag, point.X);
                    Canvas.SetTop(tag, point.Y);
                });

                return(true);
            }
            catch
            {
                return(false);
            }
        }
Пример #28
0
        /// <summary>
        ///     Computes the transform from world space to camera space
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        public static Matrix3D TryWorldToCameraTransform(Viewport3DVisual visual, out bool success)
        {
            success = false;

            if (visual == null)
            {
                return(ZeroMatrix);
            }


            Matrix3D result = Matrix3D.Identity;

            Camera camera = visual.Camera;

            if (camera == null)
            {
                return(ZeroMatrix);
            }

            Rect viewport = visual.Viewport;

            if (viewport == Rect.Empty)
            {
                return(ZeroMatrix);
            }

            Transform3D cameraTransform = camera.Transform;

            if (cameraTransform != null)
            {
                Matrix3D m = cameraTransform.Value;

                if (!m.HasInverse)
                {
                    return(ZeroMatrix);
                }

                m.Invert();
                result.Append(m);
            }

            result.Append(GetViewMatrix(camera));

            success = true;
            return(result);
        }
Пример #29
0
        private HitTestFilterBehavior FilterPotentialHit(DependencyObject testObject)
        {
            Viewport3DVisual viewportVisual = testObject as Viewport3DVisual;

            if (viewportVisual == null)
            {
                return(HitTestFilterBehavior.ContinueSkipSelf);
            }
            RectangleHitTestResult closestHitTestResult = new Viewport3DHitTestHelper(viewportVisual, (GeneralTransform)Transform.Identity).HitTest((HitTestParameters)this.hitTestParameters3D).ClosestHitTestResult;

            if (closestHitTestResult == null)
            {
                return(HitTestFilterBehavior.ContinueSkipSelfAndChildren);
            }
            this.hitObject = closestHitTestResult;
            return(HitTestFilterBehavior.Stop);
        }
Пример #30
0
        /// <summary>
        ///     Computes the transform from world space to the Viewport3DVisual's
        ///     inner 2D space.
        ///
        ///     This method can fail if Camera.Transform is non-invertable
        ///     in which case the camera clip planes will be coincident and
        ///     nothing will render.  In this case success will be false.
        /// </summary>
        public static Matrix3D TryWorldToViewportTransform(Viewport3DVisual visual, out bool success)
        {
            success = false;
            if (visual.Viewport.Width == 0 || visual.Viewport.Height == 0)
            {
                return(ZeroMatrix);
            }

            Matrix3D result = TryWorldToCameraTransform(visual, out success);

            if (success)
            {
                result.Append(GetProjectionMatrix(visual.Camera, GetAspectRatio(visual.Viewport.Size)));
                result.Append(GetHomogeneousToViewportTransform(visual.Viewport));
            }

            return(result);
        }