Drake可视化器中OBJ网格无法显示问题咨询
为何OBJ网格在Drake Visualizer中不可见?
我有一个OBJ网格文件round.obj,在MeshLab中可以正常显示,但在Drake Visualizer里完全不可见。我尝试过用凸形(convex shape)和网格形状(mesh shape)加载,怀疑Drake只接受不带法线的特定面格式?
有问题的round.obj文件内容:
v -0.0381 -0.0381 0.0762 v 0.0381 -0.0381 0.0762 v 0.0381 0.0381 0.0762 v -0.0381 0.0381 0.0762 v 0.0762 0.0762 0.0381 v -0.0762 0.0762 0.0381 v -0.0762 -0.0762 0.0381 v 0.0762 -0.0762 0.0381 v 0.0762 -0.0762 -0.0381 v 0.0762 0.0762 -0.0381 v -0.0762 -0.0762 -0.0381 v -0.0762 0.0762 -0.0381 v 0.0508 0.0508 -0.0762 v -0.0508 0.0508 -0.0762 v 0.0508 -0.0508 -0.0762 v -0.0508 -0.0508 -0.0762 vn 0 0 1 vn 0 0.707107 0.707107 vn -0.707107 0 0.707107 vn 0 -0.707107 0.707107 vn 0.707107 0 0.707107 vn 1 0 3.64246e-16 vn 0 -1 0 vn -1 0 0 vn 0 1 0 vn 0 0.83205 -0.5547 vn 0 0 -1 vn -0.83205 0 -0.5547 vn 0 -0.83205 -0.5547 vn 0.83205 0 -0.5547 f 1//1 2//1 3//1 f 3//1 4//1 1//1 f 5//2 6//2 4//2 f 4//2 3//2 5//2 f 6//3 7//3 1//3 f 1//3 4//3 6//3 f 7//4 8//4 2//4 f 2//4 1//4 7//4 f 5//5 3//5 2//5 f 2//5 8//5 5//5 f 5//6 8//6 9//6 f 9//6 10//6 5//6 f 8//7 7//7 11//7 f 11//7 9//7 8//7 f 7//8 6//8 12//8 f 12//8 11//8 7//8 f 6//9 5//9 10//9 f 10//9 12//9 6//9 f 12//10 10//10 13//10 f 13//10 14//10 12//10 f 14//11 13//11 15//11 f 15//11 16//11 14//11 f 11//12 12//12 14//12 f 14//12 16//12 11//12 f 9//13 11//13 16//13 f 16//13 15//13 9//13 f 10//14 9//14 15//14 f 15//14 13//14 10//14
加载网格的Python代码:
inertia = pydrake.multibody.tree.UnitInertia.SolidBox(1, 1, 1) mesh_shape = Mesh(str(ROOT_PATH / mesh_path_list[body_idx]), scale=scale_factors[body_idx]) name = f"polytope_{body_idx}" instance = self.plant.AddModelInstance(name) H = RigidTransform(RotationMatrix(np.eye(3)), np.zeros(3)) body = self.plant.AddRigidBody( name, instance, SpatialInertia(mass=mass, p_PScm_E=np.array([0., 0., 0.]), G_SP_E=inertia)) geom_id = self.plant.RegisterCollisionGeometry( body, H, cv_shape, name, pydrake.multibody.plant.CoulombFriction(mu, mu)) self.plant.RegisterVisualGeometry(body, H, mesh_shape, name, color)
可正常工作的OBJ文件示例:
v 0.03771961 -0.01979346 0.08371267 v 0.03771961 -0.01979346 -0.08371267 v 0.03771961 0.01979346 0.08371267 v 0.03771961 0.01979346 -0.08371267 v -0.03771961 -0.01979346 0.08371267 v -0.03771961 -0.01979346 -0.08371267 v -0.03771961 0.01979346 0.08371267 v -0.03771961 0.01979346 -0.08371267 f 1 3 7 f 5 1 7 f 6 1 5 f 6 2 1 f 5 7 6 f 6 7 8 f 4 3 1 f 1 2 4 f 4 7 3 f 8 7 4 f 2 6 4 f 4 6 8
问题原因与解决方法
核心问题
你的round.obj使用了顶点索引//法线索引的简化面格式(如f 1//1),这种省略纹理坐标的写法虽符合OBJ标准,但Drake的OBJ解析器对该格式兼容性不佳,导致网格无法正确加载渲染;此外,面的顶点环绕顺序与法线方向不匹配,也可能触发Drake Visualizer的背面剔除,让网格看起来“消失”。
解决办法
转换OBJ面格式
- 改成仅使用顶点索引的格式(参考你提供的正常OBJ),删除所有法线信息,或用MeshLab重新导出时选择“不包含法线”。
- 若需保留法线,补充占位纹理坐标(比如添加多行
vt 0 0),将面格式改为顶点索引/纹理索引/法线索引的完整形式(如f 1/1/1 2/1/1 3/1/1)。
修正顶点环绕顺序
- 在MeshLab中打开
round.obj,使用Filters > Normals, Curvatures and Orientation > Reorient All Faces Consistentely工具,统一面的环绕顺序,确保与法线方向一致后重新导出。
- 在MeshLab中打开
调整Drake加载参数
- 若坚持保留原有格式,可尝试创建
Mesh对象时设置preserve_vertex_order=True(部分Drake版本支持该参数),或检查是否有禁用背面剔除的可视化选项。
- 若坚持保留原有格式,可尝试创建
内容的提问来源于stack exchange,提问作者user224269
相关产品推荐
相关产品推荐

