【iOS ARKit】光照估计

2024-01-30 21:52
文章标签 ios 估计 光照 arkit

本文主要是介绍【iOS ARKit】光照估计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

光照估计

        AR与VR 在光照上最大的不同在于VR 世界是纯数字世界,有一套完整的数学模型,而AR则是将计算机生成的虚拟物体或关于真实物体的非几何信息叠加到真实世界的场景之上实现对真实世界的增强,融合了真实世界与数字世界。就光照而言,VR中的光照完全由开发人员决定,光照效果是一致的,即不会受到运行时其他因素的影响,而AR 中则不得不考虑真实世界的光照与虚拟的3D光照信息的一致性,举个例子,假如在AR 3D应用中设置了一个模拟太阳的高亮度方向光,而用户是在晚上使用这个 AR应用,如果不考虑光照一致性,那么渲染出来的虚拟物体的光照与真实世界其他物体的光照反差将会非常明显,由于人眼对光照信息的高度敏感性,这种渲染可以说是完全失败的,完全没有沉浸感。在AR 中,由于用户与真实世界的联系并未被切断,光照的交互方式也要求更自然,如果真实世界的阴影向左而渲染出来的虚拟物体图影向右,这也是让人难以接受的,所以在 AR 中,必须要能达到虛拟光照与真实光照的一致,虚拟物体渲染出来的阴影应与真实环境中的阴影基本保持一致,这样才能提商虛拟物体的可信度和真实感。

ARKit 中的光照估汁

     ARKit 支持对用户所处环境光照信息的估计,在 ARConfiguration 类中定义了 isLightEstimationEnabled 布尔属性用于开启和关闭光照估计,该功能默认为启用状态。由于 ARConfiguration 是所有其他配置类的父类,因此 ARKit所有的配置类都支持光照估计功能。

     当设置 isLightEstimationEnabled 值为true 时,ARKit 每帧都会对从设备摄像头中采集的图像进行光照估计计算,并且将估计值保存在 frame. lightEstimate 属性中,frame. lightEstimate 是 ARLightEstimate类的实例,ARLightEstimate类只包含两个属性,

  1. 环境光强度值 (ambientIntensity) 取值范围[0,2000],在光照条件良好的环境中,该值约为1000,0表示环境非常黑暗,2000表示环境非常明亮
  2. 环境光温度值(ambientColorTemperature) 单位开尔文(K),纯白光次6500,低于该值表示环境更温暖,更偏向于黄光或者橘黄光,而高于该值表示环境更冷,更偏向于蓝光

     在 RealityKit 中,一般情况下开发人员无须关注 frame. lightEstimate 中的值,当设置 isLightEstimationEnabled值为 true 时,RealityKit 会自动使用环境光照估计值渲染虚拟元素的光照。但在使用自定义渲染时,开发人员必须自行处理光照估计。

    但在一些情况下,我们也可能需要实时获取当前环境光照估计值,如根据环境光照动态调整特效类型,下面演示如何启用光照估计并获取实时的光照估计值,如代码所示。

