public void LocateObject(Model3DGroup m) { var bounds = new RealBounds3D { XBounds = new RealBounds { Min = (float)m.Bounds.X, Max = (float)(m.Bounds.X + m.Bounds.SizeX) }, YBounds = new RealBounds { Min = (float)(m.Bounds.Y), Max = (float)(m.Bounds.Y + m.Bounds.SizeY) }, ZBounds = new RealBounds { Min = (float)(m.Bounds.Z), Max = (float)(m.Bounds.Z + m.Bounds.SizeZ) } }; ZoomToBounds(bounds); }
public void ScaleToContent(IEnumerable <Model3DGroup> content) { var bounds = new RealBounds3D { XBounds = new RealBounds { Min = (float)content.Min(m => m?.Bounds.X), Max = (float)content.Max(m => m?.Bounds.X + m?.Bounds.SizeX) }, YBounds = new RealBounds { Min = (float)content.Min(m => m?.Bounds.Y), Max = (float)content.Max(m => m?.Bounds.Y + m?.Bounds.SizeY) }, ZBounds = new RealBounds { Min = (float)content.Min(m => m?.Bounds.Z), Max = (float)content.Max(m => m?.Bounds.Z + m?.Bounds.SizeZ) } }; ZoomToBounds(bounds); var len = bounds.Length; CameraSpeed = Math.Ceiling(len); MaxCameraSpeed = Math.Ceiling(len * 6); MaxPosition = new Point3D( bounds.XBounds.Max + len * 3, bounds.YBounds.Max + len * 3, bounds.ZBounds.Max + len * 3); MinPosition = new Point3D( bounds.XBounds.Min - len * 3, bounds.YBounds.Min - len * 3, bounds.ZBounds.Min - len * 3); MinFarPlaneDistance = 100; FarPlaneDistance = Math.Max(MinFarPlaneDistance, Math.Ceiling(len)); MaxFarPlaneDistance = Math.Max(MinFarPlaneDistance, Math.Ceiling(len * 3)); }
private void ZoomToBounds(RealBounds3D bounds) { var len = bounds.Length; if (bounds.XBounds.Length / 2 > bounds.YBounds.Length) //side view for long models like weapons { var p = new Point3D( bounds.XBounds.Midpoint, bounds.YBounds.Max + len * 0.5, bounds.ZBounds.Midpoint); MoveCamera(p, new Vector3D(0, 0, -2)); } else //normal camera position { var p = new Point3D( bounds.XBounds.Max + len * 0.5, bounds.YBounds.Midpoint, bounds.ZBounds.Midpoint); MoveCamera(p, new Vector3D(-1, 0, 0)); } }