Динамически генерировать списки треугольников для сложной трехмерной сетки
В моем приложении у меня есть форма и размеры сложного трехмерного тела (скажем, блока цилиндров), взятые из пользовательского ввода. Мне нужно построить вершины и индексные буферы для этого.
Поскольку размеры взяты из пользовательского ввода, я не могу использовать Blender или 3D Max для создания моей модели вручную. Каков метод из учебника для динамического создания такой сетки?
Я ищу что-то, что будет генерировать треугольники с учетом вершин, ребер и отверстий. Что-то вроде TetGen, хотя у TetGen нет способа исключить треугольники, которые падают на внутреннюю часть тела / сетки.
3 ответа
Похоже, вам нужно создать массив вершин и список треугольников, каждый из которых содержит список из 3 признаков в массив вершин. Нет простого способа сделать это. Чтобы нарисовать коробку, вам нужно 8 веток и 12 треугольников (по 2 на сторону). Некоторые представления также будут использовать явные представления ребер. Я подозреваю, что это намного больше работы, чем вы хотите сделать.....
Что вам нужно, это библиотека сеток, которая может выполнять CSG (составную твердую геометрию). Таким образом, вы сможете указать размеры блока, а затем размеры цилиндров и попросить его вырезать их для вас (разница CSG). Все управление вершинами и треугольниками должно быть сделано за вас. В конце концов, такая библиотека должна иметь возможность экспортировать сетку в некоторые распространенные форматы. Единственная проблема здесь в том, что я не знаю названия такой библиотеки. Что-то подсказывает мне, что Blender действительно может делать все это, если вы знаете, как его написать. Я также подозреваю, что есть 1 или 2 довольно хорошие библиотеки.
Google фактически вернул меня в Stackru с этим:
В конечном итоге вам может понадобиться программно генерировать простые сетки и манипулировать ими с помощью библиотеки, если они не предоставляют функций для создания сеток (все они говорят об управлении сеткой или выполнении CSG).
Это немного зависит от ваших требований.
Если вам не нужно обращаться к сетке после генерации, а нужно только визуализировать ее, самый быстрый вариант - создать буфер вершин с glGenBuffers
, сопоставьте это в память с glMapBuffer
, запишите ваши данные в буфер, а затем удалите его glUnmapBuffer
, Рисование будет очень быстрым, потому что все данные могут быть загружены в память видеокарты.
Если вам нужно получить доступ к данным меша после его генерации или если вы планируете регулярно их изменять, возможно, вам лучше построить данные вершин в регулярном массиве и использовать массивы вершин с glVertexPointer
и друзья.
Вы также можете использовать комбинацию: генерировать данные сетки в основной памяти, затем memcpy()
это в отображенный буфер вершин.
Наконец, если под "измерениями" вы подразумеваете просто масштабирование всего объекта, вы можете создать его в автономном режиме в любой программе трехмерного моделирования и использовать, например, преобразования OpenGL. glScale
, чтобы применить размеры к сетке при рендеринге.