Динамически генерировать списки треугольников для сложной трехмерной сетки

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

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

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

3 ответа

Решение

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

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

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

Хорошая 3D сетка

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

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

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

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

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

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

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

Другие вопросы по тегам