If you still interested in golang FBX reader here is my implementation https://github.com/o5h/fbx. Not well tested, but should work.
Internally FBX have following structure:
type Header [27]byte
type FBX struct {
Header *Header
Top *Node
Nodes []*Node
}
type Node struct {
EndOffset uint32
NumProperties uint32
PropertyListLen uint32
NameLen uint8
Name string
Properties []*Property
NestedNodes []*Node
}
type Property struct {
TypeCode byte
Data interface{}
}
Here is an usage example:
f, _ := os.Open("cube.fbx")
defer f.Close()
fbxData, _ := fbx.ReadFrom(f)
ibo := fbxData.Filter(fbx.FilterName("PolygonVertexIndex"))[0]
fmt.Println(ibo)
Output will be
[0 2 -4 7 5 -5 4 1 -1 5 2 -2 2 7 -4 0 7 -5 0 1 -3 7 6 -6 4 5 -2 5 6 -3 2 6 -8 0 3 -8]
Here is an example, how I get other attributes
ibo := node.FilterName("PolygonVertexIndex")[0].Properties[0].AsInt32Slice()
vbo := node.FilterName("Vertices")[0].Properties[0].AsFloat64Slice()
normals := node.FilterName("Normals")[0].Properties[0].AsFloat64Slice()
uvIndex := node.FilterName("UVIndex")[0].Properties[0].AsInt32Slice()
uv := node.FilterName("UV")[0].Properties[0].AsFloat64Slice()
numFaces := len(ibo) / 3
for f := 0; f < numFaces; f++ {
face := &Face{}
index := f * 3
a := int(ibo[index+0])
b := int(ibo[index+1])
c := int(ibo[index+2])*-1 - 1
face.a.Position = getVec3(vbo, a)
face.b.Position = getVec3(vbo, b)
face.c.Position = getVec3(vbo, c)
uva := int(uvIndex[index+0])
uvb := int(uvIndex[index+1])
uvc := int(uvIndex[index+2])
face.a.UV = getVec2(uv, uva)
face.b.UV = getVec2(uv, uvb)
face.c.UV = getVec2(uv, uvc)
face.a.Normal = getVec3(normals, f*3+0)
face.b.Normal = getVec3(normals, f*3+1)
face.c.Normal = getVec3(normals, f*3+2)
faces[f] = face
}
type Vec3 struct {
X, Y, Z float32
}
type Vec2 struct {
X, Y float32
}
type Vertex struct {
Position *Vec3
Normal *Vec3
Color *Vec3
UV *Vec2
}
type Face struct {
a vertex.Vertex
b vertex.Vertex
c vertex.Vertex
}
func getVec3(data []float64, index int) *Vec3 {
i := index * 3
x := float32(data[i])
y := float32(data[i+1])
z := float32(data[i+2])
return &Vec3{x, y, z}
}