我有一个 3D 模型 (.obj) 纹理,可以在其他软件中正确加载:
这是我正在使用的代码:
import open3d as o3d
def visualize(mesh):
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(mesh)
vis.run()
vis.destroy_window()
def main():
mesh = o3d.io.read_triangle_mesh("scene_mesh_decimated_textured.obj")
visualize(mesh)
main()
这是模型和纹理: https://www.dropbox.com/s/xm0sun3hoijwbjf/Archive.zip?dl=0
你的代码看起来没有问题。问题很可能是由于Open3D加载.mtl文件的方式造成的。.mtl文件包含了材质和纹理信息,Open3D可能无法正确解析它。
你可以尝试以下几种解决方案:
1. 使用Trimesh加载模型和纹理:
Trimesh是一个用于加载和处理三角形网格的Python库,它可以正确地处理.mtl文件。你可以使用Trimesh加载模型和纹理,然后将其转换为Open3D对象。
import trimesh
import open3d as o3d
def visualize(mesh):
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(mesh)
vis.run()
vis.destroy_window()
def main():
# 使用trimesh加载模型和纹理
mesh = trimesh.load("scene_mesh_decimated_textured.obj")
# 将trimesh mesh转换为open3d mesh
o3d_mesh = o3d.geometry.TriangleMesh()
o3d_mesh.vertices = o3d.utility.Vector3dVector(mesh.vertices)
o3d_mesh.triangles = o3d.utility.Vector3iVector(mesh.faces)
o3d_mesh.compute_vertex_normals()
# 如果模型有纹理,设置纹理坐标和纹理图片
if mesh.visual.kind == 'texture':
o3d_mesh.triangle_uvs = o3d.utility.Vector2dVector(mesh.visual.uv)
o3d_mesh.textures = [o3d.geometry.Image(mesh.visual.material.baseColor)]
visualize(o3d_mesh)
main()
2. 手动加载纹理:
如果你的模型只有一个纹理,你可以尝试手动加载纹理并将其应用于Open3D网格。
import open3d as o3d
def visualize(mesh):
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(mesh)
vis.run()
vis.destroy_window()
def main():
mesh = o3d.io.read_triangle_mesh("scene_mesh_decimated_textured.obj")
# 加载纹理图片
texture = o3d.io.read_image("texture.jpg") # 将texture.jpg替换为你的纹理文件名
# 创建材质并设置纹理
mat = o3d.visualization.Material()
mat.texture_map = texture
# 将材质应用于网格
mesh.material = mat
visualize(mesh)
main()
3. 使用其他3D模型加载库:
如果以上方法都无法解决问题,你可以尝试使用其他3D模型加载库,例如PyMeshLab或PyAssimp。这些库可能提供更强大的.mtl文件解析功能。
请注意,以上解决方案需要根据你的具体情况进行调整。你需要根据你的模型文件和纹理文件修改代码。
标签:python,3d-model,open3d From: 60104854