public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var scale = (float)values[0]; var transform = (Numerics.Matrix4x4)values[1]; var tGroup = new Media3D.Transform3DGroup(); if (scale != 1) { var tform = new Media3D.ScaleTransform3D(scale, scale, scale); tform.Freeze(); tGroup.Children.Add(tform); } if (!transform.IsIdentity) { var tform = new Media3D.MatrixTransform3D(transform.ToMatrix3D()); tform.Freeze(); tGroup.Children.Add(tform); } tGroup.Freeze(); return(tGroup); }
private Tuple <Material, Media3D.Transform3D> LoadSkull() { var m = new VolumeTextureDiffuseMaterial(); var data = VolumeTextureRawDataMaterialCore.LoadRAWFile("male128x256x256.raw", 128, 256, 256); m.Texture = ProcessData(data.VolumeTextures, data.Width, data.Height, data.Depth, out var transferMap); m.Color = new Color4(0.6f, 0.6f, 0.6f, 1f); m.TransferMap = transferMap; m.Freeze(); var rotate = Matrix.RotationAxis(new Vector3(1, 0, 0), (float)Math.PI); var transform = new Media3D.MatrixTransform3D(rotate.ToMatrix3D()); transform.Freeze(); return(new Tuple <Material, Media3D.Transform3D>(m, transform)); }
private Tuple <Material, Media3D.Transform3D> LoadTeapot() { //var m = new VolumeTextureRawDataMaterial(); //m.Texture = VolumeTextureRawDataMaterialCore.LoadRAWFile("teapot256x256x178.raw", 256, 256, 178); var m = new VolumeTextureDiffuseMaterial(); var data = VolumeTextureRawDataMaterialCore.LoadRAWFile("teapot256x256x178.raw", 256, 256, 178); m.Texture = ProcessData(data.VolumeTextures, data.Width, data.Height, data.Depth, out var transferMap); m.Color = new Color4(1, 1, 1, 0.4f); m.TransferMap = transferMap; m.Freeze(); var scale = Matrix.Scaling(2, 2, 178 / 256f * 2); var rotate = Matrix.RotationAxis(new Vector3(1, 0, 0), (float)Math.PI); var t = new Media3D.MatrixTransform3D((scale * rotate).ToMatrix3D()); t.Freeze(); return(new Tuple <Material, Media3D.Transform3D>(m, t)); }
private Media3D.Transform3D GetTransform(float scale, Matrix4x4 transform) { var tGroup = new Media3D.Transform3DGroup(); if (scale != 1) { var tform = new Media3D.ScaleTransform3D(scale, scale, scale); tform.Freeze(); tGroup.Children.Add(tform); } if (!transform.IsIdentity) { var tform = new Media3D.MatrixTransform3D(transform.ToMatrix3D()); tform.Freeze(); tGroup.Children.Add(tform); } tGroup.Freeze(); return(tGroup); }
private Model3D ConvertVisualToModel3D(Visual visual, ref double z) { Model3D model = null; Rect bounds = VisualTreeHelper.GetContentBounds(visual); Viewport3D viewport = visual as Viewport3D; if (viewport != null) { bounds = new Rect(viewport.RenderSize); } if (this.includeEmptyVisuals) { bounds.Union(VisualTreeHelper.GetDescendantBounds(visual)); } if (!bounds.IsEmpty && bounds.Width > 0 && bounds.Height > 0) { MeshGeometry3D mesh = new MeshGeometry3D(); mesh.Positions.Add(new Point3D(bounds.Left, bounds.Top, z)); mesh.Positions.Add(new Point3D(bounds.Right, bounds.Top, z)); mesh.Positions.Add(new Point3D(bounds.Right, bounds.Bottom, z)); mesh.Positions.Add(new Point3D(bounds.Left, bounds.Bottom, z)); mesh.TextureCoordinates.Add(new Point(0, 0)); mesh.TextureCoordinates.Add(new Point(1, 0)); mesh.TextureCoordinates.Add(new Point(1, 1)); mesh.TextureCoordinates.Add(new Point(0, 1)); mesh.Normals.Add(new Vector3D(0, 0, 1)); mesh.Normals.Add(new Vector3D(0, 0, 1)); mesh.Normals.Add(new Vector3D(0, 0, 1)); mesh.Normals.Add(new Vector3D(0, 0, 1)); mesh.TriangleIndices = new Int32Collection(new int[] { 0, 1, 2, 2, 3, 0 }); mesh.Freeze(); Brush brush = this.MakeBrushFromVisual(visual, bounds); DiffuseMaterial material = new DiffuseMaterial(brush); material.Freeze(); model = new GeometryModel3D(mesh, material); ((GeometryModel3D)model).BackMaterial = material; z -= 1; } int childrenCount = VisualTreeHelper.GetChildrenCount(visual); if (childrenCount > 0) { Model3DGroup group = new Model3DGroup(); if (model != null) { group.Children.Add(model); } for (int i = 0; i < childrenCount; i++) { Visual childVisual = VisualTreeHelper.GetChild(visual, i) as Visual; if (childVisual != null) { Model3D childModel = this.ConvertVisualToModel3D(childVisual, ref z); if (childModel != null) { group.Children.Add(childModel); } } } model = group; } if (model != null) { Transform transform = VisualTreeHelper.GetTransform(visual); Matrix matrix = (transform == null ? Matrix.Identity : transform.Value); Vector offset = VisualTreeHelper.GetOffset(visual); matrix.Translate(offset.X, offset.Y); if (!matrix.IsIdentity) { Matrix3D matrix3D = new Matrix3D(matrix.M11, matrix.M12, 0, 0, matrix.M21, matrix.M22, 0, 0, 0, 0, 1, 0, matrix.OffsetX, matrix.OffsetY, 0, 1); Transform3D transform3D = new MatrixTransform3D(matrix3D); transform3D.Freeze(); model.Transform = transform3D; } model.Freeze(); } return model; }