如何无需额外顶点面数据将OBJ转FBX并以点云展示?
实现FBX点云展示的解决方案
核心思路
要摆脱外部面数据依赖、实现FBX点云展示,关键是直接基于3D面部坐标构建仅包含顶点的FBX场景,不添加任何多边形面数据,避免转换过程中默认生成网格结构。
具体实现方案
方案1:调整OBJ导出逻辑(保留OBJ源文件)
先确保你的OBJ文件仅包含顶点行(以v开头),无任何面数据行(以f开头)。之后用Assimp(即你代码中的a3d)读取并修改网格渲染模式:
import a3d import os obj_file_path = "你的面部点云.obj" zipped_fbx_dir = "输出目录" filename = os.path.basename(obj_file_path) # 读取仅含顶点的OBJ文件 scene = a3d.Scene.from_file(obj_file_path) # 将所有网格设置为点云渲染模式 for mesh in scene.meshes: mesh.primitive_type = a3d.PrimitiveType.POINTS # 导出FBX fbx_file_path = os.path.join(zipped_fbx_dir, f"{os.path.splitext(filename)[0]}.fbx") scene.save(fbx_file_path)
方案2:直接用坐标生成FBX(完全摆脱OBJ依赖)
如果已有原始3D面部坐标数组,无需依赖OBJ文件,可直接通过FBX SDK构建点云:
from fbx import * import os # 初始化FBX SDK环境 manager = FbxManager.Create() scene = FbxScene.Create(manager, "FacePointCloudScene") # 创建点云对象 point_cloud = FbxPointCloud.Create(scene, "FacePoints") # 替换为你的3D面部坐标数组,格式为[[x1,y1,z1], [x2,y2,z2], ...] face_points = [] point_cloud.Init(len(face_points)) # 逐个设置点坐标 for idx, (x, y, z) in enumerate(face_points): point_cloud.SetPoint(idx, FbxVector4(x, y, z)) # 将点云添加到场景节点 node = FbxNode.Create(scene, "FacePointCloudNode") node.SetNodeAttribute(point_cloud) scene.GetRootNode().AddChild(node) # 导出FBX文件 fbx_file_path = os.path.join("输出目录", "面部点云.fbx") exporter = FbxExporter.Create(manager, "") if exporter.Initialize(fbx_file_path, -1, manager.GetIOSettings()): exporter.Export(scene) # 清理资源 exporter.Destroy() manager.Destroy()
注意事项
- 方案1必须保证OBJ文件无任何面数据,否则Assimp仍会按多边形网格处理。
- 导出的FBX文件在查看时,需手动将软件(如Blender、Maya)的渲染模式切换为点云,部分软件默认会按网格显示。
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

