Визуализация open3d: можем ли мы получить геометрические данные из визуализатора
Open3D (www.open3d.org) - отличная библиотека обработки 3D-данных, которая также обеспечивает функцию визуализации спуска.
Я пытаюсь создать визуализатор, который может выборочно отображать геометрические фигуры с помощью клавиатуры. Например, после того, как облака точек были показаны в окне, когда я нажимаю кнопку A, я хочу создать прямоугольник и поместить его в облака точек. Это несложно реализовать с помощью функции draw_gemetries_with_key_callbacks open3d. Например:
def custom_draw_geometry_with_key_callback(self, key_to_callback, *reshource):
obj_list = []
if reshource:
for obj in reshource:
obj.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
obj_list.append(obj)
def rotate_view(vis):
ctr = vis.get_view_control()
ctr.rotate(10.0, 0.0)
return False
def add_box(vis):
sphere = o3d.geometry.create_mesh_sphere(100)
vis.add_geometry(sphere)
return False
key_to_callback = {}
key_to_callback[ord("R")] = rotate_view
key_to_callback[ord("A")] = add_box
if reshource:
o3d.visualization.draw_geometries_with_key_callbacks(obj_list, key_to_callback)
В этом примере я добавляю сферу при нажатии кнопки A. Однако, если я хочу удалить это поле, например, с помощью кнопки D, для меня это очень сложно. Я попробовал два решения, но безуспешно:
Решение 1. Добавьте функцию обратного вызова с аргументами, например:
def delete_box(vis, box_obj):
vis.remove_geometry(box_obj)
Решение 2. Поскольку функция обратного вызова принимает только один аргумент, естественный способ получить объект, который я хочу удалить, - это получить геометрические данные из визуализатора. Но в визуализаторе нет функции, поддерживающей эту функциональность.