Как добавить текстуру к сетке в Python Open3d?

Я работаю с треугольными сетками с помощью python Open3d, и я хочу добавить отображение текстуры в свою сетку (я не нашел его в документации), это пример кода с простой сеткой куба:

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.open3d_pybind.utility.Vector3dVector(vert),
                            o3d.open3d_pybind.utility.Vector3iVector(faces))

m.compute_vertex_normals()
o3d.visualization.draw_geometries([m])

Я вижу куб: кубическая сетка

Теперь пытаюсь добавить текстуру:

text=cv2.imread('~/Downloads/cupe_uv.png')
plt.imshow(text)

это изображение текстуры: изображение текстуры куба

DX,DY=0.5/2,0.66/2
v_uv=[[DX,DY],[DX,2*DY],[2*DX,2*DY],[2*DX,DY],
      [0,DX],[DX,1],[3*DX,2*DY],[3*DX,DY]]

v_uv=np.asarray(v_uv)
v_uv=np.concatenate((v_uv,v_uv,v_uv),axis=0)
m.triangle_uvs = o3d.open3d_pybind.utility.Vector2dVector(v_uv)

m.textures=[o3d.geometry.Image(text)]

o3d.visualization.draw_geometries([m])

Я знаю, что не устанавливал uv-координаты для отображения всех цветов куба (но некоторые цвета должны быть там...). В любом случае сетка все еще без текстуры (такая же, как и в начале).

3 ответа

mesh.triangle_uvs это массив формы (3 * num_triangles, 2)не (3 * num_vertices, 2).

Попробуй это:

v_uv = np.random.rand(len(faces) * 3, 2)
m.triangle_uvs = o3d.open3d_pybind.utility.Vector2dVector(v_uv)

Кстати, похоже, что ваша версия Open3D довольно старая.
Open3d 0.10.0 уже вышла, и добавлено много новых функций.
Вы можете попробовать новую версию:)

как сказал Цзин Чжао в /questions/54018959/kak-dobavit-teksturu-k-setke-v-python-open3d/54018969#54018969

      v_uv = np.random.rand(len(faces) * 3, 2) m.triangle_uvs =
o3d.open3d_pybind.utility.Vector2dVector(v_uv)

буду работать. Для Open3d версии 0.10.0, material_ids, похоже, не установлены.

      m.triangle_material_ids = o3d.utility.IntVector([0]*len(faces))

исправляет это, так что текстурированный куб можно визуализировать без сбоев

Этот пример может помочь:

      import cv2
import numpy as np
import open3d as o3d

# Define the vertices and faces for a square mesh
vertices = np.array([
    [-0.5, -0.5, 0],
    [0.5, -0.5, 0],
    [0.5, 0.5, 0],
    [-0.5, 0.5, 0],
])

faces = np.array([
    [0, 1, 2],
    [0, 2, 3],
])

# load the texture image
path_to_image = "data/some_image.png"
img = cv2.cvtColor(cv2.imread(path_to_image), cv2.COLOR_BGR2RGB)

# create the uv coordinates
v_uv = np.array([[0, 1], [1, 1], [1, 0], 
                 [0, 1], [1, 0], [0, 0]])

# assign the texture to the mesh
mesh = o3d.geometry.TriangleMesh(o3d.utility.Vector3dVector(vertices), o3d.utility.Vector3iVector(faces))
mesh.textures = [o3d.geometry.Image(img)]
mesh.triangle_uvs = o3d.utility.Vector2dVector(v_uv)
mesh.triangle_material_ids = o3d.utility.IntVector([0] * len(faces))

o3d.visualization.draw_geometries([mesh])

 
Другие вопросы по тегам