一.使用VTK创建可视化界面
1.创建C#可视化界面
- 使用Visual Studio 2022用.net 8.0创建窗体应用
- 放入两个水平分割的Panel左侧演示VTK 右侧放按钮
- 按照第一章节环境搭建的步骤,加入对应Kitware的dll并导入依赖
2.初始化Vtk窗口
- 引用Kitware.VTK,Form1_Load中,创建渲染窗口控件renderWindowControl并加入窗口Panel的Controls中。 获取窗口的第一个渲染器到render,设置好背景颜色SetBackground。启动窗体,就显示Vtk窗口了。
这里背景色可以SetBackground和SetBackground2组合设置一个渐变色。
using Kitware.VTK;
namespace VtkPlatform
{
public partial class Form1 : Form
{
//初始化并创建静态变量控件renderWindowControl避免被系统进程kill
public static Kitware.VTK.RenderWindowControl xRenderWindowControl=new RenderWindowControl() ;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.splitContainer1.Panel1.Controls.Add(xRenderWindowControl);
vtkRenderer xRenderer = xRenderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
xRenderer.SetBackground(0, 0.5, 0);
}
public vtkRenderer GetVtkRenderer()
{
vtkRenderer Renderer = xRenderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
return Renderer;
}
private void button1_退出_Click(object sender, EventArgs e)
{
this.Dispose();
}
}
}
显示窗口:
- 设置坐标系和操作类
通过vtkAxesActor 创建坐标轴的Actor,并设置长度,形状,位置后加入Renderer,坐标轴就显示了。
//创建坐标轴
vtkAxesActor axes = vtkAxesActor.New();
axes.SetXAxisLabelText("X");
axes.SetYAxisLabelText("Y");
axes.SetZAxisLabelText("Z");
axes.SetTotalLength(10, 10, 10); //设置箭头长度
axes.SetShaftTypeToCylinder();// 设置箭头形状
//在3维坐标系中设置各轴的长度。
axes.SetOrigin(0, 0, 0);
//axes.AxisLabelsOff();
//禁用绘制轴标签。
xRenderer.AddActor(axes);
vtkCamera camera = xRenderer.GetActiveCamera();
//camera.Zoom(1.5);
xRenderer.ResetCamera();
并且这个轴系自带了交互功能,生成以后,就可以进行平移,旋转,缩放了。
二.使用VTK创建简单点线面体模型
2.1 创建一个点
这里需要注意的是,点实际是由一个vtkPoints创建的,然后需要进一步实例化为Polydata也就是VTK的基本对象之一,由点Point,顶点Vert,直线Line,多折线Polyline,面plane,三角带(triangle strip),多边形等显示组成,具体规范的分类可以查看手册及OpenGL定义。
创建一个点,就需要vtkPoints对象增加一个点,同时新建一个vtkCellArray队列,每增加一个点,vtkCellArray要步进1格,并将PointId放进去。
创建PolyData后,设置点集合SetPoints,设置顶点集合SetVerts。这里只有一个点就比较简单了。
vMapper.SetInputData(polyData); Mapper这里输入的是PolyData,是因为我们构建了PolyData类型的数据进行输入,下面可以看到还可以用其它形式。
创建PolyData流程:
private void btn_创建一个点_Click(object sender, EventArgs e)
{
vtkRenderer xRenderer = GetVtkRenderer();
vtkPoints vPoints = new vtkPoints();
vtkCellArray vCellArray = new vtkCellArray();
//插入点,1是序号,后面是xyz
//vtkPoints可以放很多点,不管是一个还是多个,都要转换为PolyData的Vert顶点才能显示
long PointId1 = vPoints.InsertNextPoint(0, 0, 20);
//顶点序列以1步进
vCellArray.InsertNextCell(1);
vCellArray.InsertCellPoint(PointId1);
vtkPolyData polyData = new vtkPolyData();
polyData.SetPoints(vPoints);
polyData.SetVerts(vCellArray);
vtkPolyDataMapper vMapper = new vtkPolyDataMapper();
vMapper.SetInputData(polyData);
vtkActor vptActor = new vtkActor();
vptActor.GetProperty().SetColor((float)255 / 255, (float)255 / 255, (float)0 / 255);
vptActor.GetProperty().SetPointSize(10);
vptActor.SetMapper(vMapper);
xRenderer.AddActor(vptActor);
xRenderer.ResetCamera();
xRenderer.GetRenderWindow().Render();
MessageBox.Show("创建完成!");
}
创建完成后,显示效果如下:
2.2 创建多个点
了解了怎么创建一个点,就很容易创建多个点,也就是多增加几个点就行了。
这里为提现多个点的可扩充性,使用坐标数列为输入,这样一次性输入n个点也是一样显示的。
private void btn_创建多个点_Click(object sender, EventArgs e)
{
vtkRenderer xRenderer = GetVtkRenderer();
vtkPoints vPoints = new vtkPoints();
vtkCel