Python 在mayavi中绘制断开连接的线调用mlab.plot3d一次

Python 在mayavi中绘制断开连接的线调用mlab.plot3d一次,python,3d,grid,line,mayavi,Python,3d,Grid,Line,Mayavi,我已经开始使用mayavi,我正在尝试绘制体素网格。为此,我使用mlab.plot3d绘制网格的每一行,这使得程序非常慢,因为必须为每一行调用渲染。有没有办法只调用一次mlab.plot3d来绘制所有线条?主要问题是我正在绘制的线是断开连接的,如果我在同一数组中一行接一行地放置,渲染将绘制我不想要的连接。我尝试通过在两条线之间放置None来连接两条未连接的线: lines = [0.0, 3.0, None, 0.0, 6.0] 但这是行不通的 我的逐行绘制网格线的功能如下所示: def dr

我已经开始使用mayavi,我正在尝试绘制体素网格。为此,我使用mlab.plot3d绘制网格的每一行,这使得程序非常慢,因为必须为每一行调用渲染。有没有办法只调用一次mlab.plot3d来绘制所有线条?主要问题是我正在绘制的线是断开连接的,如果我在同一数组中一行接一行地放置,渲染将绘制我不想要的连接。我尝试通过在两条线之间放置None来连接两条未连接的线:

lines = [0.0, 3.0, None, 0.0, 6.0]
但这是行不通的

我的逐行绘制网格线的功能如下所示:

def draw_voxel_grid_bbox_translated(voxel_grid, tube_radius=0.01, color=(0,0,0)):
'''
Draw a bounding box that shows the dimensions of the complete voxel grid in passed color
:param voxel_grid: The voxel grid used to draw the bounding box
:return: None
'''
# Drawing lines parallel to x axis
sense_change_z = 0
for z_step in range(2):
    sense_change_y = 0
    for y_step in range(2):
        if sense_change_y == 0:
            xs = [voxel_grid.min_grid_x - voxel_grid.min_grid_x, voxel_grid.max_grid_x - voxel_grid.min_grid_x]
            sense_change_y = 1
        else:
            xs = [voxel_grid.max_grid_x - voxel_grid.min_grid_x, voxel_grid.min_grid_x - voxel_grid.min_grid_x]
            sense_change_y = 0
        if y_step == 0:
            y_coord = voxel_grid.min_grid_y
        else:
            y_coord = voxel_grid.max_grid_y
        if z_step == 0:
            z_coord = voxel_grid.min_grid_z
        else:
            z_coord = voxel_grid.max_grid_z
        ys = [y_coord - voxel_grid.min_grid_y, y_coord - voxel_grid.min_grid_y]
        zs = [z_coord - voxel_grid.min_grid_z, z_coord - voxel_grid.min_grid_z]
        mlab.plot3d(xs, ys, zs, color=color, tube_radius=tube_radius)
# Drawing lines parallel to y axis
for x_step in range(2):
    for z_step in range(2):
        ys = [voxel_grid.min_grid_y - voxel_grid.min_grid_y, voxel_grid.max_grid_y - voxel_grid.min_grid_y]
        if x_step == 0:
            x_coord = voxel_grid.min_grid_x
        else:
            x_coord = voxel_grid.max_grid_x
        if z_step == 0:
            z_coord = voxel_grid.min_grid_z
        else:
            z_coord = voxel_grid.max_grid_z
        xs = [x_coord - voxel_grid.min_grid_x, x_coord - voxel_grid.min_grid_x]
        zs = [z_coord - voxel_grid.min_grid_z, z_coord - voxel_grid.min_grid_z]
        mlab.plot3d(xs, ys, zs, color=color, tube_radius=tube_radius)
# Drawing lines parallel to z axis
for x_step in range(2):
    for y_step in range(2):
        zs = [voxel_grid.min_grid_z - voxel_grid.min_grid_z, voxel_grid.max_grid_z - voxel_grid.min_grid_z]
        if x_step == 0:
            x_coord = voxel_grid.min_grid_x
        else:
            x_coord = voxel_grid.max_grid_x
        if y_step == 0:
            y_coord = voxel_grid.min_grid_y
        else:
            y_coord = voxel_grid.max_grid_y
        xs = [x_coord - voxel_grid.min_grid_x, x_coord - voxel_grid.min_grid_x]
        ys = [y_coord - voxel_grid.min_grid_y, y_coord - voxel_grid.min_grid_y]
        mlab.plot3d(xs, ys, zs, color=color, tube_radius=tube_radius)

