2015-03-06 2 views
1

Я начал давать базовый сценарий типа вокселя, где он будет выглядеть в 6 направлениях, связанных с точкой n, нарисовать плоскость по любой стороне, которая не имеет что-нибудь рядом с ним. Тогда я могу объединить плоскости, и это сделает объект.Как найти отдельные объекты в списке 3D-координат

Это хорошо работает, когда это все один объект, но если между объектами есть место, он все еще объединяет его как один объект. Когда список координат равен (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) 
+0

Вы действительно должны добавить теги: tag pymel и Maya. Я предложил изменить это сообщение. Но если вы не видите, что это отражено, вы должны добавить эти теги в ближайшее время. – kartikg3

+0

Быстрое предложение: попробуйте использовать «pm» или «pmc» для pymel, вместо «py». – kartikg3

+0

Спасибо, что, честно говоря, проблема не была особенно специфичной для Maya (только код), я не думал, что ей нужны теги :) И это в основном для того, чтобы быть более дружелюбным к Google с pm вместо py? – Peter

ответ

1

Обычный метод для поиска в 3-D регулярной сетки, как это octree. Основная идея заключается в том, что вы разделяете свое пространство на два кубика: каждый куб становится 8 меньшими кубами половинного размера и сообщает о наличии объектов в его дочерних элементах. Рекурсивно подразделяя таким образом, вы можете быстро устранить проверки на наличие больших площадей в мире, которые пусты. Это не так сложно реализовать, потому что это принципиально рекурсивно: если вы заработаете на двух уровнях подразделения, у вас есть возможность идти глубже по мере необходимости. На github есть несколько реализаций python, но я не могу их рекомендовать.

+0

Спасибо, Я предполагаю, что это будет способ отображать сетку, а не вычислять, какие бит являются отдельными? На самом деле это не так сложно проектировать, поэтому я дам ему снимок и посмотрю, как это получится :) – Peter

+0

Octree - это в основном способ ускорения проверок трехмерных данных, когда данные являются запасными: если у вас есть 10 точек в сетке 10 x 10 x 10, то есть 10 точек в 1000 ячейках: много проверок. Окци может помочь вам быстро удалить пустые ячейки из любых поисков. Это позволит быстрее определить смежности, а также сократить область, в которой вы нуждаетесь, чтобы выполнить voxelize до наименьшего тома, который содержит ваши очки. – theodox

+0

Да, аплодисменты за информацию, я пытался заставить ее работать, но я ударил небольшая проблема. Я сохраняю координаты, такие как (1,1), (- 1,1) и т. Д., И сохраняю их 2D на данный момент, но как вы справляетесь с равными точками, которые попадают на край сетки? Добавит ли 0,5 к каждой координате? Здесь приведен краткий пример - http://i.imgur.com/h6gr2HH.png – Peter

Смежные вопросы