[vtkusers] Remeshing vtkPolyData with vtkMarchingCubes
Sebastian
seb.an at icloud.com
Fri Mar 31 15:56:43 EDT 2017
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 <seb.an at icloud.com>:
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 <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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20170331/fe7e05de/attachment.html>
More information about the vtkusers
mailing list