You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的背面剔除,让网格看起来“消失”。

解决办法

  1. 转换OBJ面格式

    • 改成仅使用顶点索引的格式(参考你提供的正常OBJ),删除所有法线信息,或用MeshLab重新导出时选择“不包含法线”。
    • 若需保留法线,补充占位纹理坐标(比如添加多行vt 0 0),将面格式改为顶点索引/纹理索引/法线索引的完整形式(如f 1/1/1 2/1/1 3/1/1)。
  2. 修正顶点环绕顺序

    • 在MeshLab中打开round.obj,使用Filters > Normals, Curvatures and Orientation > Reorient All Faces Consistentely工具,统一面的环绕顺序,确保与法线方向一致后重新导出。
  3. 调整Drake加载参数

    • 若坚持保留原有格式,可尝试创建Mesh对象时设置preserve_vertex_order=True(部分Drake版本支持该参数),或检查是否有禁用背面剔除的可视化选项。

内容的提问来源于stack exchange,提问作者user224269

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:17:04