ios 添加scenekit光照的应用标签一定要是游戏吗

当然如果囊中羞涩,也可以关紸微信公众号vrlife或头条号”寒酒仙“,大部分内容也会通过这些途径分享~特别说明:

本教程基于ARKit和Swift的Native开发并非基于Unity或Unreal。内容翻译改编自iOS 11 By Tutorials嘚beta试读章节版权归原作者所有。此外由于作者在写作该教程时基于iOS 11 beta5之前的版本,部分API已被弃用或更改(这就是当小白鼠的代价~),本人基于iOS 11 beta8做了部分细节上的调整(2017年8月31日)具体以苹果最新的官方文档为主。

原文作者似乎是在iPad上做的测试本人的开发和测试环境参考如丅:

在不久之前,主流的增强现实技术看起来还是一个很遥远的梦想因此当苹果在WWDC2017开发者大会上推出全新的iOS框架ARKit时,整个业界再次为之振奋我们只需拥有一部iOS设备就可以运行AR应用,完全不需要任何的第三方配件

ARKits的展示效果令人震惊。在本教程结束的时候我们将创建┅个名为HomeHero的应用,它可以帮我们来测量、规划和可视化的呈现室内的装修设计

注意:和其它类型的应用开发不同,使用ARKit开发应用时Simulator是没什么作用的我们需要在一台具有A9处理器或更好配置的iOS设备上进行测试。

点击编译并在设备上运行可以看到类似下面的画面。

目前这个畫面平淡无奇它只是在界面上放置了几个普通的UIButton而已。接下来我们需要配置ARKit并进行渲染不过在此之前,我们首先需要了解ARKit的各种组成え素

ARKit会使用设备上的摄像头和运动传奇器件来检测设备位置随时间的变化。摄像头所捕捉的图像还会被用来识别景深信息、平面以及咣照条件。因此在展示使用ARKit开发的应用时,需要确保背景具备良好的光照条件同时有大量的物体和丰富的纹理。ARKit的算法非常精确因此我们可以在它的帮助下来测量真实世界中的物体。

让我们假定iOS设备是个机器人:它有自己的眼睛也可以感受到自己的运动。那么ARSession就是機器人的大脑它可以通过API来交流自己所看到和所感受到的。

ARSession中包含了两个组成部分:

这个类用来表达某个物体在真实世界中的位置和朝姠我们可以手动给session添加anchor,以跟踪物体当ARSession在检测特定的物体时,也会自动添加ARAnchor举例而言,当我们打开自动平面检测时就会自动添加ARAnchor嘚子类ARPlaneAnchor物体。

ARKit需要捕捉视频帧并使用ARFrame来分析每个视频帧的运动数据,并返回信息摘要ARFrame中包含了所捕捉到的视频信息,光线评估数据囷所有跟踪到的ARAnchor对象。ARFrame中包含了ARCamera它代表了一个物理的摄像头及其位置。ARFrame中还包含了所检测到的feature points(功能点)其中包含了真实世界3D坐标的囿意思的特性。视频帧上的信息越多那么特征点也越多。

ARSession包含了一个ARSessionDelegate代理对象可以让程序随时了解正在发生的事情。

我们需要ARConfiguration来运行ARSession我们不推荐直接使用ARConfiguration,因为它只会检测设备的旋转而非位置信息。但是有一点需要说明的是它支持没有配置A9处理器的设备,因此仅當我们需要支持之前更老的设备时才需要用到它。正常情况下我们应使用ARWorldTrackingConfiguration(ARConfiguration的子类)它可以跟踪所有角度的运动,并给出最佳的结果

通过额外的计算,可以评估光照条件并以ARFrame对象的形式返回。它可以帮助虚拟物体更好的契合真实世界的光照

可以检测真实世界中的平媔,并通过添加ARPlaneAnchor对象的方式来自动追踪当然到目前为止,ARKit仅支持对水平面的支持ARKit目前支持对地板、桌子、沙发等平面的支持。当我们迻动摄像头的时候ARKit可以持续追踪数据的变化,包括平面的位置和延伸等或是合并为一个平面。

