Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

signedDistanceMap3D

Almacenar la distancia firmada en una región 3D de tamaño variable

Desde R2024b

    Descripción

    El objeto signedDistanceMap3D crea y almacena un campo de distancia firmado en 3D truncado sobre un espacio en 3D voxelizado.

    Creación

    Descripción

    SDF = signedDistanceMap3D crea un campo de distancia firmado en 3D vacío con resolución predeterminada y configuraciones de transmisión de rayos.

    SDF = signedDistanceMap3D(Name=Value) establece propiedades utilizando uno o más argumentos de nombre-valor. Por ejemplo, Resolution=2 establece la resolución de la cuadrícula del campo de distancia con signo 3-D en 2 celdas por metro.

    ejemplo

    Propiedades

    expandir todo

    Esta propiedad o parámetro es de solo lectura.

    Resolución de cuadrícula, especificada como un escalar numérico positivo. Las unidades están en celdas por metro.

    Puede configurar esta propiedad durante la creación del objeto.

    Esta propiedad o parámetro es de solo lectura.

    Tipo de Raycasting para actualizaciones de valores de distancia de vóxel, especificado como 0 (false) o 1 (true):

    • true — La función insertPointCloud actualiza todos los vóxeles a lo largo del rayo en el rango [RayOrigin, RayEnd+TruncationDistance]. Los valores de distancia que calcula la función dependen del segmento del rango en el que se encuentra el vóxel:

      • [RayOrigin, RayEnd-TruncationDistance] — El valor de la distancia es TruncationDistance.

      • [RayEnd-TruncationDistance, RayEnd] — Los valores de distancia comienzan desde TruncationDistance a las RayEnd-TruncationDistance y disminuyen a 0 a las RayEnd.

      • [RayEnd, RayEnd+TruncationDistance] — Los valores de distancia comienzan desde 0 a las RayEnd y disminuyen a -TruncationDistance a las RayEnd+TruncationDistance.

    • false — La función de objeto insertPointCloud actualiza solo los vóxeles a lo largo del rayo en el rango [RayEnd-TruncationDistance, RayEnd+TruncationDistance]. Los valores de distancia que asigna la función dependen de en qué segmento del rango se encuentra el vóxel:

      • [RayEnd-TruncationDistance, RayEnd] — Los valores de distancia comienzan desde TruncationDistance a las RayEnd-TruncationDistance y disminuyen a 0 a las RayEnd.

      • [RayEnd, RayEnd+TruncationDistance] — Los valores de distancia comienzan desde 0 a las RayEnd y disminuyen a -TruncationDistance a las RayEnd+TruncationDistance.

      La función ignora los vóxeles en el rango [RayOrigin, RayEnd-TruncationDistance].

    Nota

    Los vóxeles conservan el valor de distancia más bajo que han observado. Si ya se ha visitado un vóxel, su valor de distancia se promedia con el nuevo valor de distancia. Si el vóxel no ha sido visitado antes, se sobrescribe el valor predeterminado.

    Puede configurar esta propiedad durante la creación del objeto.

    Esta propiedad o parámetro es de solo lectura.

    Distancia máxima desde el límite ocupado, especificada como un escalar numérico mayor o igual a 3/Resolution. Las unidades se establecen en metros.

    La distancia de truncamiento predeterminada garantiza que la región del campo de distancia con signo truncado (TSDF) se extienda al menos tres vóxeles desde cada lado del límite ocupado.

    TruncationDistance también es el valor de distancia predeterminado asignado a cada vóxel hasta que el rayo insertado cambia el valor del vóxel.

    Al insertar rayos, el mapa ignora los valores de distancia de vóxel que exceden TruncationDistance positivos.

    Puede configurar esta propiedad durante la creación del objeto.

    Esta propiedad o parámetro es de solo lectura.

    Número de vóxeles activos en el mapa, almacenado como un entero positivo.

    Esta propiedad o parámetro es de solo lectura.

    Límites del mapa que contiene todos los vóxeles activos, almacenados como una matriz de 2 por 3. La primera fila representa los límites mínimos x, y y z. La segunda fila representa los límites máximos x, y y z.

    MapLimits representa el cuadro delimitador que encierra todos los vóxeles activos actuales en el mapa. Los límites del mapa cambian a medida que cambian los vóxeles.

    Funciones del objeto

    distanceEncuentre la distancia al conjunto de nivel cero para los puntos de consulta
    activeVoxelsInformación sobre vóxeles activos
    gradientEncuentre el gradiente para los puntos de consulta en un mapa de distancias con signo 3D
    insertPointCloudInsertar datos de nube de puntos en un mapa de distancias con signo 3D
    meshGenerar malla de isosuperficie a partir de vóxeles activos
    showMostrar mapa de distancias firmadas en 3D

    Ejemplos

    contraer todo

    Lea y grafique los datos de triangulación del STL de membrana L. Puedes usar esto para comparar con el mapa de distancia firmado.

    triL = stlread("L-Membrane.stl");
    trisurf(triL)
    title("L-Membrane STL")
    [az,el] = view;
    axis equal

    Figure contains an axes object. The axes object with title L-Membrane STL contains an object of type patch.

    Cree un campo de distancia firmado 3-D vacío (SDF) y cargue los datos de la nube de puntos para la membrana L desde un archivo MAT. El archivo MAT contiene datos de la nube de puntos y el origen del sensor asociado con cada dato de la nube de puntos.

    sdm3D = signedDistanceMap3D(Resolution=50);
    load LMembranePC.mat

    Inserte cada nube de puntos en el campo de distancia firmado y muestre la SDF 3-D actualizada.

    for i = 1:size(ptcloud,1)
        insertPointCloud(sdm3D,origin(i,:),ptcloud{i});
        show(sdm3D,Colorbar="on");
        view(az,el)
        axis equal
        drawnow
        pause(.25)
    end
    title(["3-D SDF of L-Membrane"])

    Figure contains an axes object. The axes object with title 3-D SDF of L-Membrane contains an object of type scatter.

    Obtenga todos los vóxeles activos en el SDF 3-D.

    vox = activeVoxels(sdm3D)
    vox = struct with fields:
               ID: 1
          Centers: [49889×3 double]
        Distances: [49889×1 double]
            Sizes: [49889×1 double]
    
    

    Para fines demostrativos, utilice un desplazamiento xyz aleatorio desde los centros de los vóxeles de los primeros tres vóxeles como puntos de consulta. Luego obtenga la distancia y la pendiente utilizando esos puntos de consulta.

    querypts = vox.Centers(1:3,:) + 0.1*rand(3,3);
    d = distance(sdm3D,querypts)
    d = 3×1
    
        0.0379
       -0.0447
        0.0600
    
    
    g = gradient(sdm3D,querypts)
    g = 3×3
    
        0.1924    1.5773   -1.4002
        0.1689    1.6524   -0.8267
       -0.0715   -0.2335    0.3677
    
    

    Genere una malla a partir del campo de distancia firmado en 3D.

    [vertices,faces] = mesh(sdm3D)
    vertices = 18860×3
    
       -0.0100    0.0068    0.1500
       -0.0300    0.0059    0.1500
       -0.0100    0.0100    0.1610
       -0.0300    0.0100    0.1565
        0.0100    0.0047    0.1500
       -0.0100   -0.0100    0.1409
        0.0100   -0.0100    0.1421
        0.0100    0.0025    0.1700
       -0.0010    0.0100    0.1700
        0.0100    0.0094    0.1900
        0.0089    0.0100    0.1900
        0.0100    0.0100    0.1909
       -0.0100    0.0187    0.1700
       -0.0300    0.0259    0.1700
       -0.0100    0.0552    0.1500
          ⋮
    
    
    faces = 37094×3
    
         2     1     3
         4     2     3
         7     1     6
         5     1     7
         9     3     1
         9     1     8
         8     1     5
         8    10    11
         9     8    11
        10    12    11
         3    14     4
        13    14     3
        15    16    17
        16    18    17
         9    13     3
          ⋮
    
    

    Visualizar los datos de la malla.

    meshTri = triangulation(faces,vertices);
    trisurf(meshTri)
    axis equal
    title("Mesh from 3-D SDF")

    Figure contains an axes object. The axes object with title Mesh from 3-D SDF contains an object of type patch.

    Si es necesario, puede utilizar estos datos de malla para crear una malla de colisión utilizando V-HACD. Consulte collisionVHACD (Robotics System Toolbox) para obtener más información.

    Referencias

    [1] Lorensen, William E., and Harvey E. Cline. “Marching Cubes: A High Resolution 3D Surface Construction Algorithm.” ACM SIGGRAPH Computer Graphics, vol. 21, no. 4, Aug. 1987, pp. 163–69. DOI.org (Crossref), https://doi.org/10.1145/37402.37422.

    [2] Museth, Ken. “VDB: High-Resolution Sparse Volumes with Dynamic Topology.” ACM Transactions on Graphics, vol. 32, no. 3, June 2013, pp. 1–22. DOI.org (Crossref), https://doi.org/10.1145/2487228.2487235.

    Capacidades ampliadas

    expandir todo

    Generación de código C/C++
    Genere código C y C++ mediante MATLAB® Coder™.

    Historial de versiones

    Introducido en R2024b

    Consulte también

    |