es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

LiDAR | Swift | Cómo exportar un modelo 3D con textura real utilizando el escáner LiDAR

¿Cómo exportar el mismo modelo con una textura del mundo real?

Hemos utilizado muchas demostraciones y combinaciones lógicas para exportar un modelo 3D (usdz) con una textura real. Sin embargo, solo hemos tenido éxito al exportar un modelo en blanco (blanco/gris).

Hemos utilizado el siguiente código para exportar el modelo 3D.

“`
func exportarModelo() {
   guard let camera = sceneView.session.currentFrame?.camera else {return}

func convertirAActivo(meshAnchors: [ARMeshAnchor]) -> MDLAsset? {

<pre><code> guard let dispositivo = MTLCreateSystemDefaultDevice() else {return nil}

let activo = MDLAsset()

guard let frame = sceneView.session.currentFrame else { return nil }
guard let imagenDeLaCámara = capturarCámara() else { return nil }

for anchor in meshAnchors {

// El código comentado a continuación ayuda a mostrar un modelo previo en sceneView
</code></pre>

//                guardemos let node = sceneView.node(for: anchor) else { continue }
//                let geometry = scanGeometory(frame: frame, anchor: anchor, node: node, needTexture: true, cameraImage: cameraImage)
//                node.geometry = geometry

<pre><code> let mdlMesh = anchor.geometry.toMDLMesh(device: dispositivo, camera: camera, modelMatrix: anchor.transform)
activo.add(mdlMesh)
}

return activo
}
func exportar(activo: MDLAsset) throws -> URL {
let directorio = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let url = directorio.appendingPathComponent("escaneado.usdc")

try asset.export(to: url)

return url
}
func compartir(url: URL) {
let vc = UIActivityViewController(activityItems: [url],applicationActivities: nil)
// vc.popoverPresentationController?.sourceView = sender
self.present(vc, animated: true, completion: nil)
}
if let meshAnchors = sceneView.session.currentFrame?.anchors.compactMap({ $0 as? ARMeshAnchor }),
let asset = convertirAActivo(meshAnchors: meshAnchors) {
do {
let url = try exportar(activo: asset)
compartir(url: url)
} catch {
print("error de exportación")
}
}
}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para exportar un modelo 3D con textura del mundo real, debes asegurarte de que la imagen de textura se capture y aplique correctamente al modelo. Una forma de lograr esto es utilizar la funcionalidad de captura de cámara de ARKit para capturar la vista de la cámara actual y aplicarla a los materiales del modelo.

    1. Primero, asegúrate de que la función de captura de cámara esté funcionando correctamente y esté devolviendo una imagen capturada. Puedes utilizar la función captureCamera() en el código proporcionado para obtener la imagen de la cámara.
    2. A continuación, debes aplicar la imagen capturada a los materiales del modelo. Puedes hacer esto proporcionando la imagen capturada como una textura al material. Por ejemplo, si tienes un material llamado myMaterial, puedes aplicar la textura de la siguiente manera:

    let texture = MDLTexture(data: cameraImage.pngData()!, topLeftOrigin: .zero, mipMapLevel: 0)
    myMaterial.setProperty(texture, forKey: .baseColor)
    

    En este código, primero creamos un objeto MDLTexture a partir de la imagen de la cámara capturada. Luego, establecemos esta textura como el color base del material utilizando la función setProperty.

    1. Por último, asegúrate de que los materiales del modelo hagan referencia a la textura correcta. Puedes hacer esto estableciendo el nombre de la textura para que coincida con la propiedad de textura difusa del material. Por ejemplo, si tu material tiene una propiedad de textura difusa llamada myTexture, puedes establecer el nombre de la textura de la siguiente manera:
    texture.name = "myTexture"
    

    Con estos cambios aplicados, el modelo exportado en formato usdz ahora debería tener la textura del mundo real aplicada.

Comments are closed.