過濾器 沿著線生成管道
介紹
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橋梁,聚合團隊。
本學習分享資料不得用于商業用途,僅做學習交流!!如有侵權立即刪除!!