之前做过类比ARKit好比机器人的大脑,其Φ包含了它所观察到的原始数据但是它并不会渲染出任何东西。我们需要使用其它的渲染器来渲染出增强现实对象如scenekit光照,Metal或是SpriteKit苹果为此提供了ARSCNView,可以让我们使用scenekit光照来渲染ARKit所提供的数据ARSCNView会创建一个ARSession实例对象,并将ARCamera映射到一个SCNCamera上这样当我们移动设备的时候,所渲染出的scenekit光照对象也会随之移动通过这种方式,可以大大减轻我们的开发工作量你很快就会意识到这一点。

在该方法中ARSCNView将更新ARSession和renderer的状態。我们将在后面具体实现这个方法

在以上方法中,我们设置并运行了ARSession下面依次解释下各行代码的作用:

2.使用ARWorldTrackingSessionConfiguration来充分利用所有的运动信息,并给出最佳的结果需要注意的是,它只支持苹果A9处理器或者更高。

3.打开自动水平面检测我们将用词来渲染平面,从而进行测試以及将物体放置在真实世界之中。

4.打开光线评估运算ARSCNView将自动使用该功能,并基于所测算的真实世界光照条件来给物体打光

5.run(_:options)开启ARKit进程,并开始捕捉视频画面该方法将会让设备请求使用相机,如果用户拒绝该请求那么ARKit将无法工作。

6.ASRCNView还有一个额外的功能也即渲染出特征点,使用该行代码可以在调试的过程中查看特征点

此时,当视图加载的时候将开启ARKit的进程。

在 上编译运行该应用首先我们需要尣许使用相机。ARSCNView将自动为你完成这些事情:显示背景中所捕捉到的视频图像并渲染特征点。如果没有ARSCNView很难想象你自己该如何完成以上嘚工作。

在放置物体对象之前我们需要了解ARKit是如何认识这个世界的。可能大家对特征点已经有所了解了但是特征点并非真实世界的精確模型与写照。幸运的是ARKit提供了另一种更为精确的世界描述方式:plane(平面)。

 

1.在一个单独的queue中调用了Renderer代理方法为了避免多线程的问题,最简单的方法就是将其分发到主线程队列中

3.表示此处的内容仅用于调试输出。

5.这里的node参数是一个空的SCNNode将会被ARSCNView自动添加到场景之中,其坐标跟anchor参数相关我们只需要使用addChildNode(_:)方法将一个子对象关联到该空白节点即可,子对象(比如这里的平面)就会自动显示在正确的位置

除此之外,我们还需要考虑当平面的大小或者位置发生变化时或者一起被删除时的情况。

 

以上代码的主要作用就是更新平面的状态其Φrenderer(_:didUpdate:for:)方法将在相关的ARAnchor更新时被调用,而renderer(_didRemove:for:)方法则将在相关的ARAnchor被删除时被调用这里是对加了数字的代码行的解释:

2.当对应的ARAnchorPlane呗删除时从节点中刪除平面。removeChildren(inNode:)方法也是起始项目中所提供的辅助方法具体细节大家可以自己研究。

此时编译并运行应用就可以看到在真实的世界中出现鈳视化的平面了。

需要注意的是在测试时如果没有立即检测出平面,需要耐心等待一点时间

好了!现在我们可以进入虚拟世界,然后按照自己的想法来改造世界了首先我们将要学习如何在所检测的平面上放置物体。ARSCNView提供了非常有用的hit检测方法因此我们将使用该方法來检测手指在虚拟世界中触碰所检测的平面上的点。

 

以上方法将在hit test的结果点中添加一个新的anchor这里对数字编号的代码注释如下:

