2013-02-27 1 views
3

Я только начинаю использовать майави в python и не слишком много знаю о программировании 3d-графики. Я хочу, чтобы построить вогнутую поверхность/объект, но когда я пытаюсь это выходит подключается так:построение вогнутых объектов с mayavi или vtk

whats happening

вы не можете видеть на картинке, но она образована параллельными плоскостями (не то, что я намеревался либо)

, когда я пытаюсь построить структуру с этой формой:

what i'm trying to plot

Так вот что мне делать, чтобы получить очки и сюжет:

#extract the black in the image 
x,y,z = np.where(quest == 0) 
#make z1,z2 the right size(y*0) and value(+12) 
z1 = y*0 
z2 = y*0+12 
x,y,z1,z2= np.atleast_2d(x,y,z1,z2) 
#duplicate the shape at z1 and z2 
x = np.concatenate((x,x)) 
y = np.concatenate((y,y)) 
z = np.concatenate((z1,z2)) 
#plot the mesh 
mlab.mesh(x,y,z) 
mlab.show() 

Я заметил, что порядок ваших данных указывает на использование сетки, потому что он будет нарисовать линию из каждой последовательной точки.

Есть ли более простой способ сделать это, чтобы каким-то образом организовать мои баллы?

Также есть способ сделать форму заполнением области между точками?

Вся помощь ценится, спасибо

Followup Вопросы:

Есть ли лучший 3d библиотеки для питона, которая будет служить этой цели?

Я смотрю на это делать с ВТК, но та же проблема вырезания вогнутую часть знака вопроса, как это:

Same problem in vtk

Гораздо больше кода для этого:

#create the points 
points = vtk.vtkPoints() 
for i, j in zip(x,y): 
    points.InsertNextPoint(i,j,0) 
#create a polygon 
polygon = vtk.vtkPolygon() 
polygon.GetPointIds().SetNumberOfIds(len(x)) 
for i in range(len(x)): 
    polygon.GetPointIds().SetId(i,i) 
#add it to a cell array 
polygons = vtk.vtkCellArray() 
polygons.InsertNextCell(polygon) 
#make the poly data 
polyData = vtk.vtkPolyData() 
polyData.SetPoints(points) 
polyData.SetPolys(polygons) 
#set up the window 
mapper = vtk.vtkPolyDataMapper() 
mapper.SetInput(polyData 
actor = vtk.vtkActor() 
actor.SetMapper(mapper) 
renderer = vtk.vtkRenderer() 
rWindow = vtk.vtkRenderWindow() 
rWindow.AddRenderer(renderer) 
rWindowInteractor = vtk.vtkRenderWindowInteractor() 
rWindowInteractor.SetRenderWindow(rWindow) 
renderer.AddActor(actor) 
renderer.SetBackground(.5,.3,.31) 
rWindow.Render() 
rWindowInteractor.Start() 
+0

Нет ничего волшебного в выпуклости - сетка является сеткой, точно так же, как вы ее определяете. Кажется, вы получаете координаты черных пикселей ... то что? Как вы хотите, чтобы сетка определялась над этими точками? Вы должны указать это для VTK (при построении многоугольников), тогда он будет правильно нарисован. –

ответ

2

Это сообщение больше года, но он может быть полезен другим.

У меня была такая же проблема, и я разрешил ее с помощью vtkTriangleFilter. Этот фильтр преобразует входные многоугольники в треугольник, более понятный для OpenGL.

Вот быстрый сценарий, где я создаю вогнутую форму («выглядит как« слон »), и я предоставляю логическое значение для фильтрации формы или нет в начале.

#!/usr/bin/env python 

from vtk import * 

# switch to False if you don't want to filter the shape 
FILTER = True 

# x and y values of points to create a concave shape 
x = [-2.25032, -3.04773, -3.06125, -2.69633, -2.52063, -2.16923, -1.72322, -1.47994, -1.85837, -1.04745, -0.68253, 1.25018, 1.81783, 3.20992, 2.15571, 1.99353, 2.72336, 3.35859, 3.57483, 3.60186, 3.69647, 4.18303, 4.29115, 3.87217, 2.87203, 2.07462, 1.43939, 1.10151, 0.912292, 0.466283, 1.27721, 0.723076, -1.22315] 

y = [-1.3371, -0.671689, 0.094162, 0.081607, -0.4457, -0.960452, -0.797238, 0.0313873, 1.43754, 1.76397, -0.00627746, -0.295041, 1.42498, 1.36221, -0.39548, -1.21155, -1.57564, -1.57564, -1.03578, -0.47081, 0.244821, 0.169492, -0.822348, -1.98996, -2.7307, -2.96924, -3.20778, -2.89391, -2.56748, -2.12806, -1.93974, -1.65097, -1.60075] 


# creation of the source 
positions = zip(x, y) 

triFilter = vtkTriangleFilter() 

pts = vtkPoints() 
polygon = vtkPolygon() 
polygon.GetPointIds().SetNumberOfIds(len(positions)) 

for k, l in enumerate(positions): 
    pts.InsertNextPoint(float(l[0]), float(l[1]), 1) 
    polygon.GetPointIds().SetId(k, k) 

polygons = vtkCellArray() 
polygons.InsertNextCell(polygon) 

polygonPolyData = vtkPolyData() 
polygonPolyData.SetPoints(pts) 
polygonPolyData.SetPolys(polygons) 

# let's filter the polydata 
triFilter.SetInputData(polygonPolyData) 
triFilter.Update() 

polygonPolyDataFiltered = triFilter.GetOutput() 

# map it 
mapper = vtkPolyDataMapper() 

if VTK_MAJOR_VERSION <= 5: 

    if FILTER: 
     mapper.SetInput(polygonPolyDataFiltered) 
    else: 
     mapper.SetInput(polygonPolyData) 
else: 
    if FILTER: 
     mapper.SetInputData(polygonPolyDataFiltered) 
    else: 
     mapper.SetInputData(polygonPolyData) 

# render it 

actor = vtkActor() 
actor.SetMapper(mapper) 

ren = vtkRenderer() 
ren.AddActor(actor) 

renwin = vtkRenderWindow() 
renwin.AddRenderer(ren) 

iren = vtkRenderWindowInteractor() 
iren.SetRenderWindow(renwin) 

iren.SetInteractorStyle(vtkInteractorStyleTrackballCamera()) 
iren.Initialize() 
iren.Start()