public VisualTree3DView(Visual visual, int dpi) { var directionalLight1 = new DirectionalLight(Colors.White, new Vector3D(0, 0, 1)); var directionalLight2 = new DirectionalLight(Colors.White, new Vector3D(0, 0, -1)); double z = 0; var model = this.ConvertVisualToModel3D(visual, dpi, ref z); var group = new Model3DGroup(); group.Children.Add(directionalLight1); group.Children.Add(directionalLight2); group.Children.Add(model); this.zScaleTransform = new ScaleTransform3D(); group.Transform = this.zScaleTransform; var modelVisual = new ModelVisual3D { Content = @group }; var bounds = model.Bounds; const double fieldOfView = 45; var lookAtPoint = new Point3D(bounds.X + (bounds.SizeX / 2), bounds.Y + (bounds.SizeY / 2), bounds.Z + (bounds.SizeZ / 2)); var cameraDistance = 0.5 * bounds.SizeX / Math.Tan(0.5 * fieldOfView * Math.PI / 180); var position = lookAtPoint - new Vector3D(0, 0, cameraDistance); Camera camera = new PerspectiveCamera(position, new Vector3D(0, 0, 1), new Vector3D(0, -1, 0), fieldOfView); this.zScaleTransform.CenterZ = lookAtPoint.Z; this.Children.Add(modelVisual); this.Camera = camera; this.ClipToBounds = false; this.Width = 500; this.Height = 500; this.trackballBehavior = new TrackballBehavior(this, lookAtPoint); }
public VisualTree3DView(Visual visual) { DirectionalLight directionalLight1 = new DirectionalLight(Colors.White, new Vector3D(0, 0, 1)); DirectionalLight directionalLight2 = new DirectionalLight(Colors.White, new Vector3D(0, 0, -1)); double z = 0; Model3D model = ConvertVisualToModel3D(visual, ref z); Model3DGroup group = new Model3DGroup(); group.Children.Add(directionalLight1); group.Children.Add(directionalLight2); group.Children.Add(model); _zScaleTransform = new ScaleTransform3D(); group.Transform = _zScaleTransform; ModelVisual3D modelVisual = new ModelVisual3D { Content = group }; Rect3D bounds = model.Bounds; const double fieldOfView = 45; Point3D lookAtPoint = new Point3D(bounds.X + bounds.SizeX / 2, bounds.Y + bounds.SizeY / 2, bounds.Z + bounds.SizeZ / 2); double cameraDistance = 0.5 * bounds.SizeX / Math.Tan(0.5 * fieldOfView * Math.PI / 180); Point3D position = lookAtPoint - new Vector3D(0, 0, cameraDistance); Camera camera = new PerspectiveCamera(position, new Vector3D(0, 0, 1), new Vector3D(0, -1, 0), fieldOfView); _zScaleTransform.CenterZ = lookAtPoint.Z; Children.Add(modelVisual); Camera = camera; ClipToBounds = false; Width = 500; Height = 500; _trackballBehavior = new TrackballBehavior(this, lookAtPoint); }