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;
}
}
}