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); } }
/// <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); //} } }
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()); }
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), }); }
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());