如何在3D坐标列表中查找单独的对象

时间:2015-03-06 20:39:17

标签: python maya pymel

我开始给出一个基本体素类型的脚本一个镜头,它将在6个方向上看起来与n点相邻,在任何一侧都没有任何东西的平面上绘制一个平面。然后我可以组合这些飞机,然后它就会成为一个物体。

当它是所有一个对象时,这很有效,但如果对象之间有空间,它仍然将它作为一个对象组合在一起。如果坐标列表类似于(x,y,z),我将如何根据连接的内容进行拆分?我能想到的唯一方法是处理繁重,并且需要检查一个对象周围的每个自由空间,同时构建它直到没有剩下,但我想应该有更好的方法。

为了记录,这实际上不会被用于任何事情,只是为了好玩,看看我是否能够做到这一点

import pymel.core as py

directions = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]]

grid = {}
grid[(0,0,0)] = 1
grid[(1,0,0)] = 0
grid[(-1,0,0)] = 1
grid[(0,1,0)] = 1


for originalCoordinate in grid.keys():
    adjacentCoordinates = [tuple( sum( j ) for j in zip( i, originalCoordinate ) ) for i in directions]
    blockHere = grid[originalCoordinate]
    if blockHere:
        for newCoordinate in adjacentCoordinates:
            if not grid.get( newCoordinate, 0 ):
                newDirection = tuple( i[1]-i[0] for i in zip( originalCoordinate, newCoordinate ) )
                newSide = py.polyPlane( width = 1, height = 1, sx = 1, sy = 1 )[0]
                sideLocation = list( originalCoordinate )
                sideRotation = [0, 0, 0]
                if newDirection[0]:
                    if newDirection[0] > 0:
                        print originalCoordinate, "Facing X"
                        sideLocation[0] += 0.5
                        sideRotation[2] += -90
                    else:
                        print originalCoordinate, "Facing -X"
                        sideLocation[0] += -0.5
                        sideRotation[2] += 90
                if newDirection[1]:
                    if newDirection[1] > 0:
                        print originalCoordinate, "Facing Y"
                        sideLocation[1] += 0.5
                        sideLocation[1] += 0
                    else:
                        print originalCoordinate, "Facing -Y"
                        sideLocation[1] += -0.5
                        sideLocation[1] += 180
                if newDirection[2]:
                    if newDirection[2] > 0:
                        sideLocation[2] += 0.5
                        sideRotation[0] += 90
                        print originalCoordinate, "Facing Z"
                    else:
                        sideLocation[2] += -0.5
                        sideRotation[0] += -90
                        print originalCoordinate, "Facing -Z"
                py.move( newSide, sideLocation )
                py.rotate( newSide, sideRotation )

1 个答案:

答案 0 :(得分:1)

搜索像这样的3-d规则网格的常用方法是octree。基本思想是将你的空间划分为两个立方体:每个立方体变成8个较小的半尺寸立方体,并报告其子体中物体的存在。通过以这种方式递归细分,您可以快速消除对空白的大区域的检查。它实现起来并不困难,因为它基本上是递归的:如果你让它在两个细分层次上工作,你就有能力根据需要更深入地实现。在github上有几个python实现可供查看,我还没有人推荐。