【iOS ARKit】光照效果--光源

2024-01-30 21:52
文章标签 效果 ios 光照 光源 arkit

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

光照

     在现实世界中,光扮演了极其重要的角色,没有光万物将失去色彩,没有光世界将一片漆黑。在3D数字世界中亦是如此,3D数字世界本质上是一个使用数学精确描述的真实世界复本,光照计算是影响这个数字世界可信度的极其重要的因素。

光源

     顾名思义,光源即是光的来源,常见的光源有阳光、月光、星光、灯光等。光的本质其实很复杂,它是一种电磁辐射但却有波粒二象性(我们不会深入研究光学,那将是一件非常复杂且枯燥的工作,在计算机图形学中,只需要了解一些简单的光学属性并应用)。在实时渲染时,通常把光源当成一个没有体积的点,用工表示由其发射光线的方向,使用辐照度(Irradiance)量化光照强度。对平行光而言,它的辐照度可以通过计算在垂直于L 的单位面积上单位时间内穿过的能量衡量。在图形学中考虑光照,我们只要想象光源会向空间中发射带有能量的光子,然后这些光子会与物体表面发生作用(反射、折射和吸收),最后的结果是我们看到物体的颜色和各种纹理。

RealityKit 中的光源

    iOS Reality Kit 支持3种光源类型:平行光(DirectionalLight)、点光(PointLigbt)、聚光(SpotLight),分别同于模拟太阳光、普通灯泡类灯光、手电筒类灯光,组合使用这3种光源类型可以实现绝大部分光照效果道染需求。实际上,RealityRit还支持环境光,但 RealityKit 中的环境光照并不直接来自光源,而是使用IBL(Image Based Lighting,基于图像的光照)技术从背景图像中提取。

     RealityKit 采用IBL 技术的初衷是增强3D虚拟元素的真实感,使用该技术可以从提供的环境资源貼因中提取环境信息及光照信息。环境资源贴图定义了AR环境中的大概颜色及明暗信息,利用这些信息,RealityKit 可以将其用于环境反射以增强虚拟元素的真实感和可信度。

    使用环境资源贴图首先需要新建一个以.skybox为后辍的文件夹,并在该文件夹中放置使用的环境资源文件。环净资源贴图文件需为等距杜状投影环境图(经纬投影图)。將该文件实拖入 Xeode 工程文年写藏窗口中,在弹出的“选项”对 框中选择文件实引用(不要使用组),这样在工程编译译时 Xcode会自动打包该文件夹中所有的资源。

     Reality Kit 环境资源贴图类型支持常见图像格式,如.png 和.jpg 格式图像文件,但获得表现力更丰富:颜色更饱满的照明和反射效果,建议使用.exr或,bdr 格式图像,这两种格式支持高动态范围,用于环境反射效果更出色。

    在 RealityKit 中使用环境资源贴图只需要将贴图文件赋给 ARView. environment. background 属性,由干环境资源贴图放在特定的文件夹中,RealityKit 也提供了简洁的贴图加载方式,大大地简化了开发者的工作,典型代码如代码如下所示。

arView.environment.background = .skybox(try! EnvironmentResource.load(named: "Space"))
  • 平行光

     平行光用于模拟在远处发射的光照效果,在Reality Kit中,使用平行光的代码如下:

