Quantcast

Remeshing vtkPolyData with vtkMarchingCubes

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Remeshing vtkPolyData with vtkMarchingCubes

Se An
Hi everyone,

I’m new with vtk and I’m trying to remesh a vtkPolyData with the vtkMarchingCubes-Algorithm.

To do this I’m using the code described here: http://www.vtk.org/Wiki/VTK/Examples/Cxx/Modelling/MarchingCubes


def marchingCubes(size):

        volume = vtk.vtkImageData()

        bounds = [0.0, 0.0, 0.0 , 0.0, 0.0, 0.0]

        data.GetBounds(bounds)

        iBounds = 0
        while iBounds < 6:
            range = bounds[iBounds+1] - bounds[iBounds]
            bounds[iBounds]   = bounds[iBounds] - .0001 * range
            bounds[iBounds+1] = bounds[iBounds+1] + .0001 * range
            iBounds = iBounds + 2

        voxelModeller = vtk.vtkVoxelModeller()
        voxelModeller.SetSampleDimensions(size,size,size)   #Set cube size
        voxelModeller.SetModelBounds(bounds)
        voxelModeller.SetScalarTypeToFloat()
        voxelModeller.SetMaximumDistance(.1)

        voxelModeller.SetInputData(data)
        voxelModeller.Update()

        isoValue = 0.01 #0.001
        volume.DeepCopy(voxelModeller.GetOutput())

        surface = vtk.vtkMarchingCubes()
        if vtk.VTK_MAJOR_VERSION <= 5:
            surface.SetInput(volume)
        else:
            surface.SetInputData(volume)

        surface.ComputeScalarsOff()
        surface.SetValue(0, isoValue)

        surface.Update()

        data = surface.GetOutput()



Here my problem:
My input has just one Surface/Layer, the output has two layers as you see at the screenshot attached.
Is it possible to create an output with a remeshed polydata with just one layer?

Thanks in advance,
Sebastian



_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ

Search the list archives at: http://markmail.org/search/?q=vtkusers

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/vtkusers
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Remeshing vtkPolyData with vtkMarchingCubes

Se An
I worked it out, here my solution:

data is the input as vtkPolyData, for example a sphere.

def marchingCubes(size):

whiteImage = vtk.vtkImageData()
        bounds = [0]*6
        data.GetBounds(bounds)
        spacing = [0]*3 # desired volume spacing
        spacing[0] = size
        spacing[1] = size
        spacing[2] = size

        whiteImage.SetSpacing(spacing)

        dim = [0]*3
        for i in range(3):
            dim[i] = int(math.ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i])) + 1
            if (dim[i] < 1):
                dim[i] = 1
        whiteImage.SetDimensions(dim)
        whiteImage.SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1)
        origin = [0]*3
        origin[0] = bounds[0]
        origin[1] = bounds[2]
        origin[2] = bounds[4]
        whiteImage.SetOrigin(origin)

        whiteImage.AllocateScalars(vtk.VTK_UNSIGNED_CHAR,1)

        inval = 255
        outval = 0

        count = whiteImage.GetNumberOfPoints()
        i = 0
        while i < count:
            whiteImage.GetPointData().GetScalars().SetTuple1(i, inval)
            i = i + 1


        pol2stenc = vtk.vtkPolyDataToImageStencil()
        pol2stenc.SetInputData(data)

        pol2stenc.SetOutputOrigin(origin)
        pol2stenc.SetOutputSpacing(spacing)
        pol2stenc.SetOutputWholeExtent(whiteImage.GetExtent())
        pol2stenc.Update()

        imgstenc = vtk.vtkImageStencil()
        imgstenc.SetInputData(whiteImage)
        imgstenc.SetStencilConnection(pol2stenc.GetOutputPort())
        imgstenc.ReverseStencilOff()
        imgstenc.SetBackgroundValue(outval)
        imgstenc.Update()

        cf = vtk.vtkMarchingCubes()
        cf.SetInputData(imgstenc.GetOutput())
        cf.GenerateValues(1,10,10)
        cf.Update()

        reverse = vtk.vtkReverseSense()
        reverse.SetInputConnection(cf.GetOutputPort())
        reverse.ReverseCellsOn()
        reverse.ReverseNormalsOn()

        reverse.Update()

        data = reverse.GetOutput()


Hope it helps anyone.
Cheers!


Am 29.03.2017 um 02:03 schrieb Se An <[hidden email]>:

Hi everyone,

I’m new with vtk and I’m trying to remesh a vtkPolyData with the vtkMarchingCubes-Algorithm.

To do this I’m using the code described here: http://www.vtk.org/Wiki/VTK/Examples/Cxx/Modelling/MarchingCubes


def marchingCubes(size):

        volume = vtk.vtkImageData()

        bounds = [0.0, 0.0, 0.0 , 0.0, 0.0, 0.0]

        data.GetBounds(bounds)

        iBounds = 0
        while iBounds < 6:
            range = bounds[iBounds+1] - bounds[iBounds]
            bounds[iBounds]   = bounds[iBounds] - .0001 * range
            bounds[iBounds+1] = bounds[iBounds+1] + .0001 * range
            iBounds = iBounds + 2

        voxelModeller = vtk.vtkVoxelModeller()
        voxelModeller.SetSampleDimensions(size,size,size)   #Set cube size
        voxelModeller.SetModelBounds(bounds)
        voxelModeller.SetScalarTypeToFloat()
        voxelModeller.SetMaximumDistance(.1)

        voxelModeller.SetInputData(data)
        voxelModeller.Update()

        isoValue = 0.01 #0.001
        volume.DeepCopy(voxelModeller.GetOutput())

        surface = vtk.vtkMarchingCubes()
        if vtk.VTK_MAJOR_VERSION <= 5:
            surface.SetInput(volume)
        else:
            surface.SetInputData(volume)

        surface.ComputeScalarsOff()
        surface.SetValue(0, isoValue)

        surface.Update()

        data = surface.GetOutput()



Here my problem:
My input has just one Surface/Layer, the output has two layers as you see at the screenshot attached.
Is it possible to create an output with a remeshed polydata with just one layer?

Thanks in advance,
Sebastian


<Input.jpeg><Output.jpeg>
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ

Search the list archives at: http://markmail.org/search/?q=vtkusers

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/vtkusers


_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ

Search the list archives at: http://markmail.org/search/?q=vtkusers

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/vtkusers
Loading...