1.hitTest(_:types:)方法将返囙指定平面坐标和类型的所有hit test结果。这里我们传递了一个viewCenter参数作为屏幕的中心坐标点也就是灰色小点的位置。viewCenter是起始项目中所提供的辅助属性接下来使用existingPlaneUsingExtent这个hit test选,从而说明我们需要获取已存在平面的hit test结果信息并保留平面的有限大小(范围)。

2.如果我们获取到结果则使用ARSession中的add(anchor:)方法来创建一个anchor锚点,以表示物体在真实世界中所放置的点

以上代码虽然添加了anchor,但是并不会渲染出任何东西ARSCNView将在添加了新嘚ARAnchor时调用renderer(_:didAdd:for:)代理方法。我们将在该方法中处理对新物体的渲染

 

以上代码将在真实世界中放置所选择的模型,具体的数字代码行注释如下:

2.currentMode昰已经添加到起始项目中的HomeHeroController属性它代表当前的UI状态:其中placeObject代表选择的是物体按钮,而measure则代表所选择的是测量按钮switch代码将根据UI状态的不哃执行不同的代码。

4.nodeWithModelName(_:)方法使用指定的路径名称来创建一个新的3D模型SCNNode该方法是起始项目中所提供的辅助方法。

5.将节点扩展到起始项目中所提供的objects数组中

6.最后,我们将新的物体节点添加到代理方法中的SCNNode

7.关于测量工具,我们将在后续具体来实现

编译并在 上运行项目,将灰銫的点指向所检测出的平面上并触碰屏幕,即可将物体添加到场景之中

想要更全面深入的了解虚拟现实行业、产品和技术现状,虚拟現实相关的开发知识以及相关的工作机会,可以加入我的知识星球

当然,如果囊中羞涩也可以关注微信公众号vrlife,或头条号”寒酒仙“大部分内容也会通过这些途径分享~

前面我们介绍了几何体的相关知識这篇我将为大家介绍材质,那什么是材质呢简单来说,就是你的几何体的外观比如是什么颜色,反光强度等等那么在scenekit光照中我們可以改变几何体的哪些外观呢?接下来我将一一介绍

提到材质就不得不提到光照模型。在现实生活中我们有太阳,日光灯蜡烛等鈳以产生光的光源,光照射在物体上不同的物体呈现出不同的质感,这些都是很平常的事情但是在计算机里,想要使用光源照射3D模型产生出想要的质感就不是那么平常了。在OpenGL中我们需要使用Shader根据提供的材质参数和光照来计算每个像素的颜色,从而产生物体被光照射嘚感觉想要了解Shader中是如何实现光照模型的可以看我的两篇文章基本光照和高级光照。其中有涉及到lambert和blinn两种光照模型下面我将结合scenekit光照簡单的介绍这两种光照模型。

那么渲染出来的球体将会如下所示

我们使用的灯光在(0,6,3)处,所以球体上面是照射到灯光的下面是灰色的。這里涉及到了两个光照分量diffuse和ambient。diffuse表示几何体的本色所以灯光照射到的部分就是本色红色,注意我用的灯光是白色的如果灯光是其他顏色,则会和几何体的本色混合也就是两个颜色进行3维向量乘法。那灯光照射不到的地方呢就是ambient环境光。环境光的出现是为了让灯光照射不到的地方不会是全黑你可以试试把环境光改成其他颜色,看看渲染结果如何由于PBR光照模型中ambient和diffuse是锁定的,所以需要把locksAmbientWithDiffuse设置为false否则ambient只能和diffuse取相同的值。关于PBR光照模型我会在后面的文章单独介绍最后将material赋值给几何体,这里material是被放在一个数组里赋值的如果你的几哬体有多个element,系统会根据顺序为每个element提供不同的材质第n个element会得到第n%材质个数个材质。

diffuse还和法线相关法线和光线的夹脚越小,则越亮法线就是上一篇代码里的normals。

总的来说Lambert模型就是最终颜色=光线和法线夹脚系数*光照颜色*本色diffuse + 环境色ambient。

Blinn光照模型其实就是在lambert基础上加上高光我们将光照模型修改为.blinn,再设置高光的属性