用一个points3d调用连接点之间的任意线是可能的,而且速度非常快。使用来自


感谢@Jannick的回答

以下是新功能,以防有人感兴趣:

def draw_voxel_grid_cells(voxel_grid):

# Array for the points with the shape of the total number of points needed to define for drawing all the lines of the grid
points = np.zeros((((voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_y+1) + (voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_x+1) + (voxel_grid.nbr_cells_y+1)*(voxel_grid.nbr_cells_x+1))*2, 3))
i = 0
# Drawing lines parallel to x axis
for z_step in range(voxel_grid.nbr_cells_z+1):
    for y_step in range(voxel_grid.nbr_cells_y+1):
        points[i,:]    = [voxel_grid.min_grid_x, voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        points[i+1, :] = [voxel_grid.max_grid_x, voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        i += 2
# Drawing lines parallel to y axis
for z_step in range(voxel_grid.nbr_cells_z+1):
    for x_step in range(voxel_grid.nbr_cells_x+1):
        points[i,:]    = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y, voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        points[i+1, :] = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.max_grid_y, voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        i += 2
# Drawing lines parallel to z axis
for y_step in range(voxel_grid.nbr_cells_y+1):
    for x_step in range(voxel_grid.nbr_cells_x+1):
        points[i,:] =    [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z]
        points[i+1, :] = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.max_grid_z]
        i += 2
connections = np.arange(0, ((voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_y+1) + (voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_x+1) + (voxel_grid.nbr_cells_y+1)*(voxel_grid.nbr_cells_x+1))*2)
connections = tuple(connections.reshape(-1,2))

# Plotting -------------------------------------------------
mlab.figure()
pts = mlab.points3d(points[:, 0], points[:, 1], points[:, 2], scale_factor=0.0001, color=(1, 0, 0))
pts.mlab_source.dataset.lines = np.array(connections)
tube = mlab.pipeline.tube(pts, tube_radius=0.001)
tube.filter.radius_factor = 1.
mlab.pipeline.surface(tube, color=(1, 0, 0))
mlab.show()
# ----------------------------------------------------------

return

非常感谢。这正是我想要的。@luigui2906如果你喜欢我的答案,请接受并投票表决
def draw_voxel_grid_cells(voxel_grid):

# Array for the points with the shape of the total number of points needed to define for drawing all the lines of the grid
points = np.zeros((((voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_y+1) + (voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_x+1) + (voxel_grid.nbr_cells_y+1)*(voxel_grid.nbr_cells_x+1))*2, 3))
i = 0
# Drawing lines parallel to x axis
for z_step in range(voxel_grid.nbr_cells_z+1):
    for y_step in range(voxel_grid.nbr_cells_y+1):
        points[i,:]    = [voxel_grid.min_grid_x, voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        points[i+1, :] = [voxel_grid.max_grid_x, voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        i += 2
# Drawing lines parallel to y axis
for z_step in range(voxel_grid.nbr_cells_z+1):
    for x_step in range(voxel_grid.nbr_cells_x+1):
        points[i,:]    = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y, voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        points[i+1, :] = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.max_grid_y, voxel_grid.min_grid_z+(voxel_grid.resolution*z_step)]
        i += 2
# Drawing lines parallel to z axis
for y_step in range(voxel_grid.nbr_cells_y+1):
    for x_step in range(voxel_grid.nbr_cells_x+1):
        points[i,:] =    [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.min_grid_z]
        points[i+1, :] = [voxel_grid.min_grid_x+(voxel_grid.resolution*x_step), voxel_grid.min_grid_y+(voxel_grid.resolution*y_step), voxel_grid.max_grid_z]
        i += 2
connections = np.arange(0, ((voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_y+1) + (voxel_grid.nbr_cells_z+1)*(voxel_grid.nbr_cells_x+1) + (voxel_grid.nbr_cells_y+1)*(voxel_grid.nbr_cells_x+1))*2)
connections = tuple(connections.reshape(-1,2))

# Plotting -------------------------------------------------
mlab.figure()
pts = mlab.points3d(points[:, 0], points[:, 1], points[:, 2], scale_factor=0.0001, color=(1, 0, 0))
pts.mlab_source.dataset.lines = np.array(connections)
tube = mlab.pipeline.tube(pts, tube_radius=0.001)
tube.filter.radius_factor = 1.
mlab.pipeline.surface(tube, color=(1, 0, 0))
mlab.show()
# ----------------------------------------------------------

return