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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
            }
예제 #5
0
		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;
		}