#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, вы можете, по крайней мере, сделать несколько очень разумных предположений:
-
24 значения под
Vertices
— это 8 вершин куба (с 3 значениями, представляющими одну вершину). -
36 значений под
PolygonVertexIndex
являются индексами вершин (ссылающимися на значения изVertices
) для 12 треугольников, составляющих 6 граней куба. -
24 значения под
Edges
являются индексами вершин 12 ребер куба. -
108 значений под
Normals
— это 36 нормалей для каждого из углов треугольника 12 треугольников (с 3 значениями, представляющими один вектор нормали). -
24 значения под
UV
— это 12 текстурных координат (причем 2 значения представляют одну пару текстурных координат). -
36 значений под
UVIndex
— это индексы координат текстуры (ссылающиеся на значения изUV
) для 36 треугольных углов куба.
Я думаю, что эти предположения вполне разумны, хотя я не уверен, почему PolygonVertexIndex
массив содержит отрицательные значения (кажется, что каждый третий индекс каждого треугольника отрицательный). Может быть, указать последний индекс многоугольника, чтобы у вас могли быть многоугольники, которые не обязательно должны быть треугольниками.
Комментарии:
1. да, «нормали» являются нормалями для трех вершин из 12 граней. Но разве нормаль вершины не вычисляется путем добавления нормалей граней, связанных с вершиной, а затем нормализации? Я совсем запутался с нормалью вершины и нормалью грани.
2. @yvetterowe Нормали могут быть вычислены в любом случае, и для куба не рекомендуется усреднять нормали смежных граней вершины. Формат, похоже, хранит нормаль для каждого угла треугольника (следовательно, 36 нормалей), а не для каждого треугольника или для каждой вершины. Таким образом, нормали могут быть любыми, какими они хотят (для каждой вершины, для каждой грани или что-то среднее), вводя повторяющиеся нормали по мере необходимости.
3. что касается
Edges
, это не индексы вершин, они являются прямыми ссылками на массив PolygonVertexIndex. Каждое ребро определяется этой вершиной и следующей на этой грани (если индекс < 0, он обтекается до первого индекса в этом многоугольнике). (Я обнаружил это при написании импортера, если вы загружаете эти значения в виде пар ребер-индексов, вы получаете скремблированные ребра по всей сетке)
Ответ №3:
Отрицательный индекс вершины указывает на конец многоугольника. Вы можете побитово отрицать отрицательный индекс, чтобы получить положительный.
В c это было бы
posIndex = ~negIndex;