кто-нибудь может объяснить формат FBX для меня?

#graphics #data-structures #dataformat #fbx

#графика #структуры данных #формат данных #fbx

Вопрос:

я использую notepad , чтобы увидеть структуру данных модели FBX, но у меня есть некоторые проблемы с ее пониманием. Вот некоторая информация о кубе (сторона = 10), расположенном в (0,0,0), кто-нибудь может сказать мне, что означают эти элементы? Спасибо!

 Vertices: *24 {
a: -5,-5,0,5,-5,0,-5,5,0,5,5,0,-5,-5,10,5,-5,10,-5,5,10,5,5,10
} 
PolygonVertexIndex: *36 {
a: 0,2,-4,3,1,-1,4,5,-8,7,6,-5,0,1,-6,5,4,-1,1,3,-8,7,5,-2,3,2,-7,6,7,-4,2,0,-5,4,6,-3
} 
Edges: *18 {
a: 0,1,2,3,4,6,7,8,9,10,13,14,16,19,20,25,26,32
} 
Normals: *108 {
a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-        1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-   1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0
} 

UV: *24 {
a: 0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1
} 
UVIndex: *36 {
a: 9,11,10,10,8,9,8,9,11,11,10,8,4,5,7,7,6,4,0,1,3,3,2,0,4,5,7,7,6,4,0,1,3,3,2,0
} 
  

Комментарии:

1. Более подробное объяснение можно найти здесь: banexdevblog.wordpress.com/2014/06/23 /…

Ответ №1:

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

Тот, у которого отрицательное значение, действительно представляет последнюю вершину.

Чтобы узнать, что это за вершина, вы должны отрицать ее и вычесть 1 из этого значения.

Например, -4 представляет 3 ((-4)*(-1) - 1)

Комментарии:

1. И это имеет смысл, спасибо Autodesk… Я думаю, нам придется с этим разобраться.

2. Теперь, когда я думаю об этом, значение -1 является разумным, потому что в противном случае у вас проблема с индексом 0!

3. действительно, это последний на полигоне. FBX может определять многоугольники multivertex и использует (-N-1), чтобы показать, какой из них является концом.

Ответ №2:

Даже не зная формата FBX, вы можете, по крайней мере, сделать несколько очень разумных предположений:

  1. 24 значения под Vertices — это 8 вершин куба (с 3 значениями, представляющими одну вершину).

  2. 36 значений под PolygonVertexIndex являются индексами вершин (ссылающимися на значения из Vertices ) для 12 треугольников, составляющих 6 граней куба.

  3. 24 значения под Edges являются индексами вершин 12 ребер куба.

  4. 108 значений под Normals — это 36 нормалей для каждого из углов треугольника 12 треугольников (с 3 значениями, представляющими один вектор нормали).

  5. 24 значения под UV — это 12 текстурных координат (причем 2 значения представляют одну пару текстурных координат).

  6. 36 значений под UVIndex — это индексы координат текстуры (ссылающиеся на значения из UV ) для 36 треугольных углов куба.

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

Комментарии:

1. да, «нормали» являются нормалями для трех вершин из 12 граней. Но разве нормаль вершины не вычисляется путем добавления нормалей граней, связанных с вершиной, а затем нормализации? Я совсем запутался с нормалью вершины и нормалью грани.

2. @yvetterowe Нормали могут быть вычислены в любом случае, и для куба не рекомендуется усреднять нормали смежных граней вершины. Формат, похоже, хранит нормаль для каждого угла треугольника (следовательно, 36 нормалей), а не для каждого треугольника или для каждой вершины. Таким образом, нормали могут быть любыми, какими они хотят (для каждой вершины, для каждой грани или что-то среднее), вводя повторяющиеся нормали по мере необходимости.

3. что касается Edges , это не индексы вершин, они являются прямыми ссылками на массив PolygonVertexIndex. Каждое ребро определяется этой вершиной и следующей на этой грани (если индекс < 0, он обтекается до первого индекса в этом многоугольнике). (Я обнаружил это при написании импортера, если вы загружаете эти значения в виде пар ребер-индексов, вы получаете скремблированные ребра по всей сетке)

Ответ №3:

Отрицательный индекс вершины указывает на конец многоугольника. Вы можете побитово отрицать отрицательный индекс, чтобы получить положительный.

В c это было бы

 posIndex = ~negIndex;