LiDAR y RealityKit: captura una textura del mundo real para un modelo escaneado

Resuelto Andy Jazz asked hace 4 años • 2 respuestas

Tarea

Me gustaría crear captureuna textura del mundo real y aplicarla a una malla reconstruida producida con la ayuda de un escáner LiDAR. Supongo que para eso deberían usarse matrices Proyección-Vista-Modelo. Una textura debe crearse desde un punto de vista fijo, por ejemplo, desde el centro de una habitación. Sin embargo, sería una solución ideal si pudiéramos aplicar environmentTexturingdatos recopilados como cube-maptextura en una escena.

ingrese la descripción de la imagen aquí

Mire la aplicación de escáner 3D . Es una aplicación de referencia que nos permite exportar un modelo con su textura.

Necesito capturar una textura con una iteración. No necesito actualizarlo en tiempo real. Me doy cuenta de que cambiar el punto de vista conduce a una percepción incorrecta de la textura, en otras palabras, a una distorsión de la textura. También me doy cuenta de que hay una teselación dinámica en RealityKit y hay un mapeo automático de texturas (la resolución de la textura depende de la distancia desde la que se capturó).

import RealityKit
import ARKit
import Metal
import ModelIO

class ViewController: UIViewController, ARSessionDelegate {
    
    @IBOutlet var arView: ARView!

    override func viewDidLoad() {
        super.viewDidLoad()

        arView.session.delegate = self
        arView.debugOptions.insert(.showSceneUnderstanding)

        let config = ARWorldTrackingConfiguration()
        config.sceneReconstruction = .mesh
        config.environmentTexturing = .automatic
        arView.session.run(config)
    }
}

Pregunta

  • ¿Cómo capturar y aplicar una textura del mundo real a una malla 3D reconstruida?


Andy Jazz avatar Sep 08 '20 19:09 Andy Jazz
Aceptado

Reconstrucción de objetos

El 10 de octubre de 2023, Apple lanzó la aplicación iOS Reality Composer 1.6 que es capaz de capturar la malla de un modelo del mundo real con textura en tiempo real mediante el proceso de escaneo LiDAR. Pero por el momento todavía no existe una API programática nativa para eso (pero todos la estamos esperando con ansias).

Además, existe una metodología que permite a los desarrolladores crear modelos texturizados a partir de series de tomas.

Fotogrametría

Object Capture API , anunciada en la WWDC 2021, proporciona a los desarrolladores la herramienta tan esperada photogrammetry. En la salida obtenemos el modelo USDZ con textura de alta resolución con mapeo UV. Para implementarlo Object Capture APInecesita macOS 12+ y Xcode 13+.

ingrese la descripción de la imagen aquí

Para crear un modelo USDZ a partir de una serie de tomas, envíe todas las imágenes tomadas a RealityKit PhotogrammetrySession.

Aquí hay un fragmento de código que arroja luz sobre este proceso:

import RealityKit
import Combine

let pathToImages = URL(fileURLWithPath: "/path/to/my/images/")

let url = URL(fileURLWithPath: "model.usdz")

var request = PhotogrammetrySession.Request.modelFile(url: url, 
                                                   detail: .medium)

var configuration = PhotogrammetrySession.Configuration()
configuration.sampleOverlap = .normal
configuration.sampleOrdering = .unordered
configuration.featureSensitivity = .normal
configuration.isObjectMaskingEnabled = false

guard let session = try PhotogrammetrySession(input: pathToImages, 
                                      configuration: configuration)
else { return 
} 

var subscriptions = Set<AnyCancellable>()

session.output.receive(on: DispatchQueue.global())
              .sink(receiveCompletion: { _ in
                  // errors
              }, receiveValue: { _ in
                  // output
              }) 
              .store(in: &subscriptions)

session.process(requests: [request])

Puede reconstruir modelos USD y OBJ con sus correspondientes texturas mapeadas por UV.

Andy Jazz avatar Oct 02 '2020 09:10 Andy Jazz

Cómo se puede hacer en Unity

Me gustaría compartir información interesante sobre el trabajo de la Fundación AR de Unity con una malla procedente de LiDAR. En este momento – 01 de noviembre de 2020 – hay una situación absurda. Está asociado con el hecho de que los desarrolladores nativos de ARKit no pueden capturar la textura de un objeto escaneado usando herramientas estándar de RealityKit de alto nivel; sin embargo, los usuarios de AR Foundation de Unity (que crean aplicaciones ARKit) pueden hacerlo usando el ARMeshManagerscript. No sé si este script fue desarrollado por el equipo de AR Foundation o simplemente por desarrolladores de una pequeña startup creativa (y luego comprado), pero el hecho es que sigue siendo cierto.

Para usar ARKit en malla con AR Foundation, solo necesita agregar el componente ARMeshManager a su escena. Texture CoordinatesComo puede ver en la imagen , existen características como Colory Mesh Density.

ingrese la descripción de la imagen aquí

Si alguien tiene información más detallada sobre cómo se debe configurar o programar esto en Unity, publíquelo en este hilo.

Andy Jazz avatar Oct 31 '2020 20:10 Andy Jazz