def add_points_as_object_with_particle_system(
    points,
    reconstruction_collection,
    mesh_type="CUBE",
    point_extent=0.01,
    add_particle_color_emission=True,
    particle_overwrite_color=None,
    op=None,
):
    """Add a point cloud as particle system."""
    log_report("INFO", "Adding Points as Particle System: ...", op)
    stop_watch = StopWatch()

    # The particle systems in Blender do not work for large particle numbers
    # (see https://developer.blender.org/T81103). Thus, we represent large
    # point clouds with multiple smaller particle systems.
    max_number_particles = 10000

    particle_system_collection = add_collection("Particle System",
                                                reconstruction_collection)

    point_cloud_obj_list = []
    for i in range(0, len(points), max_number_particles):

        particle_obj_name = f"Particle Shape {i}"
        particle_material_name = f"Point Cloud Material {i}"
        point_cloud_obj_name = f"Particle Point Cloud {i}"

        points_subset = points[i:i + max_number_particles]
        coords, colors = Point.split_points(points_subset,
                                            normalize_colors=True)

        particle_obj = _add_particle_obj(
            colors,
            particle_obj_name,
            particle_material_name,
            particle_overwrite_color,
            add_particle_color_emission,
            mesh_type,
            point_extent,
            particle_system_collection,
        )
        point_cloud_obj = _add_particle_system_obj(
            coords,
            particle_obj,
            point_cloud_obj_name,
            particle_system_collection,
        )
        point_cloud_obj_list.append(point_cloud_obj)

    bpy.context.view_layer.update()

    log_report("INFO", "Duration: " + str(stop_watch.get_elapsed_time()), op)
    log_report("INFO", "Adding Points as Particle System: Done", op)
    return point_cloud_obj_list
Esempio n. 2
0
def draw_points(
    points,
    add_points_to_point_cloud_handle,
    reconstruction_collection=None,
    object_anchor_handle_name="OpenGL Point Cloud",
    op=None,
):
    """Draw points using OpenGL."""
    log_report("INFO", "Add particle draw handlers", op)

    coords, colors = Point.split_points(points, normalize_colors=True)
    object_anchor_handle = _draw_coords_with_color(
        coords,
        colors,
        add_points_to_point_cloud_handle,
        reconstruction_collection,
        object_anchor_handle_name,
        op=op,
    )
    return object_anchor_handle
Esempio n. 3
0
def draw_points(
    op,
    points,
    add_points_to_point_cloud_handle,
    reconstruction_collection=None,
    object_anchor_handle_name="OpenGL Point Cloud",
):

    log_report("INFO", "Add particle draw handlers", op)

    coords, colors = Point.split_points(points)
    object_anchor_handle = draw_coords_with_color(
        op,
        coords,
        colors,
        add_points_to_point_cloud_handle,
        reconstruction_collection,
        object_anchor_handle_name,
    )
    return object_anchor_handle
Esempio n. 4
0
def add_points_as_mesh_vertices(
    points,
    reconstruction_collection,
    add_color_as_custom_property=True,
    op=None,
):
    """Add a point cloud as mesh."""
    log_report("INFO", "Adding Points as Mesh: ...", op)
    stop_watch = StopWatch()
    point_cloud_obj_name = "Mesh Point Cloud"
    point_cloud_mesh = bpy.data.meshes.new(point_cloud_obj_name)
    point_cloud_mesh.update()
    point_cloud_mesh.validate()
    coords, colors = Point.split_points(points, normalize_colors=False)
    point_cloud_mesh.from_pydata(coords, [], [])
    point_cloud_obj = add_obj(point_cloud_mesh, point_cloud_obj_name,
                              reconstruction_collection)
    if add_color_as_custom_property:
        point_cloud_obj["colors"] = colors

    log_report("INFO", "Duration: " + str(stop_watch.get_elapsed_time()), op)
    log_report("INFO", "Adding Points as Mesh: Done", op)
    return point_cloud_obj