UE4 Datasmith UdsMesh 格式解析
Datasmith导出插件将几何模型导出为*.udsmesh
格式的文件。*.udsmesh
文件中存储了构建FRawMesh
的相关信息。
UdsMesh
包含文件头+ FRawMesh
相关信息。
基本结构:内容长度+内容的形式。
具体解析过程可参考:
https://github.com/0xafbf/blender-datasmith-export/blob/master/data_types.py
# this may need some work, found some documentation:
# Engine/Source/Developer/Rawmesh
def write_to_path(self, path):
with open(path, 'wb') as file:
log.debug("writing mesh:"+self.name)
#write_null(file, 8)
file.write(b'\x01\x00\x00\x00\xfd\x04\x00\x00')
file_start = file.tell()
write_string(file, self.name)
#write_null(file, 5)
file.write(b'\x00\x01\x00\x00\x00')
write_string(file, self.source_models)
write_string(file, self.struct_property)
write_null(file, 8)
write_string(file, self.datasmith_mesh_source_model)
write_null(file, 25)
size_loc = file.tell() # here we have to write the rawmesh size two times
write_data(file, 'II', 0, 0) # just some placeholder data, to rewrite at the end
file.write(b'\x7d\x00\x00\x00\x00\x00\x00\x00') #125 and zero
#here starts rawmesh
mesh_start = file.tell()
file.write(b'\x01\x00\x00\x00') # raw mesh version
file.write(b'\x00\x00\x00\x00') # raw mesh lic version
# further analysis revealed:
# this loops are per triangle
write_array_data(file, 'I', self.tris_material_slot)
write_array_data(file, 'I', self.tris_smoothing_group)
# per vertex
write_array_data(file, 'fff', self.vertices) # VertexPositions
# b2 = write_array_data(file, 'fff', self.test)
# print(self.vertices)
# print(self.test)
# print(b1[0:10])
# print(b2[0:10])
# per vertexloop
write_array_data(file, 'I', self.triangles) # WedgeIndices
write_null(file, 4) # WedgeTangentX
write_null(file, 4) # WedgeTangentY
write_array_data(file, 'fff', self.vertex_normals) # WedgeTangentZ
num_uvs = len(self.uvs)
for idx in range(num_uvs):
write_array_data(file, 'ff', self.uvs[idx]) # WedgeTexCoords[0]
num_empty_uvs = 8 - num_uvs
write_null(file, 4 * num_empty_uvs) # WedgeTexCoords[n..7]
write_array_data(file, 'BBBB', self.vertex_colors) # WedgeColors
# b2 = write_array_data(file, 'BBBB', self.test) # WedgeTexCoords[0]
# print("old and new are same? {}".format(b1 == b2))
# print(b2[4:24])
# print(self.vertex_colors.tobytes()[:20])
# print(self.vertex_colors[:20])
# print(self.test[:20])
write_null(file, 4) # MaterialIndexToImportIndex
#here ends rawmesh
mesh_end = file.tell()
write_null(file, 16)
write_null(file, 4)
file_end = file.tell()
mesh_size = mesh_end-mesh_start
file.seek(size_loc)
write_data(file, 'II', mesh_size, mesh_size)
file.seek(0)
write_data(file, 'II', 1, file_end - file_start)
Hex Editor
一款不错的二进制文件分析Vscode
插件。
如下图所示:标记的是存储文件大小的位置,文件大小为32K左右。