public override void Do(IDemoChartControl chartControl)
        {
            // Demo volumetric binary data from resources.
            byte[] data = Properties.Resources.skull;

            // Size of data is the same in all 3 dimensions.
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Create default transfer function and customize it.
            var transferFunction = new DefaultTransferFunction1D(
                new []
            {
                new Vector2DRef(0.2, 0.0),
                new Vector2DRef(0.2, 1.0),
            });

            // Initialization of rendering technique.
            var rayCasting = new VolumeRayCasting
            {
                // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
                // For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
                // Byte, Short, Float types are supported.
                Reader = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max())),
                // Geometry specify bounding box to that volume data will be fitted. Geometry can be more complex than just box.
                // Mostly it does nothave limits, you can specify even sphere.
                Geometry = new BoxVolumeGeometry
                {
                    Origin = Vector3F.Zero,
                    Size   = new Vector3F(1f),
                },
                // Interpolation type between voxels/
                InterpolationType = VolumeInterpolationType.Linear,
                // Parameter for ray casting technique that will specify how much steps will be on a each ray.
                // Directly effects performance and render quality. By default it is calculated automatically.
                SamplingStepCount = size,
                // Threshold for transparent areas that will no be visible for hit testing.
                // 0 will increase picking performance due to item will be picked by bounding box.
                HitTestThreshold = 0.25f,
                // The same as HitTestThreshold, but for highlighting. This parameter was set just for demo purposes.
                HighlightThreshold = 0.25f,
                // Global value transparency scale.
                ValueScale = 0.25f,
                // Setup custom transfer function.
                TransferFunction1D = transferFunction,
                // Set name.
                Name = "Volume"
            };

            // Setup highlight interactor.
            rayCasting.Interactor = new HighlightInteractor(rayCasting);

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling = Multisampling.Low2X;

            // Set chart data source.
            chartControl.DataSource = rayCasting;
        }
Beispiel #2
0
        public override void Do(IDemoChartControl chartControl)
        {
            // Demo volumetric binary data from resources.
            byte[] data = Properties.Resources.skull;
            // Size of data is the same in all 3 dimensions.
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Very simple sphere generation algorithm.
            const int   resolution = 50;
            const float r          = 0.5f;
            var         center     = new Vector3F(0.5f);
            var         vertex     = new Vector3F[resolution * resolution];
            int         index      = 0;

            for (var i = 0; i < resolution; i++)
            {
                // We use here inversed order due to triangle list indicies generation algorythm.
                // It is very important to use correct counterclockwise triangle indices generation for raycasting.
                for (int k = resolution - 1; k >= 0; k--)
                {
                    var t = Math.PI * i / (resolution - 1);
                    var f = Math.PI * 2 * k / (resolution - 1);
                    vertex[index++] = new Vector3F((float)(r * Math.Sin(t) * Math.Cos(f)), (float)(r * Math.Sin(t) * Math.Sin(f)), (float)(r * Math.Cos(t))) + center;
                }
            }

            // Section geometry.
            var complexGeometry = new CustomVolumeGeometry(new VolumeMesh(vertex, vertex, GridHelper.GetStructuredTriangleListIndices(0, resolution, resolution, 1)));

            // Initialization of rendering technique.
            var rayCasting = new VolumeRayCasting
            {
                //Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
                //For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
                //Byte, Short, Float types are supported.
                Reader   = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max())),
                Geometry = complexGeometry,
                //Interpolation type between voxels
                InterpolationType = VolumeInterpolationType.Linear,
                //Parameter for ray casting technique that will specify how much steps will be on a each ray. Directly effects performance and render quality. By default it is calculated automatically.
                SamplingStepCount = size,
                //Threshold for transparent areas that will no be visible for hit testing. 0 will increase picking performance due to item will be picked by bounding box.
                HitTestThreshold = 0.25f,
                //Global value transparency scale
                ValueScale = 0.5f
            };

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling = Multisampling.Low2X;

            // Setup chart options.
            chartControl.Axes.IsAxes3DVisible = true;

            // Setup chart data source.
            chartControl.DataSource = rayCasting;
        }
        public override void Do(IDemoChartControl chartControl)
        {
            // Demo volumetric binary data from resources.
            byte[] data = Properties.Resources.skull;

            // Size of data is the same in all 3 dimensions.
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
            // For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
            // Byte, Short, Float types are supported.
            var reader = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max()));

            // Geometry specify bounding box to that volume data will be fitted. Geometry can be more complex than just box.
            // Mostly it does nothave limits, you can specify even sphere.
            var geometry = new BoxVolumeGeometry
            {
                Origin = Vector3F.Zero,
                Size   = new Vector3F(1f),
            };

            // Initialize ray-casting.
            var rayCasting = new VolumeRayCasting
            {
                // Setup it's reader. We'll reuse it for section.
                Reader = reader,
                // Setup ray-casting geometry.
                Geometry = geometry,
                // Interpolation type between voxels/
                InterpolationType = VolumeInterpolationType.Linear,
                // Parameter for ray casting technique that will specify how much steps will be on a each ray.
                // Directly effects performance and render quality. By default it is calculated automatically.
                SamplingStepCount = size,
                // Threshold for transparent areas that will no be visible for hit testing.
                // 0 will increase picking performance due to item will be picked by bounding box.
                HitTestThreshold = 0.25f,
                // The same as HitTestThreshold, but for highlighting.
                HighlightThreshold = 0.25f,
                // Global value transparency scale.
                ValueScale = 0.3f,
                // Set name.
                Name = "Volume",
                // Don't forget to enable depth-test since we want to visualize section in the ray-casting.
                IsDepthTestEnabled = true
            };

            List <RenderData> renderDatas = new List <RenderData>();

            void SubmitSection(float relativeLocation, int id)
            {
                // Initialize volume visual section that takes control over section presentation.
                var visualSection = new VolumeVisualPlaneSection
                {
                    // Specify it's parent geometry as ray-casting geometry we want to cross.
                    ParentGeometry = geometry,
                    // Setup section plane origin.
                    Origin = new Vector3F(relativeLocation),
                    // Setup section plane normal.
                    Normal           = new Vector3F(1, 1, 1),
                    OutlineThickness = 2.0f,
                    OutlineColor     = Colors.Black,
                    IsOutlineVisible = true,
                    FillColor        = new Color4(Colors.Blue, 100),
                    IsFillVisible    = false,
                    Name             = $"Visual {id}"
                };

                renderDatas.Add(visualSection);

                // Initialize volume section render data.
                var section = new VolumeSection
                {
                    // Setup reader.
                    Reader = reader,
                    // Link the section geometry to it's visual section geometry.
                    Geometry = visualSection.SectionGeometry,
                    Name     = $"Section {id}"
                };

                renderDatas.Add(section);
            }

            // Bounding box.
            var boundingCube = new Cube
            {
                Size             = new Vector3F(1f),
                Position         = new Vector3F(0.5f),
                Color            = Colors.Black,
                PresentationType = PrimitivePresentationType.Wireframe,
                Name             = "Bounds"
            };

            renderDatas.Add(boundingCube);

            // Add sections.
            SubmitSection(0.25f, 0);
            SubmitSection(0.5f, 1);
            SubmitSection(0.75f, 2);

            // Place ray-casting as last item to enable depth-test.
            renderDatas.Add(rayCasting);

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling        = Multisampling.Low2X;
            chartControl.Axes.IsAxes3DVisible = true;

            // Set chart data source.
            chartControl.DataSource = renderDatas;
        }
