UE4 Datasmith UdsMesh 格式解析

UE4 Datasmith UdsMesh 格式解析

Datasmith导出插件将几何模型导出为*.udsmesh格式的文件。*.udsmesh文件中存储了构建FRawMesh的相关信息。

UdsMesh

包含文件头+ FRawMesh相关信息。
基本结构:内容长度+内容的形式。
1
具体解析过程可参考:
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左右。
1

参考

  1. UE4 Datasmith 格式简述
  2. UE4 Datasimth UdsMesh 格式解析
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值