public void ZoomToBounds(SharpDX.BoundingBox bounds, double animationTime = 0)
        {
            if (bounds.Size.IsZero)
            {
                return;
            }

            var pcam   = Viewport.Camera as Helix.PerspectiveCamera;
            var center = bounds.Center.ToPoint3D();
            var radius = bounds.Size.Length() / 2;

            double disth = radius / Math.Tan(0.5 * pcam.FieldOfView * Math.PI / 180);
            double vfov  = pcam.FieldOfView / Viewport.ActualWidth * Viewport.ActualHeight;
            double distv = radius / Math.Tan(0.5 * vfov * Math.PI / 180);

            double adjust = distv > disth ? 0.75 : 1;
            double dist   = Math.Max(disth, distv) * adjust;

            var dir = (bounds.Size.X > bounds.Size.Y * 1.5)
                ? new Media3D.Vector3D(0, -Math.Sign(center.Y), 0)
                : new Media3D.Vector3D(-Math.Sign(center.X), 0, 0);

            if (dir.Length == 0)
            {
                dir = new Media3D.Vector3D(-1, 0, 0);
            }

            pcam.LookAt(center, dir * dist, Viewport.ModelUpDirection, animationTime);
        }
        public void HighlightBounds(SharpDX.BoundingBox bounds)
        {
            var r3d = new Media3D.Rect3D(bounds.Minimum.ToPoint3D(), bounds.Size.ToSize3D());
            var b   = new Helix.MeshBuilder();

            b.AddBoundingBox(r3d, 0.1);
            b.AddSphere(bounds.Center, 0.1);
            var geom = b.ToMeshGeometry3D();

            box.Geometry = geom;
            if (!Viewport.Items.Contains(box))
            {
                Viewport.Items.Add(box);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Computes an approximate bounding sphere and axis-aligned bounding box.
 /// </summary>
 public void ComputeBoundingSphereAndBox()
 {
     if (Vertices.Count == 0)
     {
         // Traits.BoundingSphere.Center = Vector3D.Zero;
         //Traits.BoundingSphere.Radius = 0.0f;
     }
     else
     {
         Traits.BoundingBox = Box3D.FromPoints(Vertices.Select(x => x.Traits.Position).ToArray());
         //foreach (var v in Vertices)
         //{
         //    Traits.BoundingBox.ExtendBy((Vector3D)v.Traits.Position);
         //}
     }
 }
Esempio n. 4
0
        private SWMM.Point3D GetRotationCenter(IMachineElement element)
        {
            Machine.ViewModels.Ioc.SimpleIoc <MVMIPR.IElementBoundingBoxProvider>
            .GetInstance()
            .GetBoundingBox(element,
                            out double minX,
                            out double minY,
                            out double minZ,
                            out double maxX,
                            out double maxY,
                            out double maxZ);

            var bb = new SharpDX.BoundingBox(new SharpDX.Vector3((float)minX, (float)minY, (float)minZ), new SharpDX.Vector3((float)maxX, (float)maxY, (float)maxZ));

            return(bb.Center.ToPoint3D());
        }
Esempio n. 5
0
        public static SharpDX.RectangleF Project(this SharpDX.BoundingBox bounds, Helix.RenderContext context)
        {
            var corners = bounds.GetCorners();

            for (int i = 0; i < corners.Length; i++)
            {
                corners[i] = SharpDX.Vector3.Project(corners[i], 0, 0, context.ActualWidth, context.ActualHeight, 0, 1, context.GlobalTransform.ViewProjection);
            }

            return(new SharpDX.RectangleF
            {
                Left = corners.Min(v => v.X),
                Top = corners.Min(v => v.Y),
                Right = corners.Max(v => v.X),
                Bottom = corners.Max(v => v.Y),
            });
        }
Esempio n. 6
0
        public static GTABoundingBox2 ComputeBoundingBox(Entity entity)
        {
            var m = entity.Model;

            (Vector3 gmin, Vector3 gmax) = m.Dimensions;

            var bbox = new SharpDX.BoundingBox(new SharpDX.Vector3(gmin.X, gmin.Y, gmin.Z), new SharpDX.Vector3(gmax.X, gmax.Y, gmax.Z));

            var res = new GTABoundingBox2
            {
                Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity),
                Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity)
            };

            foreach (var corner in bbox.GetCorners())
            {
                var cornerVector = new Vector3(corner.X, corner.Y, corner.Z);

                cornerVector = entity.GetOffsetPosition(cornerVector);
                Vector2 position = HashFunctions.Convert3dTo2d(cornerVector);

                if (position.X == .1f || position.Y == .1f || position.X == .9f || position.Y == .9f)
                {
                    return(new GTABoundingBox2
                    {
                        Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity),
                        Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity),
                        Quality = DataQuality.Low
                    });
                }

                res = new GTABoundingBox2
                {
                    Min     = new Vector2(Math.Min(res.Min.X, position.X), Math.Min(res.Min.Y, position.Y)),
                    Max     = new Vector2(Math.Max(res.Max.X, position.X), Math.Max(res.Max.Y, position.Y)),
                    Quality = DataQuality.High
                };
            }

            if (res.Max.X == res.Min.X || res.Max.Y == res.Min.Y)
            {
                res.Quality = DataQuality.Low;
            }

            return(res);
        }
 public static Rect3D ToRect3D(this SharpDX.BoundingBox box) => new Rect3D(box.Minimum.ToPoint3D(), box.Size.ToSize3D());