LiDAR y RealityKit: captura una textura del mundo real para un modelo escaneado
Tarea
Me gustaría crear capture
una 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 environmentTexturing
datos recopilados como cube-map
textura en una escena.
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?
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 API
necesita macOS 12+ y Xcode 13+.
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.
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 ARMeshManager
script. 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 Coordinates
Como puede ver en la imagen , existen características como Color
y Mesh Density
.
Si alguien tiene información más detallada sobre cómo se debe configurar o programar esto en Unity, publíquelo en este hilo.