Динамически генерировать списки треугольников для сложной трехмерной сетки - PullRequest
2 голосов
/ 11 мая 2010

В моем приложении у меня есть форма и размеры сложного трехмерного тела (скажем, Блок цилиндров ), взятые из пользовательского ввода. Для этого мне нужно построить буферы вершин и индексов.

Поскольку размеры взяты из пользовательского ввода, я не могу использовать Blender или 3D Max для создания моей модели вручную. Каков метод из учебника для динамического создания такой сетки?

Я ищу что-то, что будет генерировать треугольники с учетом вершин, ребер и отверстий. Что-то вроде TetGen , хотя TetGen не может исключить треугольники, которые падают на внутреннюю часть тела / сетки.

Ответы [ 3 ]

1 голос
/ 11 мая 2010

Звучит так, будто вам нужно создать массив вершин и список треугольников, каждый из которых содержит список из 3 указателей в массив вершин. Нет простого способа сделать это. Чтобы нарисовать коробку, вам нужно 8 веток и 12 треугольников (по 2 на сторону). Некоторые представления также будут использовать явные представления ребер. Я подозреваю, что это намного больше работы, чем вы хотите сделать .....

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

Google фактически вернул меня в StackOverflow с этим:

Хорошая библиотека 3D-сеток

В конечном итоге вам может понадобиться программно создавать простые сетки и манипулировать ими с помощью библиотеки, если они не предоставляют функций для создания сеток (все они говорят о манипулировании сеткой или выполнении CSG).

0 голосов
/ 07 июня 2010

Я не уверен, что алгоритм Marching Cube поможет?

0 голосов
/ 11 мая 2010

Это немного зависит от ваших требований.

Если вам не нужен доступ к сетке после генерации, а нужно только визуализировать ее, самый быстрый вариант - создать буфер вершин с glGenBuffers, отобразить его в память с помощью glMapBuffer, записать ваши данные в буфер, затем удалите его с помощью glUnmapBuffer. Рисование будет очень быстрым, потому что все данные могут быть загружены в память видеокарты.

Если вам нужно получить доступ к данным меша после его генерации или если вы планируете регулярно их модифицировать, возможно, вам лучше построить свои данные вершин в обычном массиве и использовать массивы вершин с glVertexPointer и друзьями.

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

Наконец, если под «измерениями» вы подразумеваете просто масштабирование всего объекта, вы можете создать его в автономном режиме в любой программе трехмерного моделирования и использовать преобразования OpenGL, например glScale, чтобы применить размеры к сетке при рендеринге.

...