LiDAR和RealityKit –捕获扫描模型的真实纹理

如何解决LiDAR和RealityKit –捕获扫描模型的真实纹理

任务

我要 capture 真实世界的纹理,并将其应用于借助LiDAR扫描仪生成的3D网格。我想应该使用Projection-View-Model矩阵。必须从固定的视点(例如从房间中心)制作纹理。但是,如果我们可以应用场景中以environmentTexturing纹理收集的cube-map数据,那将是一个理想的解决方案。

enter image description here

查看3D Scanner App。这是一个参考应用程序,允许我们导出带有纹理的模型。

我需要一次迭代捕获一个纹理。我不需要实时更新。我意识到改变PoV会导致错误的纹理感知,换句话说,会导致纹理变形。我还意识到RealityKit中存在动态镶嵌,并且存在自动纹理贴图(纹理的分辨率取决于其捕获的距离)。

import RealityKit
import ARKit
import MetalKit
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 = .manual
        arView.session.run(config)
    }
}

问题

  • 如何为重建的3D网格捕获和应用真实世界的纹理?


解决方法

这是一个初步的解决方案(不是最终解决方案):

import MetalKit
import ARKit

/*  Color model YCbCr  */
var capturedTextureChannelY: CVMetalTexture?      /*  Luma               */
var capturedTextureChannelCbCr: CVMetalTexture?   /*  Chroma difference  */

lazy var rgbUniforms: RGBUniforms = {
    var uniforms = RGBUniforms()
    uniforms.radius = rgbRadius
    uniforms.viewToCamera.copy(from: viewToCamera)
    uniforms.viewRatio = Float(viewportSize.width / viewportSize.height)
    return uniforms
}()

func updateTextures(frame: ARFrame) {
    let pixelBuffer = frame.capturedImage
    guard CVPixelBufferGetPlaneCount(pixelBuffer) >= 2 else { return }  
  
    capturedTextureChannelY = makeTexture(fromPixelBuffer: pixelBuffer,pixelFormat: .r8Unorm,planeIndex: 0)
    capturedTextureChannelCbCr = makeTexture(fromPixelBuffer: pixelBuffer,pixelFormat: .rg8Unorm,planeIndex: 1)
}

func makeTexture(fromPixelBuffer pixelBuffer: CVPixelBuffer,pixelFormat: MTLPixelFormat,planeIndex: Int) -> CVMetalTexture? {

    let width = CVPixelBufferGetWidthOfPlane(pixelBuffer,planeIndex)
    let height = CVPixelBufferGetHeightOfPlane(pixelBuffer,planeIndex)
    
    var texture: CVMetalTexture? = nil
    let status = CVMetalTextureCacheCreateTextureFromImage(nil,textureCache,pixelBuffer,nil,pixelFormat,width,height,planeIndex,&texture)
      
    if status != kCVReturnSuccess {
        texture = nil
    }
    return texture
}

func draw() {
    guard let currentFrame = session.currentFrame,let commandBuffer = commandQueue.makeCommandBuffer(),let renderDescriptor = renderDestination.currentRenderPassDescriptor,let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderDescriptor)
    else { return }

    self.updateTextures(frame: currentFrame)
    
    if rgbUniforms.radius > 0 {
        var retainingTextures = [capturedTextureChannelY,capturedTextureChannelCbCr]

        commandBuffer.addCompletedHandler { buffer in
            retainingTextures.removeAll()
        }

        renderEncoder.setFragmentTexture(CVMetalTextureGetTexture(capturedTextureChannelY!),index: Int(kTextureY.rawValue))
        renderEncoder.setFragmentTexture(CVMetalTextureGetTexture(capturedTextureChannelCbCr!),index: Int(kTextureCbCr.rawValue))
        renderEncoder.drawPrimitives(type: .triangleStrip,vertexStart: 0,vertexCount: 4)
    }
}

P.S。

我在Apple Developer Forum上找到了名为LiDAR equipped for 3D modelling的帖子。它说:

问题

Camera和LiDAR传感器可以一起工作以获得具有纹理的3D模型吗?

答案

是的(部分)可行。您可以将锚的任何几何体投影回相机图像中,以推断出纹理。但是,这需要多个观点和某种形式的高级逻辑,才能通过投影来决定将其应用于几何的哪一部分。

Frameworks工程师

,

如何在Unity中完成

我想与一些来自LiDAR的网格分享有关 Unity的AR Foundation 的有趣信息。目前-2020年11月1日-情况荒唐。这与以下事实有关:本机ARKit开发人员无法使用标准的高级RealityKit工具捕获扫描对象的纹理,但是Unity的AR Foundation用户(创建ARKit应用程序)可以使用ARMeshManager脚本执行此操作。我不知道此脚本是由AR Foundation团队开发的,还是仅由一家小型创意创业公司的开发人员开发(然后购买),但事实仍然存在。

要将ARKit网格与AR Foundation一起使用,只需将ARMeshManager组件添加到场景中。如您在图片上看到的,这些功能包括Texture CoordinatesColorMesh Density

enter image description here

如果有人对必须如何在Unity中配置或编写脚本有更详细的信息,请在此线程中发布有关此信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-