open3D工具包很好用,可是在我使用過程當中發現目前(0.12.0版本)中 o3d.io.read_triangle_mesh函數不能正常讀取.ply文件中的紋理及其對應座標,須要進行手動添加。python
import open3d as o3d mesh = o3d.io.read_triangle_mesh(file_path) mesh.compute_vertex_normals()
紋理圖片已知,用一句便可讀入:git
mesh.textures = [o3d.io.read_image(texture_path)]
紋理對應座標是一個(3*triangle_num, 2)的數組,能夠參考這篇帖子。我是使用另外一個包叫plyfile,讀.ply裏面的數據出來而後作處理的。將其賦值給mesh的trianlges_uvs屬性github
mesh.triangle_uvs = o3d.utility.Vector2dVector(uv)
本覺得這樣就完成了,可是在使用draw_geometries的時候並不能正確繪圖,報錯:數組
Process finished with exit code -1073741819 (0xC0000005)
後來在github和stack overflow裏面找了很久,終於被我找到了端倪,原來還要定義一個mesh的屬性,triangle_material_ids,緣由是在0.10.0版本以後每隔mesh能夠同時有多個紋理文件(這大概也是爲何前面在定義紋理圖片的時候是使用的list做爲輸入)。函數
既然知道了緣由就好辦了,總之就是要定義一下這個屬性,通過大膽猜想,應該就是全給個0(表示都用第一個紋理文件)就好了:工具
mesh.triangle_material_ids = o3d.utility.IntVector(np.zeros((len(mesh.triangles),)).astype(int))
o3d.visualization.draw_geometries([mesh])
總結一下,一個帶有紋理的mesh想要正確輸出,必須包含如下幾個屬性:spa
---------------------------------3d
最後放一段代碼,供參考(裏面的v_uv實在沒有耐心寫了,就寫了兩個面)code
import numpy as np import open3d as o3d vert=[[0,0,0],[0,1,0],[1,1,0],[1,0,0], [0,0,1],[0,1,1],[1,1,1],[1,0,1]] faces=[[0, 1, 2], [0, 2, 3], [6, 5, 4], [7, 6, 4], [5, 1, 0], [0, 4, 5], [3, 2, 6], [6, 7, 3], [0, 3, 7], [0, 7, 4], [1, 5, 6], [1, 6, 2]] m=o3d.geometry.TriangleMesh(o3d.utility.Vector3dVector(vert), o3d.utility.Vector3iVector(faces))
m.textures=[o3d.io.read_image('QwIKM.png')] DX,DY=0.5/2,0.66/2 v_uv=[[DX,DY],[DX,2*DY],[2*DX,2*DY], [DX,DY],[2*DX,2*DY],[2*DX,DY], [3*DX,2*DY],[4*DX,2*DY],[4*DX,DY], [3*DX,DY],[3*DX,2*DY],[4*DX,DY], [0,DX],[DX,1],[0,DX], [DX,1],[3*DX,2*DY],[3*DX,DY], [0,DX],[DX,1],[0,DX], [DX,1],[3*DX,2*DY],[3*DX,DY], [0,DX],[DX,1],[0,DX], [DX,1],[3*DX,2*DY],[3*DX,DY], [0,DX],[DX,1],[0,DX], [DX,1],[3*DX,2*DY],[3*DX,DY]] v_uv=np.asarray(v_uv) m.triangle_uvs = o3d.utility.Vector2dVector(v_uv)
m.triangle_material_ids = o3d.utility.IntVector(np.zeros((len(m.triangles),)).astype(int))
m.compute_vertex_normals() o3d.visualization.draw_geometries([m])