当前位置: 首页 > ai >正文

Learning vtkjs之TubeFilter

过滤器 沿着线生成管道

介绍

vtkTubeFilter - 一个在每条输入线周围生成管的过滤器

vtkTubeFilter是一个在每条输入线周围生成管的过滤器。管由三角形条带组成,并随着线法线的旋转而旋转。如果没有法线存在,它们会自动计算。管的半径可以根据标量或向量值进行调整。如果半径随标量值变化,则半径会线性调整。如果半径随向量值变化,则使用质量通量保持变化。还可以指定管的侧面数。您还可以指定哪些侧面是可见的。这对于生成有趣的条纹效果很有用。其他选项包括能够封闭管并生成纹理坐标。纹理坐标可以与相关纹理映射一起使用,以创建有趣的视觉效果,例如用与长度或时间相对应的条纹标记管。

这个过滤器通常用于创建粗或戏剧性的线条。另一个常见的用途是将其与vtkStreamTracer结合使用以生成流管。

!!! warning
管的侧面数必须大于3。

!!! warning
输入线不能有重复的点,或者点的法线与进出线段平行。如果一条线不符合这个标准,那么这条线就不会被管化。

效果

在这里插入图片描述

核心代码

线数据生成

function initializePolyData(dType) {let pointType = VtkDataTypes.FLOAT;if (dType === DesiredOutputPrecision.SINGLE) {pointType = VtkDataTypes.FLOAT;} else if (dType === DesiredOutputPrecision.DOUBLE) {pointType = VtkDataTypes.DOUBLE;}const polyData = vtkPolyData.newInstance();const points = vtkPoints.newInstance({ dataType: pointType });points.setNumberOfPoints(numSegments + 1);const pointData = new Float32Array(3 * (numSegments + 1));const verts = new Uint32Array(2 * (numSegments + 1));const lines = new Uint32Array(numSegments + 2);lines[0] = numSegments + 1;const scalarsData = new Float32Array(numSegments + 1);const scalars = vtkDataArray.newInstance({name: "Scalars",values: scalarsData,});for (let i = 0; i < numSegments + 1; ++i) {for (let j = 0; j < 3; ++j) {pointData[3 * i + j] = vtkMath.random();}scalarsData[i] = i * 0.1;verts[i] = 1;verts[i + 1] = i;lines[i + 1] = i;}points.setData(pointData);polyData.setPoints(points);polyData.getVerts().setData(verts);polyData.getLines().setData(lines);polyData.getPointData().setScalars(scalars);return polyData;}

主要流程

	const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerRef.current,});const renderer = fullScreenRenderer.getRenderer();const renderWindow = fullScreenRenderer.getRenderWindow();const polyData = initializePolyData(DesiredOutputPrecision.DOUBLE);const tubeFilter = vtkTubeFilter.newInstance();tubeFilter.setCapping(false);tubeFilter.setNumberOfSides(50);tubeFilter.setRadius(0.1);tubeFilter.setInputData(polyData);tubeFilter.setInputArrayToProcess(0, "Scalars", "PointData", "Scalars");context.current = {tubeFilter,renderer,renderWindow,};addRepresentation(polyData, {});const tubeFilterActor = addRepresentation(tubeFilter, {});context.current["tubeFilterActor"] = tubeFilterActor;renderer.resetCamera();renderWindow.render();

全部代码都放到github上了
新坑_Learning vtkjs_git地址
关注我,我持续更新vtkjs的example学习案例

也欢迎各位给我提意见,技术交流~

大鸿

WeChat : HugeYen
WeChat Public Account : BIM树洞

做一个静谧的树洞君

用建筑的语言描述IT事物;

用IT的思维解决建筑问题;

共建BIM桥梁,聚合团队。

本学习分享资料不得用于商业用途,仅做学习交流!!如有侵权立即删除!!

http://www.xdnf.cn/news/3519.html

相关文章:

  • TMI投稿指南(四):投稿相关网址
  • 【Linux】Linux基础命令
  • 27.电源和地的单点串并联接线隐患及对EMC的影响分析
  • 数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)
  • HDLBIT-程序(Procedures)
  • 【原创开发】无印去水印[特殊字符]短视频去水印工具[特殊字符]支持一键批量解析
  • CloudCompare 中的 KDTree详解
  • 设计模式简述(十六)门面模式
  • DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导
  • cPanel 的 Let’s Encrypt™ 插件
  • 平台介绍-开放API接口-鉴权
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变
  • MATLAB滤波工具箱演示——自定义维度、滤波方法的例程演示与绘图、数据输出
  • 详细说明StandardCopyOption.REPLACE_EXISTING参数的作用和使用方法
  • 虚幻引擎 IK Retargeter 编辑器界面解析
  • 上位机知识篇---PSRAM和RAM
  • 从零开始讲DDR(9)——AXI 接口MIG 使用(2)
  • n8n 键盘快捷键和控制键
  • 基于YOLOV5的目标检测识别
  • Expected SARSA算法详解:python 从零实现
  • 输入输出(python)
  • BBR 之 ProbeRTT 新改
  • DeepSeek-R1模型蒸馏
  • SALOME源码分析: ParaVis
  • C++11新特性_标准库_线程库_std::thread
  • 【Bootstrap V4系列】学习入门教程之 表格(Tables)和画像(Figure)
  • STM32复盘总结——芯片简介
  • 动态规划算法精解(Java实现):从入门到精通
  • Zephyr RTOS架构下的固件升级
  • MySQL数据库上篇