1

私は基本的なボクセル タイプのスクリプトを試してみました。ポイントに隣接する 6 つの方向を見て、隣に何もない任意の側面を横切る平面を描画します。次に、平面を結合してオブジェクトを作成します。

これは、すべてが 1 つのオブジェクトである場合はうまく機能しますが、オブジェクト間にスペースがある場合でも、すべてを 1 つのオブジェクトとして結合します。のような座標のリストで、(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 )
4

1 に答える 1

1

このような 3 次元の規則的なグリッドを検索する通常の方法はoctreeです。基本的な考え方は、スペースを 2 の累乗の立方体に分割することです。各立方体は、半分の大きさの 8 つの小さな立方体になり、その子にあるオブジェクトの存在を報告します。このように再帰的に再分割することにより、世界の空の広い領域のチェックをすばやく排除できます。基本的に再帰的であるため、実装するのはそれほど難しくありません。2 つのレベルのサブディビジョンで機能するようになれば、必要に応じてさらに深くすることができます。github には参照すべき Python 実装がいくつかありますが、推奨するものはありません。

于 2015-03-09T21:43:02.827 に答える