有人能为我解释一下FBX格式吗?

8
我使用Notepad++查看FBX模型的数据结构,但我对其理解存在一些问题。这里是一个位于(0,0,0)位置的边长为10的立方体的一些信息,请问这些成员是什么意思?谢谢!
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
} 

更详细的解释可以在这里找到:https://banexdevblog.wordpress.com/2014/06/23/a-quick-tutorial-about-the-fbx-ascii-format/ - convert
3个回答

11

我认为这些假设是相当合理的,尽管我不确定为什么PolygonVertexIndex数组包含负值(似乎每个三角形的每第三个索引都是负的)。也许是为了指示多边形的最后一个索引,因此您可以拥有不需要是三角形的多边形。

带有负值的表示确实是最后一个定点。

要找出这是哪个顶点,您必须将其取反并从该值中减去1。

例如,-4表示3 ((-4)*(-1) - 1)


1
这很有道理,谢谢Autodesk...我想我们必须处理这个问题。 - overlii
1
现在我想起来,-1很聪明,因为否则你会遇到索引0的问题! - overlii
确实,它是在多边形上的最后一个点。FBX可以定义多顶点多边形,并使用“(-N-1)”来表示哪个是结束点。 - diego.martinez

10
即使没有了解FBX格式,您至少可以做出一些非常合理的猜测:
  1. Vertices 下的 24 个值是立方体的 8 个顶点(每个顶点使用 3 个值表示)。

  2. PolygonVertexIndex 下的 36 个值是组成立方体 6 个面的 12 个三角形的顶点索引(引用自 Vertices 中的值)。

  3. Edges 下的 24 个值是立方体的 12 条边的顶点索引。

  4. Normals 下的 108 个值是 12 个三角形的每个角落的 36 个法向量(每个法向量使用 3 个值表示)。

  5. UV 下的 24 个值是 12 个纹理坐标(每个纹理坐标对应 2 个值)。

  6. UVIndex 下的 36 个值是组成立方体 36 个三角形角落的纹理坐标索引(引用自 UV 中的值)。

我认为这些假设是相当合理的,尽管我不确定为什么 PolygonVertexIndex 数组包含负值(似乎每个三角形的每三个索引中有一个是负数)。也许是为了指示多边形的最后一个索引,这样就可以拥有不必是三角形的多边形。

是的,“正常”是12个面三个顶点的法线。但是一个顶点的法线不是通过添加与该顶点连接的面的法线然后归一化来计算的吗?我对一个顶点的法线和一个面的法线感到非常困惑。 - yvetterowe
@yvetterowe 法线可以按照您想要的任何方式计算,对于一个立方体来说,平均顶点相邻面法线不是一个好主意。该格式似乎为每个三角形角落存储一个法线(因此有36个法线),而不是为每个三角形或每个顶点存储一个法线。这样,法线可以是任何您想要的(每个顶点、每个面或介于两者之间),必要时引入重复的法线。 - Christian Rau
3
关于“Edges”,它们不是顶点索引,而是对PolygonVertexIndex数组的直接引用。每条边由该面中的当前顶点及其下一个顶点定义(如果索引<0,则会回到该多边形中的第一个索引)。(在编写导入器时,我发现如果将这些值作为边索引对加载,您会得到混乱的边缘网格) - ideasman42

10

负的顶点索引表示多边形的末尾。您可以对负索引进行按位取反,以获得正索引。

在C语言中,这将是

posIndex = ~negIndex;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接