# How to smooth STL blob?

**URL:** https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634
**Category:** Web
**Created:** [May 16, 2025, 8:46am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634 "2025-05-16T08:46:50Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Bek1](https://discourse.vtk.org/user_avatar/discourse.vtk.org/bek1/32/10006_2.png) [@Bek1](https://discourse.vtk.org/u/Bek1)
#### Post date: [May 16, 2025, 8:46am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/1 "2025-05-16T08:46:50Z")

</div>

Here is my code. It is almost identical to this [example](https://kitware.github.io/vtk-js/examples/WindowedSincPolyDataFilter.html#Source)

```typescript
function StlModal(props: { ohifDicomSegBlob: any }) {
  const vtkContainer = useRef(null);

  async function getStl() {
    const stlRequest = await fetch('http://localhost:3004/orthanc/get-stl-from-dicom-seg', {
      method: "POST",
      body: ohifDicomSegBlob,
    });
    const stlBlob = await stlRequest.blob();

    const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
      background: [0, 0, 0],
      rootContainer: vtkContainer.current,
    });
    const renderer = fullScreenRenderer.getRenderer();
    const renderWindow = fullScreenRenderer.getRenderWindow();

    const actor = vtkActor.newInstance();
    renderer.addActor(actor);

    const mapper = vtkMapper.newInstance({ interpolateScalarBeforeMapping: true });
    actor.setMapper(mapper);

    const cam = vtkCamera.newInstance();
    renderer.setActiveCamera(cam);
    cam.setFocalPoint(0, 0, 0);
    cam.setPosition(0, 0, 10);
    cam.setClippingRange(0.1, 50.0);

    const stlReader = vtkSTLReader.newInstance();

    const smoothFilter = vtkWindowedSincPolyDataFilter.newInstance({
      nonManifoldSmoothing: 0,
      numberOfIterations: 100,    
      passBand: 0.001,            
    });

    const arrayBuffer = await stlBlob.arrayBuffer();
    stlReader.parseAsArrayBuffer(arrayBuffer);

    smoothFilter.setInputConnection(stlReader.getOutputPort());
    mapper.setInputConnection(smoothFilter.getOutputPort());

    renderer.resetCamera();
    renderWindow.render();
  }

  return (
    <div>
      <div>
        <button onClick={() => getStl()}>preview</button>
        <button onClick={() => {}}>download</button>
      </div>

      <div ref={vtkContainer}></div>
    </div>
  );
}

```

but instead of vtkHttpDataSetReader i use vtkSTLReader.  
In this component i get dicom-seg blob generated by OHIF. make request to get STL blob and render it using VTK.

But numberOfIterations: 100 and passBand: 0.001 has no effect. With them or without i see this  
non-smooth result

 ![image](https://discourse.vtk.org/uploads/default/original/2X/6/64369bb105c925d327282e7225a99e984c672d5d.png)

I expected something like this

 ![image](https://discourse.vtk.org/uploads/default/original/2X/1/11476abec6dbe636ca1c1bb4d91c7fe138f95fe2.png)

---

<div class="post-metadata">

### Author: ![finetjul](https://discourse.vtk.org/user_avatar/discourse.vtk.org/finetjul/32/154_2.png) [@finetjul](https://discourse.vtk.org/u/finetjul)
#### Post date: [May 16, 2025, 8:54am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/2 "2025-05-16T08:54:47Z")

</div>

Did you try to merge coincident points before smoothing ?  
Look at that option on the STL reader.

---

<div class="post-metadata">

### Author: ![Bek1](https://discourse.vtk.org/user_avatar/discourse.vtk.org/bek1/32/10006_2.png) [@Bek1](https://discourse.vtk.org/u/Bek1)
#### Post date: [May 16, 2025, 9:54am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/4 "2025-05-16T09:54:21Z")

</div>

i made these changes:

```typescript
    const stlReader = vtkSTLReader.newInstance();
    const normals = vtkPolyDataNormals.newInstance();
    stlReader.setRemoveDuplicateVertices(1)

    const smoothFilter = vtkWindowedSincPolyDataFilter.newInstance({
      nonManifoldSmoothing: 0,
      numberOfIterations: 100,    
      passBand: 0.001,            
    });

    const arrayBuffer = await stlBlob.arrayBuffer();
    stlReader.parseAsArrayBuffer(arrayBuffer);

    smoothFilter.setInputConnection(stlReader.getOutputPort());
    mapper.setInputConnection(normals.getOutputPort());
    normals.setInputConnection(smoothFilter.getOutputPort());

```

and now it’s smooth. But very laggy, little mouse movement takes 10s, is it expected? from this point all depends on my cpu power?

i enabled these flags and it’s less laggy, but still unusable.  
chrome://flags/#enable-unsafe-webgpu  
chrome://flags/#enable-vulkan

In this [example](https://kitware.github.io/vtk-js/examples/WindowedSincPolyDataFilter.html#Live-example) it’s not laggy after changing properties

---

<div class="post-metadata">

### Author: ![finetjul](https://discourse.vtk.org/user_avatar/discourse.vtk.org/finetjul/32/154_2.png) [@finetjul](https://discourse.vtk.org/u/finetjul)
#### Post date: [May 16, 2025, 10:14am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/5 "2025-05-16T10:14:02Z")

</div>

Are you using WebGL or WebGPU ?  
How many points does your STL file has ? How many after smoothing it ?

---

<div class="post-metadata">

### Author: ![Bek1](https://discourse.vtk.org/user_avatar/discourse.vtk.org/bek1/32/10006_2.png) [@Bek1](https://discourse.vtk.org/u/Bek1)
#### Post date: [May 16, 2025, 11:12am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/6 "2025-05-16T11:12:31Z")

</div>

never mind.

i made these changes and its not laggy at all.

```typescript
    smoothFilter.setInputConnection(stlReader.getOutputPort());
    mapper.setInputConnection(normals.getOutputPort());
    normals.setInputConnection(smoothFilter.getOutputPort());

    smoothFilter.setInputData(stlReader.getOutputData());
    mapper.setInputData(normals.getOutputData());
    normals.setInputData(smoothFilter.getOutputData());

```

so i just added setInputData after setInputConnection. I have no idea why it helped

---

<div class="post-metadata">

### Author: ![finetjul](https://discourse.vtk.org/user_avatar/discourse.vtk.org/finetjul/32/154_2.png) [@finetjul](https://discourse.vtk.org/u/finetjul)
#### Post date: [May 16, 2025, 11:20am UTC](https://discourse.vtk.org/t/how-to-smooth-stl-blob/15634/7 "2025-05-16T11:20:23Z")

</div>

What if you try the following ?

```auto
smoothFilter.setInputConnection(stlReader.getOutputPort());
normals.setInputConnection(smoothFilter.getOutputPort());
mapper.setInputConnection(normals.getOutputPort());
normals.update();

```