Beispiel #4
0
        public override void Do(IDemoChartControl chartControl)
        {
            // Demo volumetric binary data from resources.
            byte[] data = Properties.Resources.skull;
            // Size of data is the same in all 3 dimensions.
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Initialization of rendering technique.
            var rayCasting = new VolumeRayCasting
            {
                // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
                // For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
                // Byte, Short, Float types are supported.
                Reader = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max())),
                // Geometry specify bounding box to that volume data will be fitted. Geometry can be more complex than just box.
                // Mostly it does nothave limits, you can specify even sphere.
                Geometry = new BoxVolumeGeometry
                {
                    Origin = Vector3F.Zero,
                    Size   = new Vector3F(1f),
                },
                // Interpolation type between voxels/
                InterpolationType = VolumeInterpolationType.Linear,
                // Parameter for ray casting technique that will specify how much steps will be on a each ray.
                // Directly effects performance and render quality. By default it is calculated automatically.
                SamplingStepCount = size,
                // Threshold for transparent areas that will no be visible for hit testing.
                // 0 will increase picking performance due to item will be picked by bounding box.
                HitTestThreshold = 0.25f,
                // Global value transparency scale.
                ValueScale = 0.5f,
                // Setup depth enabled flag.
                IsDepthTestEnabled = true,
                // Set name.
                Name = "Volume"
            };

            // Inscribed opaque objects.
            var cube1 = new Cube
            {
                Color    = Colors.DarkBlue,
                Size     = new Vector3F(0.4f),
                Position = new Vector3F(0.25f),
                Name     = "Cube 1"
            };
            var cube2 = new Cube
            {
                Color    = Colors.DarkGreen,
                Size     = new Vector3F(0.4f),
                Position = new Vector3F(0.75f),
                Name     = "Cube 2"
            };
            var sphere = new Sphere
            {
                Color    = Colors.DarkRed,
                Radius   = 0.2f,
                Position = new Vector3F(0.5f),
                Name     = "Sphere"
            };

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling = Multisampling.Low2X;

            // Set chart data source. Note: ray-casting with enabled depth-test must be last in the list.
            chartControl.DataSource = new RenderData[] { cube1, cube2, sphere, rayCasting };
        }