//
//  DirectionalLightView.swift
//  ARKitDeamo
//
//  Created by Zhaoquan on 2023/1/7.
//import SwiftUI
import RealityKit
import ARKitstruct DirectionalLightView : View {var body: some View {return ARViewContainer11().edgesIgnoringSafeArea(.all)}
}struct ARViewContainer11: UIViewRepresentable {func makeUIView(context: Context) -> ARView {let arView = ARView(frame: .zero)let config = ARWorldTrackingConfiguration()config.planeDetection = .horizontalconfig.worldAlignment = .gravityarView.session.run(config, options:[ ])arView.session.delegate = arViewarView.createPlane11()return arView}func updateUIView(_ uiView: ARView, context: Context) {}
}var boxMesh = MeshResource.generateBox(size: 0.1)
var boxMaterial = SimpleMaterial(color:.white,isMetallic: false)
var boxEntity11 = ModelEntity(mesh:boxMesh,materials:[boxMaterial])var planeMesh11 = MeshResource.generatePlane(width: 0.3,depth: 0.3)
var planeMaterial11 = SimpleMaterial(color:.white,isMetallic: false)
var planeEntity11 = ModelEntity(mesh:planeMesh11,materials:[planeMaterial11])extension ARView {func createPlane11(){let planeAnchor = AnchorEntity(plane:.horizontal,classification: .any,minimumBounds: [0.3,0.3])planeAnchor.addChild(boxEntity11)var tf = boxEntity11.transformtf.translation = SIMD3(tf.translation.x,tf.translation.y + 0.06,tf.translation.z)boxEntity11.move(to: tf, relativeTo: nil)planeAnchor.addChild(planeEntity11)//添加平行光源let directionalLight = DirectionalLight()//光照强度directionalLight.light.intensity = 50000//光照颜色directionalLight.light.color = UIColor.reddirectionalLight.light.isRealWorldProxy = falsedirectionalLight.look(at: [0, 0, 0], from: [0.01, 1, 0.01], relativeTo: nil)planeAnchor.addChild(directionalLight)self.scene.addAnchor(planeAnchor)}
}#if DEBUG
struct DirectionalLightView_Previews : PreviewProvider {static var previews: some View {ARViewContainer11()}
}
#endif

      对平行光而言,光源位置并不重要,重要的是光照方向,在实际开发中,经常使用平行光的look()方法设置光照方向。

  • 点光

    点光从光源位置向所有方向发射光线,当光线沿各方向传播时会出现衰减,在RealityKit 中使用 attenuationRadius 参数表示光线最大有效距离,即超出该距离后的物体无法被光源照射。使用点光时,不仅要指定光源位置,还需要指定衰减半径,典型的点光使用代码如代码如下。

//
//  PointLightView.swift
//  ARKitDeamo
//
//  Created by Zhaoquan on 2023/1/7.
//import SwiftUI
import RealityKit
import ARKitstruct PointLightView : View {var body: some View {return ARViewContainer12().edgesIgnoringSafeArea(.all)}
}struct ARViewContainer12: UIViewRepresentable {func makeUIView(context: Context) -> ARView {let arView = ARView(frame: .zero)let config = ARWorldTrackingConfiguration()config.planeDetection = .horizontalconfig.worldAlignment = .gravityarView.session.run(config, options:[ ])arView.session.delegate = arViewarView.createPlane12()return arView}func updateUIView(_ uiView: ARView, context: Context) {}
}extension ARView {func createPlane12(){let planeAnchor = AnchorEntity(plane:.horizontal,classification: .any,minimumBounds: [0.3,0.3])let planeMesh = MeshResource.generatePlane(width: 0.8,depth: 0.8)let planeMaterial = SimpleMaterial(color:.white,isMetallic: false)let planeEntity = ModelEntity(mesh:planeMesh,materials:[planeMaterial])planeAnchor.addChild(planeEntity)let boxMesh = MeshResource.generateBox(size: 0.1)let boxMaterial = SimpleMaterial(color:.white,isMetallic: false)let boxEntity = ModelEntity(mesh:boxMesh,materials:[boxMaterial])planeAnchor.addChild(boxEntity)//添加点光源let l = PointLight()l.light = PointLightComponent(color: .green, intensity: 5000, attenuationRadius: 0.5)l.position = [planeEntity.position.x , planeEntity.position.y + 0.5,planeEntity.position.z+0.2]l.move(to: l.transform, relativeTo: nil)let lightAnchor = AnchorEntity(world: l.position)lightAnchor.components.set(l.light)self.scene.addAnchor(lightAnchor)self.scene.addAnchor(planeAnchor)}
}#if DEBUG
struct PointLightView_Previews : PreviewProvider {static var previews: some View {ARViewContainer12()}
}
#endif
  • 聚光     

      聚光沿圆锥体发射光线,类似于手电筒的发光效果,其光线在传播时也会出现衰减,同时,在使用光需要指定圆锥角(innerAngleInDegrees)、聚光方向角(outerAngleInDegrees) 和光照方向,典型的聚光使用代码如下所示。

//
//  SpotLightView.swift
//  ARKitDeamo
//
//  Created by Zhaoquan on 2023/1/7.
//import SwiftUI
import RealityKit
import ARKitstruct SpotLightView : View {var body: some View {return ARViewContainer12().edgesIgnoringSafeArea(.all)}
}struct ARViewContainer13: UIViewRepresentable {func makeUIView(context: Context) -> ARView {let arView = ARView(frame: .zero)let config = ARWorldTrackingConfiguration()config.planeDetection = .horizontalconfig.worldAlignment = .gravityarView.session.run(config, options:[ ])arView.session.delegate = arViewarView.createPlane13()return arView}func updateUIView(_ uiView: ARView, context: Context) {}
}
/*
class SpotLight: Entity, HasSpotLight {required init() {super.init()self.light = SpotLightComponent(color: .yellow,intensity: 50000, innerAngleInDegrees: 60,outerAngleInDegrees: 130,attenuationRadius: 5)}
}*/var planeMesh13 = MeshResource.generatePlane(width: 0.8,depth: 0.8)
var planeMaterial13 = SimpleMaterial(color:.white,isMetallic: false)
var planeEntity13 = ModelEntity(mesh:planeMesh13,materials:[planeMaterial13])extension ARView : ARSessionDelegate{func createPlane13(){let planeAnchor = AnchorEntity(plane:.horizontal,classification: .any,minimumBounds: [0.3,0.3])planeAnchor.addChild(planeEntity13)let l = SpotLight()l.light = SpotLightComponent(color: .yellow, intensity: 5000, innerAngleInDegrees: 5, outerAngleInDegrees: 80, attenuationRadius: 2)l.position = [planeEntity13.position.x , planeEntity13.position.y + 0.1,planeEntity13.position.z+0.5]l.move(to: l.transform, relativeTo: nil)let lightAnchor = AnchorEntity(world: l.position)l.look(at: planeEntity13.position, from: l.position, relativeTo: nil)lightAnchor.components.set(l.light)self.scene.addAnchor(lightAnchor)self.scene.addAnchor(planeAnchor)}
}#if DEBUG
struct SpotLightView_Previews : PreviewProvider {static var previews: some View {ARViewContainer13()}
}
#endif

      利用光照可以在数字世界中模拟真实物体的照明效果,营造真实可信的虛实融合场景,但光照计算是一頂对资源消耗比较大的任务,场最中光源设置得越多,对性能消耗就越大,为提商应用性能,需要控制场果中的光源数量,或者使用顶渲染的纹理贴图替代实时光照计算。RealityKit 中各光源类型对资源消耗排序为:聚光>点光>平行光>环境光,聚光对性能消耗最大,需谨慎使用。

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



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

相关文章

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间

安卓链接正常显示,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的功能,即该应用程序

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

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

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