如何为Mayavi的mlab.mesh定义x,y,z坐标?

时间:2016-06-16 02:46:12

标签: enthought mayavi

我正在尝试创建一个3D框,它将出现在Mayavi mlab.points3d图中。

我认为这应该可以使用mlab.mesh函数,如下所示:

points = mlab.points3d(xp,yp,zp,sp)
3Dbox = mlab.mesh(xbox,ybox,zbox)
mlab.show()

我查看了mesh的mlab手册条目,但是对于我的生活,我无法理解如何定义网格的x,y,z数据点。

有人可以开导我吗?将特别欣赏3D盒子的x,y,z数据点的示例。

1 个答案:

答案 0 :(得分:3)

你可以看到像三维矩阵一样分为x,y和z轴的3个矩阵。每个矩阵索引将描绘一个坐标,该坐标的每个点将与该邻居连接。所以你可以从定义6个平面开始制作你的盒子:

import numpy
import mayavi.mlab


#             pt1_ _ _ _ _ _ _ _ _pt2
#              /|                 /|
#             / |                / |
#         pt3/_ | _ _ _ _ _ _pt4/  |
#           |   |              |   |
#           |   |              |   |
#           |  pt5_ _ _ _ _ _ _|_ _|pt6
#           |  /               |  /
#           | /                | /
#        pt7|/_ _ _ _ _ _ _ _ _|/pt8

# Where :
x1, y1, z1 = (0, 1, 1)  # | => pt1
x2, y2, z2 = (1, 1, 1)  # | => pt2
x3, y3, z3 = (0, 0, 1)  # | => pt3
x4, y4, z4 = (1, 0, 1)  # | => pt4
x5, y5, z5 = (0, 1, 0)  # | => pt5
x6, y6, z6 = (1, 1, 0)  # | => pt6
x7, y7, z7 = (0, 0, 0)  # | => pt7
x8, y8, z8 = (1, 0, 0)  # | => pt8


box_points = numpy.array([[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],
                          [x4, y4, z4], [x5, y5, z5], [x6, y6, z6],
                          [x7, y7, z7], [x8, y8, z8]])

mayavi.mlab.points3d(box_points[:, 0], box_points[:, 1], box_points[:, 2],
                     mode="axes", color=(1, 0, 0))


mayavi.mlab.mesh([[x1, x2],
                  [x3, x4]],  # | => x coordinate

                 [[y1, y2],
                  [y3, y4]],  # | => y coordinate

                 [[z1, z2],
                  [z3, z4]],  # | => z coordinate

                 color=(0, 0, 0))  # black

# Where each point will be connected with this neighbors :
# (link = -)
#
# x1 - x2     y1 - y2     z1 - z2 | =>  pt1 - pt2
# -    -  and  -   -  and -    -  | =>   -     -
# x3 - x4     y3 - y4     z3 - z4 | =>  pt3 - pt4


mayavi.mlab.mesh([[x5, x6], [x7, x8]],
                 [[y5, y6], [y7, y8]],
                 [[z5, z6], [z7, z8]],
                 color=(1, 0, 0))  # red

mayavi.mlab.mesh([[x1, x3], [x5, x7]],
                 [[y1, y3], [y5, y7]],
                 [[z1, z3], [z5, z7]],
                 color=(0, 0, 1))  # blue

mayavi.mlab.mesh([[x1, x2], [x5, x6]],
                 [[y1, y2], [y5, y6]],
                 [[z1, z2], [z5, z6]],
                 color=(1, 1, 0))  # yellow

mayavi.mlab.mesh([[x2, x4], [x6, x8]],
                 [[y2, y4], [y6, y8]],
                 [[z2, z4], [z6, z8]],
                 color=(1, 1, 1))  # white

mayavi.mlab.mesh([[x3, x4], [x7, x8]],
                 [[y3, y4], [y7, y8]],
                 [[z3, z4], [z7, z8]],
                 color=(1, 0, 1))  # pink

mayavi.mlab.show()

enter image description here

否则,你也可以通过一次调用制作出更多面孔的网格。 两次调用 mayavi.mlab.mesh

# Define 2 mesh objects with 3 planes connected among themselves :
#
# pt1 - pt2 - pt6        pt8 - pt6 - pt2
#  -     -     -          -     -     -
# pt3 - pt4 - pt8   AND  pt7   pt5 - pt1
#  -     -     -          -     -     -
# pt7 - pt8 - pt8        pt3 - pt1 - pt1

mayavi.mlab.figure()
mayavi.mlab.mesh([[x1, x2, x6], [x3, x4, x8], [x7, x8, x8]],
                 [[y1, y2, y6], [y3, y4, y8], [y7, y8, y8]],
                 [[z1, z2, z6], [z3, z4, z8], [z7, z8, z8]],
                 color=(1, 0, 0))  # red

mayavi.mlab.mesh([[x8, x6, x2], [x7, x5, x1], [x3, x1, x1]],
                 [[y8, y6, y2], [y7, y5, y1], [y3, y1, y1]],
                 [[z8, z6, z2], [z7, z5, z1], [z3, z1, z1]],
                 color=(0, 0, 1))  # blue

mayavi.mlab.show()

enter image description here

只需拨打 mayavi.mlab.mesh

# Merge previous mesh objects in single one:
#
# pt1 - pt2 - pt6             | => pt1 - pt2 - pt6 - pt6 - pt6
#  -     -     -              | =>  -     -     -     -     -
# pt3 - pt4 - pt8             | => pt3 - pt4 - pt8 - pt6 - pt2
#  -     -     -              | =>  -     -     -     -     -
# pt7 - pt8 - pt8 - pt6 - pt2 | => pt7 - pt8 - pt8 - pt6 - pt2
#              -     -    -   | =>  -     -      -     -    -
#             pt7   pt5 - pt1 | => pt7 - pt7 - pt7   pt5 - pt1
#              -     -     -  | =>  -     -     -     -     -
#             pt3 - pt1 - pt1 | => pt7 - pt3 - pt3 - pt1 - pt1


mayavi.mlab.figure()
mayavi.mlab.mesh([[x1, x2, x6, x6, x6],
                  [x3, x4, x8, x6, x2],
                  [x7, x8, x8, x6, x2],
                  [x7, x7, x7, x5, x1],
                  [x7, x3, x3, x1, x1]],

                 [[y1, y2, y6, y6, y6],
                  [y3, y4, y8, y6, y2],
                  [y7, y8, y8, y6, y2],
                  [y7, y7, y7, y5, y1],
                  [y7, y3, y3, y1, y1]],

                 [[z1, z2, z6, z6, z6],
                  [z3, z4, z8, z6, z2],
                  [z7, z8, z8, z6, z2],
                  [z7, z7, z7, z5, z1],
                  [z7, z3, z3, z1, z1]])

mayavi.mlab.show()

enter image description here