//
//  LightEstimate.swift
//  ARKitDeamo
//
//  Created by zhaoquan du on 2024/1/29.
//import SwiftUI
import ARKit
import RealityKit
import Combinestruct LightEstimate: View {@State var isFaceTracking = falsevar body: some View {LightEstimateContainer(isFaceTracking: isFaceTracking).overlay(content: {VStack{Spacer()Button {isFaceTracking.toggle()} label: {Text( !isFaceTracking ? "人脸追踪光照": "普通光照估计").frame(width:150,height:50).font(.system(size: 17)).foregroundColor(.black).background(Color.white).opacity(0.6)}.cornerRadius(10)Spacer().frame(height: 40)}}).edgesIgnoringSafeArea(.all).navigationTitle("光照估计")}
}struct LightEstimateContainer: UIViewRepresentable {var isFaceTracking: Bool = falseinit(isFaceTracking: Bool = false) {self.isFaceTracking = isFaceTracking}func makeUIView(context: Context) -> ARView {let arView = ARView(frame: .zero)return arView}func updateUIView(_ uiView: ARView, context: Context) {if isFaceTracking {let config = ARFaceTrackingConfiguration()config.isLightEstimationEnabled = trueuiView.session.delegate = context.coordinatorcontext.coordinator.times = 0uiView.session.run(config, options: [.resetTracking,.removeExistingAnchors])return}let config = ARWorldTrackingConfiguration()config.planeDetection = .horizontalconfig.isLightEstimationEnabled = truecontext.coordinator.arView = uiViewuiView.session.delegate = context.coordinatoruiView.session.run(config)}func makeCoordinator() -> Coordinator {Coordinator(parent: self)}class  Coordinator: NSObject,ARSessionDelegate {var arView:ARView? = nilvar isPlaced = falsevar times = 0var parent: LightEstimateContainerinit(parent: LightEstimateContainer) {self.parent = parent}func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {guard let anchor = anchors.first as? ARPlaneAnchor,!isPlaced else {return}do {let planEntity = AnchorEntity(anchor: anchor)let mesh = MeshResource.generateBox(size: 0.1, cornerRadius: 0.003)let texture = MaterialParameters.Texture.init(try TextureResource.load(named: "Box_Texture.jpg"))var meterial = SimpleMaterial(color: .blue,roughness: 0.8 ,isMetallic: false)meterial.color = .init(tint:.blue,texture:texture)let modelEntity = ModelEntity(mesh: mesh, materials: [meterial])planEntity.addChild(modelEntity)arView?.installGestures(for:modelEntity)arView?.scene.addAnchor(planEntity)}catch{print("无法加载纹理")}}func session(_ session: ARSession, didUpdate frame: ARFrame) {guard let estimatLight = frame.lightEstimate , times < 10 else {return }print("light intensity: \(estimatLight.ambientIntensity),light temperature: \(estimatLight.ambientColorTemperature)")if let estimatLight = frame.lightEstimate as? ARDirectionalLightEstimate {print("primary light direction: \(estimatLight.primaryLightDirection), primary light intensity: \(estimatLight.primaryLightIntensity)")}times += 1}}
}

        代码中代码逻辑非常清晰,我们使用 session(:didUpdate frame:)代理方法实时地获取每一帧的光照估计值,并打印了光照估计值强度及色温信息。运行代码,在检测到的水平平面上加载木箱物体后,改变真实环境中的光照,可以看到虚拟的木箱光照信息也发生了明显的变化。

  • 经过测试,发现在使用 RealityKit 渲染时,即使设置 isLightEstimation Enabled 为 false 也会在渲染虛拟元素时考虑光照估计,但此时无法从 frame. lightEstimate 中获取光照估计值。

      除了通用的光照估计,在使用 ARFaceTrackingConfiguration 配置运行 ARSession 时,ARKit 会提供更多关于环境光照的估计信息。在使用 ARFace TrackingConfiguration 配置运行 ARSession,当设置 isLightEstimationEnabled 值为 true 时,ARKit 每帧都会对从设备摄像头中采集的图像进行光照估计计算,并且将估计值保存在 frame. lightEstimate 属性中,但此时 frame. lightEstimate 为 ARDirectionalLightEstimate 类的实例,ARDirectionalLightEstimate类为 ARLightEstimate 的子类,不仅包括 ARLightEstimate 中的属性,还包含另外3个光照估计值属性。

  • primary LightDirectio 场景中最强光线的方向向量,这是一个在世界空间中归一化的向量
  • primary LightIntensit  场景中最强光线的光照强度,单位为流明,取值范围[0,2000],在光照条件良好的环境中,该值约在1000,0表示环境非常黑暗,2000表示环境非常明亮
  • spherical HarmonicsCoefficients  对环境中多个光源方向与强度的综合表达。球谐因子提供了一种在某点反映全局环境光照信息的简洁紧凑模型,描述了在该点的多个光源光照分布与颜色值。在IML. 渲染中,球谐因子非常高效。ARKit 光照估计提供二级(Second level)红、绿、蓝分离的3通道球谐因子,总数据包括3级9个因子,总计27个32位的浮点值。

      在Reality Kit 中,开发人员亦无须关注这些光照估计值,当设置 isLightEstimationEnabled 值为 true5,Reality Kit就会自动使用环境光照估计值渲染虚拟元素。但在使用自定义谊染时,开发人员必须自己处理光照估计。下面代码是演示在使用 ARFaceTrackingConfiguration 配置时,启用光照估计并获取实时的光照估计值。

func updateUIView(_ uiView: ARView, context: Context) {let config = ARFaceTrackingConfiguration()config.isLightEstimationEnabled = trueuiView.session.delegate = context.coordinatorcontext.coordinator.times = 0uiView.session.run(config, options: [.resetTracking,.removeExistingAnchors])return}func session(_ session: ARSession, didUpdate frame: ARFrame) {guard let estimatLight = frame.lightEstimate , times < 10 else {return }print("light intensity: \(estimatLight.ambientIntensity),light temperature: \(estimatLight.ambientColorTemperature)")if let estimatLight = frame.lightEstimate as? ARDirectionalLightEstimate {print("primary light direction: \(estimatLight.primaryLightDirection), primary light intensity: \(estimatLight.primaryLightIntensity)")}times += 1}

这篇关于【iOS ARKit】光照估计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661661

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机