14-《ARKit by Tutorials》读书笔记1:开始入门
说明
ARKit系列文章目录
本文是Ray Wenderlich上《ARKit by Tutorials》的读书笔记,主要讲内容概要和读后感
ARKit的主要特点:
- 追踪
- 场景理解
- 光照估计
- 场景交互
- 公制计量单位
- 渲染集成
ARKit的主要局限性:
- 平面检测需要花费一定时间
- 动作处理滞后:不能运动过快
- 低光照条件
- 光滑无纹理平面
- 幽灵穿透效果:不能正确处理遮挡效果
Xcode已经集成了AR项目的创建入口,直接可以创建一个自带小飞机的AR工程.
项目组织和管理
文件中的代码组织
- Properties: 类的属性.
- Outlets: xib上的元素.
- Actions: 执行的动作.
- View Management: 视图生命周期等方法.
- Initialization: 初始化方法.
- ARSCNViewDelegate 协议extension:AR代理方法
session控制
- Pausing:ARSession.pause()可以用来暂停会话.
- Resuming:ARSession.run()可恢复一个暂停的session.
- Updating:ARSession.run(ARSessionConfig)可以更新配置项.
- Resetting: ARSession.run(_:options:)可以重置session. 当session状态改变时,可以在代理方法中处理:
func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) {switch camera.trackingState {// 1case .notAvailable:trackingStatus = "Tracking: Not available!"// 2 case .normal:trackingStatus = "Tracking: All good!"// 3 case .limited(let reason):switch reason {case .excessiveMotion:trackingStatus = "Tracking: Limited due to excessive motion!"// 3.1 case .insufficientFeatures:trackingStatus = "Tracking: Limited due to insufficient features!"// 3.2case .initializing:trackingStatus = "Tracking: Initializing..."// 3.3case .relocalizing:trackingStatus = "Tracking: Relocalizing..."}}}
}
复制代码
调试选项
可以打开AR视图的debug选项来帮助调试:
sceneView.debugOptions = []
复制代码
可配置项如下:
- Feature points:显示检测到的特征点.
- World origin:红绿蓝三色线交叉组成的世界坐标原点.
- Bounding boxes:3D物体的边界盒.
- Wireframe:3D物体线框图.
着色器,材质和纹理
在SceneKit中可用的光照模型(着色器)如下:
材质是2D图片,可以包裹在3D几何体周围提供特殊属性,比如color颜色, specularity高光, reflectivity反射率, shininess发光率, roughness粗糙度, metalness金属度 甚至transparency透明度. 具体可以看我以前写的SceneKit系列文章Lights灯光, Materials材质,Shadows阴影
基于物理的渲染(PBR)
PBR光照模型是新引入的特性,可以让你的3D物体看起来更真实.
下面我们来重点学习一下其中的特性:
Environment map环境贴图
环境贴图是一种cube map立方体贴图,比如天空盒子shybox是这样的:
SceneKit还支持其它类型的立方体贴图:
环境贴图有两方面作用:一方面类似于reflection map反射贴图,可以在高反射率表面看到环境图像的反射;另一方面,对于支持PBR的3D物体,可以提供真实的光照环境.如下:
Diffuse map漫反射贴图
漫反射贴图提供基础颜色,无需考虑灯光和其它特效.
需要注意的是,漫反射贴图可以通过图片的alpha通道来指定透明度.比如在地球外面再包层大气云层图,你只能看到大气层的不透明部分.
Normal map法线贴图
所谓法线,就是垂直于几何体表面的向量.可以用来计算光线的反射等效果.
法线贴图通过图片的RGB通道来定义了像素级的表面法线.用来与光线混合计算,模拟表面的凹凸效果.这样无需增加多边形及顶点数据,就模拟出了真实的表面.
Height map高度贴图
高度贴图并不是PBR光照模型的一部分,但是也值得大家学习.高度贴图是黑白图像,白色代表物体的最高点,黑色代表最低点.
高度贴图和法线贴图可以互相转换,网上有免费工具Normal Map Online — available at bit.ly/1ELCePX
Occlusion map闭塞贴图
也就是ambient occlusion map环境光闭塞贴图(OA贴图).用来阻止环境光照亮闭塞的区域,比如墙壁上的裂缝里.黑白贴图,黑色代表不可照亮,白色代表可以照亮.
Emission map发光贴图/发射贴图
定义了光照和阴影来制造一种发光效果.例如地球黑夜的灯光(需要关闭光照.PBR下停用环境贴图):
Self-illumination map自发光贴图
自发光贴图在其它所有效果之后才应用;可以用来给最终效果上色,增亮或变暗
Displacement map位移贴图
在法线贴图中,我们可以在光滑表面创造出像素级的不同高度,但它只是幻像,只是改变了光线的反射而已.
在位移贴图中,我们可以真正地改变表面地形.灰色到白色表示凸起,灰色到黑色表示凹陷:
Metalness and roughness maps金属度和粗糙度贴图
PBR的主要特性就是能够展示出可见的微观细节,就是用金属度和粗糙度贴图来实现的:
- 金属度:从后往前,逐渐增强.
- 粗糙度:从左到右,逐渐增强.
Metalness map金属度贴图
金属度模拟了物体表面的属性,如反射,折射和菲涅耳反射.该灰度纹理中,黑色代表非金属,白色代表金属性表面:
Roughness map粗糙度贴图
粗糙度贴图模拟了真实世界表面的微观细节.产生明亮或暗淡的外观.该灰度纹理中,黑色代表最粗糙,白色代表最光滑表面:
Detect plane表面检测
Anchor锚点
锚点是3D物体的参考点,和UIView中的anchor锚点类似.对3D物体应用的transform变换也是相对于锚点的.
添加了新锚点
当平面检测发现平面时,会添加一个锚点,并创建一个SCNNode,并调用代理方法:
// 1
func renderer(_ renderer: SCNSceneRenderer,didAdd node: SCNNode, for anchor: ARAnchor) {// 2guard let planeAnchor = anchor as? ARPlaneAnchor else { return }// 3DispatchQueue.main.async {// 4let planeNode = self.createARPlaneNode(planeAnchor: planeAnchor,color: UIColor.yellow.withAlphaComponent(0.5))// 5node.addChildNode(planeNode)}
}
复制代码
锚点更新
当锚点更新时,也会调用代理方法:
// 1
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {// 2guard let planeAnchor = anchor as? ARPlaneAnchor else { return }// 3DispatchQueue.main.async {// 4self.updateARPlaneNode(planeNode: node.childNodes[0],planeAchor: planeAnchor)}
}复制代码
Physics物理效果
Physics body物理形体
首先要了解的是就是physics body物理形体的概念:
- static body:静态形体,在物理模拟中可以与其它物体发生作用,但自身不受影响,始终在原来位置上.如墙壁.
- dynamic body:动态形体,在物理模拟中完全由物理引擎控制并可以与其它物理形体发生作用.如小球.
- kinematic body:动力学形体,在物理模拟中不受物理引擎控制,但可以通过代码来移动.如电梯.
Physics body type物理形体的形状
还有SceneKit内置的物体形状:
并可调节各个参数:
还可以调整整个场景的物理效果速度及物理模拟帧数:
scene.physicsWorld.speed = 0.05 //效果就像慢镜头scene.physicsWorld.timeStep = 1.0 / 60.0 //每秒60帧;如果物体运动速度过快,需要增加帧数以提高精度,但也会提高CPU的负载.
复制代码
Force力
力使用3维向量SCNVector3表示,使用applyForce(_: atPosition: impluse:)方法来添加一个力,并指定位置.一个力可以同时影响线速度和角速度. impluse脉冲状只作用一次,比如踢一个球,非脉冲状的则可以持续作用. Position位置可以影响力的作用效果
更多物理效果相关内容,可以参考physics物理效果
灯光和阴影
在AR中给物体添加阴影一般有两种方法:
- 在物体下面放上一块浅灰纹理的平面,这样仿佛就有了阴影.这也就是所谓的将光照和阴影"烘焙"进纹理中.
- 在物体下面放一块平面,并将平面的Reflectivity设置为0;再添加一个光源,并将光源的Mode改为Deferred,这样就能产生实时的阴影了.
同时文章中还提供了,如何用代码来禁止某个物体写入颜色缓冲区.
func hideARPlaneNodes() {// 1for anchor in(self.sceneView.session.currentFrame?.anchors)! {// 2 if let node = self.sceneView.node(for: anchor) {// 3for child in node.childNodes {// 4let material = child.geometry?.materials.first!material?.colorBufferWriteMask = []}}}
}
复制代码
更多相关内容可以看我以前写的SceneKit系列文章Lights灯光, Shadows阴影以及官方Demo解读中关于阴影的官方解读苹果官方AR变色龙Demo解读
Hit testing命中测试
命中测试可以用来提供与3D物体的交互
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {DispatchQueue.main.async {// 1if let touchLocation = touches.first?.location(in: self.sceneView) {// 2if let hit = self.sceneView.hitTest(touchLocation,options: nil).first {// 3if hit.node.name == "dice" {// 4hit.node.removeFromParentNode()self.diceCount += 1}}}}
}
复制代码
第一部分读书笔记结束!
14-《ARKit by Tutorials》读书笔记1:开始入门相关推荐
- 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)
1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...
- 《指数基金投资指南》读书笔记---指数基金入门知识
什么是消费? 什么是资产? 假如单位给你发了1 000元的奖金, 你拿1 000元买烟抽, 这就是消费: 如果你拿这1 000元转入了余额宝, 就是买了资产. 你买了烟等你抽完就什么都不剩了, 而余额 ...
- python读书报告_读书笔记 Python编程入门
P39 组织列表 在你创建的列表中,元素的排列顺序常常是无法预测的,但你经常需要以特定的顺序呈现信息.有时候,你希望保留列表元素最初的排列顺序,而有时候又需要调整排列顺序.Python提供了很多组织列 ...
- 读书笔记--《MicroPython入门指南》
MicroPython入门指南 下图是<MicroPython入门指南>思维导图,我选了150%缩放,点开即可查看.
- 读书笔记数据科学入门————可视化数据
本章摘要 数据可视化是数据科学家的重要部分.创建可视化的目的:探索数据,交流数据. 本章利用一个外置的matplotlib库的配置进行可视化的初步了解 matplotlib的配置 许多工具可以可视化数 ...
- 读书笔记-深度学习入门之pytorch-第五章(含循环实现手写数字识别)(LSTM、GRU代码详解)
目录 1.RNN优点:(记忆性) 2.循环神经网络结构与原理 3.LSTM(长短时记忆网络) 4.GRU 5.LSTM.RNN.GRU区别 6.收敛性问题 7.循环神经网络Pytorch实现 (1)R ...
- 读书笔记数据科学入门————数据科学导论
数据科学导论 数据的用处:在数据中寻找隐藏问题的答案 数据科学是什么:就是从数据中剥离出真理. 在实际生活中数据的重要性,例如Facebook上的家乡居住地信息,不仅可以帮助朋友找到你的位置,同时网站 ...
- Unreal Engine 4 学习总动员读书笔记
Unreal Engine 4 学习总动员读书笔记 参考<Unreal Engine 4 学习总动员>,按照里面的录制的视频一步一步的操作,并将操作的流程和关键截图保存下来,方便后面的再次 ...
- 高效能程序员的修炼 --读书笔记
高效能程序员的修炼 –读书笔记 这是我读完Jeff Atwood的<高效能程序员的修炼>这本书后的一些回顾, 我会根据这本书的章节依次写下对每章节的理解和认识. 高效能程序员的修炼 读书笔 ...
最新文章
- 探究位置误差对单目3D目标检测影响
- C#线程、前后台线程
- SpringBoot2.0新特性 - Quartz自动化配置集成
- 【城市沙龙】LiveVideoStack Meet|杭州:多媒体新黄金时代
- 呜啦啦,园园我来了~
- java实现qq空间模块_Java实现模拟QQ空间图片上传
- 区块链 solidity 快排
- UDP socket--sendto and recvfrom
- 音视频处理入门基础知识(一)
- 433 490 868 915Mhz lora频段贴片天线方案 CA-S01 CrossAir贴片天线
- 全员营销实施困难,是因为你没有这个神器
- Redis过期键的删除策略
- T1055 判断闰年 (信息学一本通C++)
- 电容震动音的滋滋声音的原因与消除
- JavaGuide-关于Dubbo的重要知识点
- 生成树最小树形图 -- 朱刘算法详解
- CTF 竞赛入门指南(CTF All In One)学习(七)
- 群体领袖简介(25)
- 制作三星I9088 刷机ROM的实践(一)
- build文件下的build.js解释