/// <summary> /// Renders the viewport to a bitmap. /// </summary> /// <param name="view">The viewport.</param> /// <param name="background">The background.</param> /// <param name="m">The oversampling multiplier.</param> /// <returns>A bitmap.</returns> public static BitmapSource RenderBitmap(this Viewport3DX view, Brush background, int m = 1) { var target = new WriteableBitmap( (int)view.ActualWidth * m, (int)view.ActualHeight * m, 96, 96, PixelFormats.Pbgra32, null); var originalCamera = view.Camera; var vm = originalCamera.GetViewMatrix3D(); double ar = view.ActualWidth / view.ActualHeight; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { // change the camera viewport and scaling var pm = originalCamera.GetProjectionMatrix3D(ar); if (originalCamera is OrthographicCamera) { pm.OffsetX = m - 1 - (i * 2); pm.OffsetY = -(m - 1 - (j * 2)); } if (originalCamera is PerspectiveCamera) { pm.M31 = -(m - 1 - (i * 2)); pm.M32 = m - 1 - (j * 2); } pm.M11 *= m; pm.M22 *= m; var mc = new MatrixCamera(vm, pm); view.Camera = mc; var partialBitmap = new RenderTargetBitmap( (int)view.ActualWidth, (int)view.ActualHeight, 96, 96, PixelFormats.Pbgra32); // render background var backgroundRectangle = new Rectangle { Width = partialBitmap.Width, Height = partialBitmap.Height, Fill = background }; backgroundRectangle.Arrange(new Rect(0, 0, backgroundRectangle.Width, backgroundRectangle.Height)); partialBitmap.Render(backgroundRectangle); // render 3d partialBitmap.Render(view); // copy to the target bitmap CopyBitmap(partialBitmap, target, (int)(i * view.ActualWidth), (int)(j * view.ActualHeight)); } } // restore the camera view.Camera = originalCamera; return(target); }
/// <summary> /// Renders the viewport to a bitmap. /// </summary> /// <param name="view">The viewport.</param> /// <param name="background">The background.</param> /// <param name="m">The oversampling multiplier.</param> /// <returns>A bitmap.</returns> public static BitmapSource RenderBitmap(this Viewport3DX view, Brush background, int m = 1) { var target = new WriteableBitmap( (int)view.ActualWidth * m, (int)view.ActualHeight * m, 96, 96, PixelFormats.Pbgra32, null); var originalCamera = view.Camera; var vm = originalCamera.GetViewMatrix3D(); double ar = view.ActualWidth / view.ActualHeight; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { // change the camera viewport and scaling var pm = originalCamera.GetProjectionMatrix3D(ar); if (originalCamera is OrthographicCamera) { pm.OffsetX = m - 1 - (i * 2); pm.OffsetY = -(m - 1 - (j * 2)); } if (originalCamera is PerspectiveCamera) { pm.M31 = -(m - 1 - (i * 2)); pm.M32 = m - 1 - (j * 2); } pm.M11 *= m; pm.M22 *= m; var mc = new MatrixCamera(vm, pm); view.Camera = mc; var partialBitmap = new RenderTargetBitmap( (int)view.ActualWidth, (int)view.ActualHeight, 96, 96, PixelFormats.Pbgra32); // render background var backgroundRectangle = new Rectangle { Width = partialBitmap.Width, Height = partialBitmap.Height, Fill = background }; backgroundRectangle.Arrange(new Rect(0, 0, backgroundRectangle.Width, backgroundRectangle.Height)); partialBitmap.Render(backgroundRectangle); // render 3d partialBitmap.Render(view); // copy to the target bitmap CopyBitmap(partialBitmap, target, (int)(i * view.ActualWidth), (int)(j * view.ActualHeight)); } } // restore the camera view.Camera = originalCamera; return target; }