C# VTK

WPF+VTK加载图像点云

下载NuGet程序包
在这里插入图片描述
引入控件

xmlns:vtk="clr-namespace:Kitware.VTK;assembly=Kitware.VTK"
<WindowsFormsHost Margin="1" Background="Black">
	<vtk:RenderWindowControl x:Name="Window3DShow"/>
</WindowsFormsHost>

实例化

vtkRenderWindow renderWindow = Window3DShow.RenderWindow;;
vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer(); //获取渲染器

点云显示

private void ReadPlainText()
        {
            string filePath = @"C:\Users\Administrator\Desktop\1234.txt";
            FileStream fs = null;
            StreamReader sr = null;
            String sLineBuffer;
            String[] sXYZ;
            char[] chDelimiter = new char[] { ' ', '\t', ';' };
            double[] xyz = new double[3];
            vtkPoints points = vtkPoints.New();
            vtkMergePoints mergePoints = vtkMergePoints.New();
            int cnt = 0;

            // z value
            double minValue = 0.0, maxValue = 0.0;
            vtkAxesActor axesActor = vtkAxesActor.New();    //三维轴表示法
            //vtkCubeAxesActor2D
            vtkOrientationMarkerWidget widgetAxes = vtkOrientationMarkerWidget.New(); //用于操作标记属性的2D小部件
            vtkElevationFilter elevationFilter = vtkElevationFilter.New();  //沿指定方向生成标量

            try
            {
                fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                sr = new StreamReader(fs);
                while (!sr.EndOfStream)
                {
                    sLineBuffer = sr.ReadLine();
                    cnt++;
                    sXYZ = sLineBuffer.Split(chDelimiter, StringSplitOptions.RemoveEmptyEntries);
                    if (sXYZ == null || sXYZ.Length != 3)
                    {
                        Console.WriteLine("data seems to be in wrong format at line " + cnt, "Format Exception");
                        return;
                    }
                    xyz[0] = double.Parse(sXYZ[0], CultureInfo.InvariantCulture);
                    xyz[1] = double.Parse(sXYZ[1], CultureInfo.InvariantCulture);
                    xyz[2] = double.Parse(sXYZ[2], CultureInfo.InvariantCulture);

                    if (xyz[2] < minValue)
                    {
                        minValue = xyz[2];
                    }

                    if (xyz[2] > maxValue)
                    {
                        maxValue = xyz[2];
                    }
                    points.InsertNextPoint(xyz[0], xyz[1], xyz[2]);
                }

                vtkPolyData polydata = vtkPolyData.New(); //(具体数据集表示顶点、直线、多边形和三角形
                polydata.SetPoints(points);
                vtkVertexGlyphFilter glyphFilter = vtkVertexGlyphFilter.New(); //(制作一个vtkPolyData,每个点上都有一个顶点
                glyphFilter.SetInputConnection(polydata.GetProducerPort());
                //
                elevationFilter.SetInputConnection(glyphFilter.GetOutputPort());
                elevationFilter.SetLowPoint(0, 0, minValue);
                elevationFilter.SetHighPoint(0, 0, maxValue);

                vtkPolyDataMapper mapper1 = vtkPolyDataMapper.New();
                mapper1.SetInputConnection(elevationFilter.GetOutputPort());

                //vtkActor actor1 = vtkActor.New(); //(表示渲染场景中的对象
                actor1.SetMapper(mapper1);
                actor1.GetProperty().SetPointSize(1);
                actor1.GetProperty().SetColor(1, 1, 1);
                //获取对RenderWindowControl 1的renderwindow的引用
                //vtkRenderWindow renderWindow = Window3DShow.RenderWindow;
                // renderer
                //vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer();

                // set background color
                renderer.SetBackground(0.0, 0.0, 0.0);
                // add our actor to the renderer(添加到渲染器
                renderer.AddActor(actor1);

                //文字显示
                // Source部分
                text3D = new vtkVectorText();
                text3D.SetText("VTK");
                // Mapper部分
                vtkPolyDataMapper text3DMapper = vtkPolyDataMapper.New();
                text3DMapper.SetInputConnection(text3D.GetOutputPort());

                /*//  Actor部分 
                vtkActor text3DActor = new vtkActor();
                //  渲染部分
                renderer.AddActor(text3DActor);*/

                //  Actor部分 (vtkFollower类的应用)
                vtkFollower text3DActor = new vtkFollower();
                text3DActor.SetMapper(text3DMapper);
                text3DActor.SetScale(0.3, 0.3, 0.5);                      // 大小
                //text3DActor.AddPosition(WorldPointend[0], WorldPointend[1], WorldPointend[2]);// 位置(文字左下角坐标)
                text3DActor.GetProperty().SetColor(0.0, 1.0, 0.0);        // 颜色
                //  渲染部分(与普通Actor的渲染不一样)
                text3DActor.SetCamera(renderer.GetActiveCamera());
                renderer.AddViewProp(text3DActor);

                // Add axesWidget
                widgetAxes.SetOrientationMarker(axesActor);
                widgetAxes.SetInteractor(renderWindow.GetInteractor());
                widgetAxes.SetEnabled(1);
                //widgetAxes.SetInteractive(0);

                //在中心窗口小部件中显示参与者
                renderer.ResetCamera();

				renderWindow.Render();
            }
            catch (IOException ex)
            {
                Console.WriteLine("显示点云失败");
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                    sr.Dispose();
                    sr = null;
                }
            }
        }
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你可以使用C#VTK(Visualization Toolkit)来显示坐标轴。下面是一个简单的示例代码: ```csharp using Kitware.VTK; class Program { static void Main(string[] args) { // 创建一个vtkRenderer vtkRenderer renderer = vtkRenderer.New(); // 创建一个vtkRenderWindow vtkRenderWindow renderWindow = vtkRenderWindow.New(); renderWindow.AddRenderer(renderer); // 创建一个vtkRenderWindowInteractor vtkRenderWindowInteractor interactor = vtkRenderWindowInteractor.New(); interactor.SetRenderWindow(renderWindow); // 创建一个vtkAxesActor vtkAxesActor axesActor = vtkAxesActor.New(); // 设置坐标轴的长度和标签的可见性 axesActor.SetTotalLength(1, 1, 1); axesActor.SetXAxisLabelText("X"); axesActor.SetYAxisLabelText("Y"); axesActor.SetZAxisLabelText("Z"); axesActor.GetXAxisCaptionActor2D().SetVisibility(1); axesActor.GetYAxisCaptionActor2D().SetVisibility(1); axesActor.GetZAxisCaptionActor2D().SetVisibility(1); // 将坐标轴添加到渲染器中 renderer.AddActor(axesActor); // 渲染并启动交互器 renderWindow.Render(); interactor.Start(); } } ``` 这段代码创建了一个vtkRenderWindow和一个vtkRenderer,并将vtkAxesActor添加到渲染器中。然后通过设置坐标轴的长度和标签可见性来自定义坐标轴。最后,渲染并启动交互器以显示窗口和坐标轴。 确保你已经将VTK库添加到你的项目中,并将其引用添加到代码文件中。此外,你可能还需要通过NuGet包管理器安装VTK库。 希望这个示例能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值