моделирование 3D-ячеек, определяемых пересечениями поверхностей

Я пытаюсь создать интерактивное трехмерное представление ячеек, которые определяются пересечением произвольных поверхностей. Мне трудно понять, как создать из этого сетку (или есть что-то лучше, чем сетка, к которой я должен стремиться для представления трехмерных объемов?). Каждая поверхность s задается аналитическим выражением для плоскости, сферы, цилиндра, конуса и т. д. как s = f(x,y,z) = 0, например, здесь:

введите здесь описание изображения

Для каждой ячейки у меня есть список поверхностей и значение +/- для каждой поверхности. При этом легко определить, лежит ли точка x, y, z внутри ячейки, подставив эту точку в уравнение для каждой из ограничивающих поверхностей, и если результат + для всех + поверхностей и - для всех - поверхностей точка лежит внутри. Очевидно, что если результат равен нулю для любой поверхности, то точка лежит на этой поверхности.

Я могу протестировать тысячи точек сетки, отмечая для каждой ячейки те точки, которые лежат внутри этой ячейки, а затем используя самые внешние из этих точек, чтобы создать сетку для этой ячейки. Однако у меня тысячи ячеек, и этого просто недостаточно быстро. Многие ячейки очень маленькие или с низким соотношением сторон по сравнению с другими, поэтому мне понадобилась бы очень мелкая сетка точек, если бы я собирался сделать это таким образом.

Может ли кто-нибудь предложить эффективный способ помещения ячеек, определенных таким образом, в статическую 3D-модель? Есть ли какая-нибудь библиотека, которая работает с такой спецификацией геометрии и может создавать для меня 3D-сетки? Я упускаю что-то очевидное?

Спасибо, Ник


person Nick    schedule 23.11.2010    source источник


Ответы (1)


Как общая проблема, это довольно сложно: я думаю, что это в основном общая проблема нелинейного программирования. Если ваши границы генерируются произвольными функциями, может быть произвольное количество ячеек, ограниченных даже одной такой функцией; без дополнительной информации о функциях я не думаю, что вы можете добиться большего успеха, чем проверка точек сетки.

Если вы что-то знаете о своей функции (например, плоскость, сфера, цилиндр и конус — все это коники), возможно, вы сможете добиться большего успеха. В любом случае вы можете начать с комбинаторного подхода; скажем, для любых трех границ определите, есть ли точки, в которых все три пересекаются.

В любом случае, как только вы определили углы и края своей ячейки, вы можете использовать основанный на сетке подход для построения сетки отображения — например, разрезать поверхность плоскостями, выровненными по осям, чтобы определить вершины и треугольники, чтобы отправить их на ваш компьютер. Библиотека 3D-графики на выбор.


Еще одна идея: поскольку вы определяете свои поверхности с помощью f(x,y,z)=0, вы можете начать с набора точек и численно перенести их на близлежащие поверхности с помощью шага метода Ньютона или чего-то еще:

point p = (x,y,z)
scalar value = f(p)
while abs(value) > epsilon:
  vector gradient = gradient_of_f(p)
  p -= gradient * (value / dot(gradient,gradient))
  value = f(p)

Что-то подобное должно позволить вам аппроксимировать краевые и угловые точки. Однако может быть сложнее понять, как соединить такие точки в сетку...

person comingstorm    schedule 24.11.2010