如何在三维坐标列表中查找单独的对象

2024-09-30 02:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始给一个基本的体素类型脚本一个镜头,它会在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 )

Tags: 对象方法inpyforif空间grid
1条回答
网友
1楼 · 发布于 2024-09-30 02:30:48

像这样搜索三维规则网格的常用方法是octree。其基本思想是将空间划分为两个立方体的幂次方:每个立方体变成8个较小的、大小为一半的立方体,并报告子立方体中存在的对象。通过这种递归细分方式,您可以快速消除对世界上大片空白区域的检查。实现起来并不太困难,因为它基本上是递归的:如果你让它工作在两个细分级别上,你就有能力根据需要进行更深入的开发。github上有几个python实现可以看,我没有一个可以推荐。你知道吗

相关问题 更多 >

    热门问题