Чтение четырехугольников из файлов FBX в XNA или преобразование триангулированной многоугольной сетки в четырехугольники

Я импортирую модель FBX как объект модели XNA и читаю через вершинный буфер, чтобы получить треугольники, индексы, UV и поместить их в свой собственный класс модели. Проблема в том, что в буфере хранятся данные только о каждом треугольнике, а не о четырехугольниках, которые когда-то были в 3dsmax.

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

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

  2. Есть ли способ прочитать файл FBX (желательно после его загрузки в качестве объекта модели, чтобы избежать переписывания отдельного конвейера модели), в котором треугольники соединены как четырехугольники?

  3. «Кодирующий» подход. Учитывая список вершин / индексов, упорядочите их соответственно так, чтобы структура квадратов стала очевидной. В 3dsmax есть кнопка «quadrify», которая работает довольно хорошо, но не может найти простой способ сделать это. редактировать; Для этого подхода я имею в виду, что это оптимальный способ взглянуть на неупорядоченную структуру треугольников, чтобы найти лучшую «четырехугольную» версию меша, аналогично «квадрификации» в инструментах 3dsmax.


person jsmars    schedule 24.06.2013    source источник


Ответы (1)


Можно восстановить информацию о четырехугольниках, используя чистую информацию об индексировании - например, возьмем случай двух четырехугольников, разложенных на 4 треугольника.

1       2       3
+-------+-------+
|\      |\      |
|  \    |  \    |
|    \  |    \  |
|      \|      \|
+-------+-------+
4       5       6

Теперь ваши треугольники (при условии вращения по часовой стрелке)

A=(1, 5, 4) B=(1, 2, 5) C=(2, 6, 5) D=(2, 3, 6)

Края ваших треугольников

A=(1-5, 5-4, 4-1) B=(1-2, 2-5, 5-1) C=(2-6, 6-5, 5-2) D=(2-3, 3-6, 6-2)

Теперь легко увидеть, какие треугольники имеют общую грань.

  • A и B имеют ровно 1 грань 1-5 (потому что это то же самое, что 5-1)
  • B и C делят 2-5
  • C и D делят 2-6

Основываясь на этой информации, мы могли бы квадрировать его как

  • 1 четырехугольник = (1, 2, 6, 5) + 2 треугольника (1, 5, 4) и (2, 3, 6)

or

  • 2 четверных (1, 2, 5, 4) и (2, 3, 6, 5)

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

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

person Ani    schedule 24.06.2013
comment
А как насчет сетки, которая состоит из тысяч треугольников с более или менее случайным порядком вершин и порядком треугольников? и даже если квадроциклы находятся на сетке, которой обычно нет на сложных моделях, они также могут иметь смешанную триангуляцию. - person jsmars; 25.06.2013
comment
Та же идея будет работать, только будет намного больше вычислений. Чтобы уменьшить количество тестов, вы можете использовать схему пространственного разделения, например октодерево. Единственный случай, когда это не сработает, это когда ваша сетка не имеет общих вершин, а реплицирует их, чтобы сформировать треугольники, даже через треугольники с общими ребрами. - person Ani; 25.06.2013
comment
Неважно, где находятся вершины (на сетке или иначе). Обратите внимание, что я имею дело с индексированием вершин только в приведенном выше решении. - person Ani; 25.06.2013
comment
Я до сих пор не понимаю ключевой концепции в этом. Я уже прочитал все общие ребра и вершины, проблема в том, чтобы найти два правильных треугольника, которые должны образовать четырехугольник. Когда вершины и индексы смешаны, он не будет знать, какой соседний треугольник выбрать для четырехугольника, чтобы сохранить правильную четырехугольную структуру. Например, если вы создаете геосферу в 3dsmax, в ней нет ребер и явной четырехугольной структуры, как я могу закодировать систему, которая выбирает правильный соседний треугольник, чтобы все треугольники были учтены? (И желательно точно такая же четырехугольная структура, как в 3dsmax) - person jsmars; 26.06.2013
comment
Для сеток, которые не начинаются как квадраты, вы не сможете правильно реконструировать сетку на основе квадратов. Это НЕИЗБЕЖНО. И геосфера не основана на четырехугольниках. Если вы подумаете об этом, вы поймете, что только наборы (из 4) копланарных точек правильно являются четырехугольником. Думаю, здесь мне нужно спросить: для чего вам нужны квадраты из сетки, построенной в виде треугольников? - person Ani; 29.06.2013
comment
В таких случаях вам нужно будет выполнить сокращение, например, упрощение сетки, используя нормали граней, чтобы определить, можно ли свернуть два треугольника в четырехугольник. Конечно, это меняет топологию сетки. Это то, что делает Quadrify и возвращает меня - что вам нужно с этим делать. - person Ani; 29.06.2013
comment
Да, геосфера не создается в виде четырехугольника, но может быть легко преобразована в четырехугольник для дальнейшего использования. Я хочу создать структуру LOD дерева квадрантов из модели с большим количеством треугольников. Любая модель животного или человека может быть построена в основном в виде квадроциклов, которые подразделяются несколько раз, и я хотел бы создать способ отображения и циклического перехода между различными уровнями детализации аналогично тому, как это делали бы Mudbox или ZBrush, поэтому мне нужен действующая четырехугольная структура модели. Я рассмотрю возможность создания метода на основе нормалей лица, который может сработать! - person jsmars; 30.06.2013