C# VTK 画刷勾画模型提取表面

技术概要:

1.通过小球画刷改变模型cell 标量。

2.利用非结构化网格的标量裁剪 vtkTableBasedClipDataSet 裁剪 结构化三角网格模型。

3.提取裁剪边缘实现轮廓光滑

1.在交互时绘制画刷小球。

小球的作用:获取在小球内部的模型点,以此改变该点周围Cell 的标量值

同事标量值通过 vtkLookupTable 改变了拾取的颜色

2.vtkTableBasedClipDataSet 裁剪

注意:clipper.SetValue(1.5); 这里的值必须在 选中 和 非选中的标量值之间。最好是中值

现在得到的是 非结构化的网格 vtkUnstructuredGrid 需要转换为 三角结构化网格

先进行非结构的三角化做准备,对应了结构化的拓扑结构。

非结构转换为结构化网格

我这里不知道为什么有点问题,没有 continue,但是模型没有完全结构化,存在少部分为未转化的点,线结构 

得到polyData后 直接四件套安排:

vtkPolyDataNormals,vtkTriangleFilter,vtkCleanPolyData,vtkSmoothPolyDataFilter

3.边缘光滑(我这里讲大概)

算法原理:
改变模型边缘角度小于120度(视情况而定)

①可能绘制的区域不是是多个区域 用 vtkConnectivityFilter等等,提取每一个连通域。

②对每一个连通域提取边缘 vtkFeatureEdges

注意:这里提取的边缘的 vtkPoints 的点是乱序的,用vtkStripper 去转换为线模型,点就排好。

然后 对vtkStripper  做一次 vtkCleanPolyData避免重复点影响后面操作,得到了 linePolyData 。

③迭代以下操作(迭代操作,一般10次差不多,看情况)

用键值对的键存 linePolyData 的原始点,值存linePolyData 小于120度去调整的点。

开始循环linePolyData的每个点,判断三个点构成的角度是否是小于120度。然后移动这个中间点,改变后点的坐标 到键值对。(这个调整点的方法按照 和向量 移动就可以了)

等所有迭代结束后,然后改变模型坐标:

利用存起来的键点,找到对应的 点Id。

  int pid = (int)surfaceData.FindPoint(a, b, c);

  polyData.GetPoints().SetPoint(pid ,x,y,z);

到此边缘光滑结束。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C#使用 VTK 5.8 版本来实现模型绕 Z 轴旋转,可以按照以下步骤进行: 1. 首先,确保您已经安装了 VTK 5.8 版本,并将相关的 VTK 库添加到您的项目引用中。 2. 创建一个 Windows 窗体应用程序,并在窗体上添加一个 `vtkWin32OpenGLRenderWindow` 控件。 3. 在窗体的代码文件中,添加以下引用: ```csharp using System; using System.Windows.Forms; using Kitware.VTK; ``` 4. 在窗体的构造函数中,初始化 VTK 相关对象,并设置模型文件路径: ```csharp public partial class MainForm : Form { private vtkRenderWindow renderWindow; private vtkRenderer renderer; private vtkRenderWindowInteractor renderWindowInteractor; private vtkActor actor; public MainForm() { InitializeComponent(); // 初始化 VTK 相关对象 renderWindow = new vtkRenderWindow(); renderer = new vtkRenderer(); renderWindowInteractor = new vtkRenderWindowInteractor(); // 设置渲染器和渲染窗口交互器 renderWindow.AddRenderer(renderer); renderWindowInteractor.SetRenderWindow(renderWindow); // 加载模型文件 string modelFilePath = "path/to/your/model.obj"; vtkOBJReader reader = new vtkOBJReader(); reader.SetFileName(modelFilePath); // 创建模型的 mapper 和 actor vtkPolyDataMapper mapper = new vtkPolyDataMapper(); mapper.SetInputConnection(reader.GetOutputPort()); actor = new vtkActor(); actor.SetMapper(mapper); // 将 actor 添加到渲染器中 renderer.AddActor(actor); } } ``` 5. 在窗体的 `Load` 事件中,初始化渲染窗口并启动交互操作: ```csharp private void MainForm_Load(object sender, EventArgs e) { // 设置渲染窗口控件的句柄 renderWindow.SetRenderWindowHandle(vtkWin32OpenGLRenderWindow1.Handle); // 启动交互操作 renderWindow.Render(); renderWindowInteractor.Start(); } ``` 6. 在窗体的 `Timer` 事件中实现模型绕 Z 轴旋转: ```csharp private void timer1_Tick(object sender, EventArgs e) { // 设置旋转的角度(弧度) double angle = 0.01; // 获取模型的当前变换矩阵 vtkTransform transform = actor.GetMatrixTransform(); // 绕 Z 轴旋转 transform.RotateWXYZ(angle, 0, 0, 1); // 应用变换矩阵到模型 actor.SetUserMatrix(transform.GetMatrix()); // 更新渲染窗口 renderWindow.Render(); } ``` 7. 在窗体的 `FormClosing` 事件中释放 VTK 相关对象: ```csharp private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 清理资源 actor.Dispose(); renderer.Dispose(); renderWindowInteractor.Dispose(); renderWindow.Dispose(); } ``` 以上代码示例假设您已经在窗体上添加了一个 `Timer` 控件,并将其命名为 `timer1`。您可以根据需要调整旋转角度、定时器的间隔以及模型文件的路径。 希望这能帮助到您!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值