当光线被反射后和我们视线的夹脚比较小的时候,在金属或者玻璃等反光材质下会看到非常亮的区域,我们称之为高光越是光滑的物体,高光区域会越小我们用shininess来表示物体的表面有多闪(光滑),它的值从0到1值越大,樾光滑下面是值为0.2和1的效果图。material.specular表示高光的颜色不过最终呈现的高光颜色受material.specular和灯光的颜色共同影响,是它们颜色值的三维向量相乘

仩面我只给材质的参数赋予了颜色值,除了颜色还可以赋予贴图,或者说是图片diffuse和specular都是可以接受图片对象的。比如给diffuse赋值一张地球的貼图

从google淘来的地球贴图

specular接受的贴图就比较特殊,是一张黑白两色的图图中黑色对应的地方将没有高光。

下面两张图分别是使用了和没使用specular贴图的效果图第一张图中明显大海部分没有高光。

不管是什么贴图都是需要几何体提供UV数据的,也就是所谓的贴图坐标在上一篇的代码中有涉及到。

系统提供的球形几何体已经有了UV数据所以才可以轻松的进行贴图,关于贴图的更多信息会在后面的文章中介绍,或者你也可以去看我写的基于OpenGL的贴图文章

scenekit光照还提供了反射贴图功能,可以使用CubeMap或者SphereMap来当作环境贴图这里我只为大家演示一下,更罙入的介绍会在后面的文章中进行下面是设置反射贴图的代码。cube-X.jpg等图片都在demo项目中

效果图如下。是不是有一种被玻璃包裹的感觉反射贴图主要就是通过对CubeMap或者SphereMap的反射,模拟物体反射周围环境的一种技术

我们上面有说过我们会给几何体提供法线数据,但是这些数据是烸个顶点才有一个顶点之间区域的法线就只能通过线性插值来计算了。法线贴图则是通过贴图的方式来弥补这一缺陷更多原理性质的介绍就不在这展开了,下面是例子用的法线贴图

效果如下。是不是瞬间有了凹凸感

这篇文章主要介绍了材质的一些基本功能,还有很哆其他的功能是没有提到的东西其实很多,要在一篇文章中全部铺开不现实看完这一篇读者心中对光照模型和材质有个基本了解就可鉯了。后面的文章会针对材质中比较复杂的特性逐一进行深入介绍

  • 本系列所有文章目录 获取示例代码 前言 前面我们介绍了几何体的相关知识,这篇我将为大家介绍材质那什么是材质呢?简...

  • 光照贴图 执行光照计算的开销是非常昂贵的 延迟渲染允许我们使用很多光源,但陰影的开销仍然是一个限制因素如果我们...

  • 我们都知道,一个三维场景的画面的好坏百分之四十取决于模型,百分之六十取决于贴图鈳见贴图在画面中所占的重要性。在...

  • 【引言】 上一篇谈到C4D的凹凸贴图及其应用最后说道,在现实使用中尤其是在游戏引擎中,很少有使用凹凸贴图...

发布时间: 发布网站:编程之家

收集整理的这篇文章主要介绍了小编觉得挺不错的,现在分享给大家也给大家做个参考。

我有一个动态创建SCNView的视图.它的场景是空的,但昰当我按下一个按钮时,我想从单独的scn文件中添加一个节点.这个文件包含动画,我想在主场景中设置动画.问题是在将对象添加到场景后,它不是動画.当我将此文件用作SCNView场景时,它可以正常工作. isPlaying和循环已启用.使用动画导入这样的节点还需要做什么示例代码如下:

以上是为你收集整理嘚全部内容,希望文章能够帮你解决所遇到的程序开发问题

如果觉得网站内容还不错,欢迎将推荐给程序员好友

本图文内容来源于网伖网络收集整理提供,作为学习参考使用版权属于原作者。
如您喜欢交流学习经验

我要回帖

更多关于 scenekit 的文章

 

随机推荐