大多数浏览器和
Developer App 均支持流媒体播放。
-
SceneKit:新功能
SceneKit 是一种速度快、功能齐全的高级 3D 图形框架,让您可以为 app 和游戏打造沉浸式的场景和特效。看看如何利用相机控制和特效方面的最新改进,来模拟焦外成像和运动模糊等真实的相机光学效果。了解用于直接在 GPU 上从粗糙网格开始创建光滑表面的曲面分割和曲面细分功能。查看与 ARKit 的全新整合,以及通过 Xcode 场景编辑器实现的工作流程改进。
资源
相关视频
Tech Talks
-
下载
(SceneKit:新特性)
大家早上好 欢迎参加SceneKit新特性演讲
你们已经知道了 SceneKit是Apple的高层级3D API 它是在Metal之上创建的 并且在我们的全部平台上均可用 这场演讲将会谈谈 我们在SceneKit中添加的新特性 我们今天不讲基础知识 所以若你刚接触SceneKit 我鼓励你看一下 前几年相关的演讲
这是我们今天的大纲 我首先要讲一些相机改进 包括一些新的相机效果 和一些新的API以简化相机控制 然后Amaury将上台讲一下细化和细分 以及关于动画的一些改进和新增API
最后我们会介绍一些新开发者工具 并谈一些相关技术 包括ARKit
现在让我们开始吧 我想先给你们看一个小演示 阐明我稍后要在本场演讲中 详细介绍的新API
这是一个简单的游戏示例 有一个我可以操控的角色 通过虚拟方向键 我可以攻击、跳跃 我们用的是相机和虚拟方向键
在演示中我想要强调的第一点就是 相机的行为 正如你所看到的 相机紧跟着这个角色 很平稳
说到平稳 我是指它没有完全地重现 角色的移动 而是尝试与角色保持恒定的距离和高度 但总是以平稳的加速度和减速度移动 你将看到相机的行为将会适应 根据游戏的不同分区 比如当我接近这个战争区时 相机就向下移动一点儿 并调整了景深 以聚焦于角色和敌人
提到敌人 我们在这里有两名敌人 都有最基本的行为 一个是追我 而另一个是逃跑 我会简单介绍一下如何通过 GameplayKit来实现这种行为 现在让我们杀死他们
还有另一个
然后收集这里的宝石
在这里 相机平稳地 过渡到了一个电影视角 有很强烈的景深效果 非常钥匙 并且你还可以注意到背景中 有一些很漂亮的散景 让我们收集那个钥匙
当我到这个新区域时 我必须很谨慎地在平台上跳跃 相机平稳地过渡到了一个新行为 现在它停止旋转了 并对准平台 以简化我在平台上的跳跃 那么让我们跳一下
这是很刻意的
让我们收集钥匙
又是一个新区域 相机将自动适应自己 并对准平台
看起来那里有一些需要释放的朋友 而我有钥匙 让我们释放他们
最后是一个新的电影视角 有许多角色跑来跑去 在这里我们要给 3200个机器人制作动画 而我们在半毫秒内就能实现 在这个新iPad Pro上 速度非常快 我们主要关注 角色动画性能 在这次发布中 通过新API实施这些变得更加简单了 通过我稍后要讲到的新动画API 那么这就是这个演示
一如既往 我们真的很高兴 与你们分享这个演示 作为一段示例代码 并且是运行在iOS、tvOS 和macOS上的示例代码 并在Swift和 Objective-C中可用
在演示中 我强调了相机行为 因为这是非常非常难写的部分 我们在开发者论坛上看到了 很多这方面的问题 和相关请求 所以我们在本次发布中 改进了我们的相机API 以简化这个问题并提高产品质量
为此 我们过渡到了一个 基于物理原理的相机API 并且利用这个新API来实施 从物理角度来说貌似合理的景深 我们还改善了运动模糊并添加了内置的 屏幕空间环境光遮蔽支持 然后我接下来要谈新API 关于我是如何 简化相机控制的
那么过渡到基于物理原理的API 相机API 首先我们不再支持旧系统上的投影模型 那么我们将 当然了 确保兼容性 但意识到我们正在远离x4和y4属性 而采用一些更匹配真实相机的东西 比如 如果你想配置你的透视投影 你现在可以 设置fieldOfView属性 或配置focalLength和sensorHeight 这些属性是连接在一起的 所以如果你配置了focalLength 比如说它将会相应地更新fieldOfView 反过来也一样
然后SceneKit会给一个 真实的相机景深建模 为了实现景深 将wantsDepthOfField属性设为真 然后进行配置 通过设置focusDistance和fStop属性
SceneKit将粗略估计 真实的相机景深 并模糊场景 通过与这些摄影界的参数 保持一致的方式
所以新景深也会模拟 你通过真实相机获得的散景
散景出现在明亮的对象上 模糊不清 因为它们是由像素生成的 强度很高 如果你通过HDR相机渲染场景 那么这个功能会非常好用 要配置这个 只需要将wantsHDR属性 在SCNcamera上设为真即可
然后散景的形状 取决于光圈的叶片数量 并且你还可以在 SCNcamera上配置它 这里有一些关于 这个属性的不同的值的例子
那么我们在本次发布中 改善了我们的运动模糊 我们去年已经发布了 运动模糊的第一次报告 即可以根据相机运动模糊场景 意思就是如果你的相机 在场景中快速移动 你将会获得运动模糊 但如果你的相机保持静止 而对象动来动去 你将不会获得任何运动模糊 那么在本次发布中 我们添加了对象运动模糊支持 当你在相机上启动运动模糊时 你将自动获得对象模糊
SCNcamera现在提供的另一种 效果是环境光遮蔽
环境光遮蔽的原理很简单 平面上的一个 点能接收全部环境光 而洞中的点却只能接收一部分环境光 因为有些环境光被表面挡住了
SceneKit支持 屏幕空间环境光遮蔽 意思是这个遮蔽因素 将在屏幕空间中的每一个像素上计算
这是通过分析深度缓存 和正常缓存实现的 SceneKit将决定 点是否存在于洞中 通过与临近的正常碎片比较其深度实现
那么这是一个 没有环境光遮蔽的一个对象 而这里有很强的环境光遮蔽 以实现幻灯片上所使用的效果
要启动屏幕空间环境光遮蔽 只需要将screenSpaceAmbient OcclusionIntensity 的值设置为大于零即可 然后你有一些参数 你可以进行调整 根据你想要实现的效果以及场景的尺寸 和拓扑 让我们在演示中实际看一下这些效果 关于这个 让我们欢迎Anatole上台
谢谢Thomas
大家早上好
那么让我们回到第一个演示中 并打开一些调试UI帮助我 给你们展示新的景深效果
这里我们有…抱歉
在这里在前景中 我们有一个很漂亮的金钥匙 焦距被设为短距离 因为钥匙离相机很近 效果数量也被设为了一个小值 因为我们想要一个很强烈的模糊 正如你所看到的 在背景中出现了一个很漂亮的散景 由于微粒的照明度
现在通过第二个相机 我现在有一个远焦距 那么背景中的对象很鲜明 前景中的花很模糊
另一种视角 在这里我可以 比如说 玩一下FStop的值 获取更多或更少的模糊
就像一台真实的相机一样
然后通过第二个滑块 我们定义了要在场景中的哪里聚焦
那么这个新的景深效果非常有用 比如说 在视频游戏中创建电影效果
现在让我们打开另一个应用 给你们展示一下新的对象运动模糊
在这里我们有一个场景 是木格箱堆起来的塔 如果我点击射击按钮 我会向那座塔丢小球
这是默认没有任何运动模糊时的样子 现在我重设场景 启动运动模糊 然后用小球扔那座塔
你可以看到运动模糊的效果 是那些小球的运动模糊 因为它们的移动速度很快 你还可以看到当塔爆炸时 应用在木格箱上的效果 但现在让我们近距离地看一下 我可以冻结场景 稍微离近一点儿
我们的大脑把这种模糊阐述为移动 你甚至可以在静态图像中 看到这些对象的运动
我们甚至可以修改视角 我们仍然对每个对象的方向 把握得很好
所以这真的改善了场景中的运动感知 结果看起来更贴近现实了
现在让我们看一下 屏幕空间演示
你可以看到一些小球被天空照亮 也能看到光的方向
通过第一个滑块 我可以向场景中添加一些环境光遮蔽 你可以看到 添加了一些环境光阴影 并且我可以修改强度 增加或减少小球的阴影
遮蔽的面积取决于表面的曲率 要了解像素是否处于洞中 我们要检查与之相邻的像素 所以我们有这个半径参数 可以让我们定义 要查找多少距离之内的临近像素 结果是小半径 环境光遮蔽更尖锐 大半径 获得的多面体阴影最多
这是实时计算的 所以这很好用 如果你正在处理动态对象 当环境光遮蔽映射
那添加了深处 抱歉是深度的感知细节 并把全局光照的效果带到了你的场景中
这就是这个演示 让我们返回到幻灯片中 我要把舞台交还给Thomas
(演示) 谢谢Anatole 那么我们讲了一些新相机效果 现在让我们谈谈相机控制 我之前的确说过 这是个很困难的难题 且我们也看到了与它相关的许多问题 我们认定了两个主要用例 人们可能会想检验一个3D对象 通过旋转3D对象或围绕3D对象旋转 比如正在创建一个 简单3D观察器的开发者 或需要一些更复杂的 相机行为的编辑和开发者 比如一个游戏或更高级的应用 让我们先从第一个用例开始看 直到现在 如果你想操纵一个3D对象 你必须实施你自己的事件管理 并移动相机位置和方向 根据手势或鼠标事件 为了方便 我们在SCNView上 提供了一个allowCameraControl 但这些只能为你提供 一个默认的相机行为 是不可配置的 这其实是用于调试的
在这次新发布中 我们引入了一个新类 叫作SCNCameraController SCNCameraController允许你操纵相机 获得你在3D软件中 所能看到的最常用的相机行为
那么这些行为被内嵌到相机控制器中 并且SCNView有一个 内嵌默认相机控制器 你可以根据你应用的需要直接配置 现在如果你需要更具体的行为 你仍可以实例化 你自己的SCNCameraController 并且只要你想 你就可以通过编程驱动它
SCNCameraController 提供立即可用的 绝大部分常用相机操作工具 举例来说 轨道转盘允许你 让你的相机绕着3D对象转 并防止摇晃 意思是地平线总是保持水平 无论你正在实施哪种旋转
轨道轨迹球会让相机通过屏幕 空间中的横轴和竖轴绕着转 所以这种模式在某些情况下更直观 但它不能防止摇晃 所以它真的取决于你应用的需求
另一个是飞行模式 更适用于成圈的场景 你可能想获得一个圈场景 在那种情况下 相机的旋转中心就是相机自己 意思就是你旋转相机 在一个位置查看四周以围着对象转
我们再次相信场景相机控制器会提供 绝大部分常用相机操作工具 如果你需要很具体的效果 没有什么能阻拦你 你仍然可以尝试以编程方式 使用你的相机控制器和相机
现在让我们来看看程序的第二个类 显影 我们需要一个更复杂的相机行为 比如游戏 我们通过链接约束 以定义相机行为来解决这个问题
SceneKit已经提供了 许多内嵌约束 我们今年又增加了一些新约束 可以应用到任意节点中 但尤其适用于相机
让我们来阐述其中一些约束 SCNDistanceConstraint强制节点 与另一个指定目标节点 保持最小和最大距离
要复制我们的约束 我们需要复制节点位置 和方向 通过一个可选的偏移
而加速度约束 会确保节点的移动或加速不会 比最大指定速度和加速度更快
那么这些只是一些例子 让我们看看可以用这些约束做什么
那么在这里我们有一个角色 正在场景中移动 相机目前没有约束 因此他是静态的
如果我给相机添加一个看约束 并将角色 作为目标节点 那么现在相机会旋转以实现看约束 相机会朝角色的方向看
如果我添加一个重复约束 并且我有基本的相机行为 那就会重复角色的移动 会有一些偏移 并继续朝角色的方向看 如果我添加一个加速度约束 我现在拥有同样的行为 那最应该感谢加速度约束 在另一个约束之后应用的
并且如果我用距离约束替换重复约束 我现在就有了一个新的相机行为 现在是跟随角色以实现距离约束 它继续朝角色的方向看 当然了 并且总是在移动 而不管角色的移动 这是由于加速度约束
这是如何定义相机行为 很简单 这是在我们的小狐狸2示例中实现的 只是定义了一组不同的约束 根据游戏的不同区域 我们可以为整个游戏定义相机行为
关于相机控制还需要注意一点
我们扩展了SCNNode的类别 为你们提供更多的实用工具 以在不同的空间转换和获取矢量 但最重要的是 全部节点转换属性 现有位置、旋转、 比例和矩阵以及转换 现在都能直接在SIMD属性中使用 以减少数学运算 那么由于SIMD类型 四元数、矢量和矩阵的运算的 写入变得更简单了 并且优先级也更高了 请了解一些SMD类型的限制 因为它们不是KVO 和KVC约束 并且它们不能 作为S值被包含在内
那么这就是相机控制器 现在让我们把舞台交给Amaury 让他谈谈细化和细分 (细化和细分曲面) 谢谢Thomas
那么我们知道好的图形 对于你的应用来说非常重要 可以实现用户胶着和取悦用户 要做出好的图形有很多方面需要关注 比如 增加真实性 这也是为什么我们这么多年一直引入 新的渲染功能的原因 比如基于物理原理着色 以及更真实的相机光学
但高分辨率资产 是另一个非常重要的因素
在你的应用中 你想同时拥有非常平滑的表面 以及非常丰富和精细的表面 现在问题是当你处理高分辨率资产时 它们需要更多的内存 都在磁盘上运行 并且它们需要更多的处理时间 那么在这部分 我们将会看一下允许设计师 以及你们开发者 处理当在屏幕上渲染时 可以变成高质量的 低分辨率模型的适当技巧
那么我想先解释一下什么是细化 及其工作原理 然后展示如何在 SceneKit中利用它 最后看一点儿不一样的东西 细分曲面
那么细化 细化是去年在Metal中 应用的一个功能 这个功能背后的理念是 提供低分辨率网格或粗网格GPU 然后让GPU生成更多几何体 拥有更多的至高点 当模型被渲染时
那么细化的确是一个很强大的工具 它们用于 创建、存储和推动低分辨率模型 当渲染这些低分辨率模型时 它们可能会拥有超高的品质 让我们看一下 这是一个三角形 这是它的一个细化版本
那么SceneKit就要决定 可以把一条边分成多少份 它可以决定可以在第一条边 和第二条边上 创建多少至高点 当然了 它同样也可以决定第三条边 很棒的是SceneKit还会生成更多至高点 在三角形内
那么这些就叫作细化因素 SceneKit是一个高层级API 我们把它变得非常简单易用 以便让你控制细化 我们新添加了 SCNGeometryTessellator类 并在SCNGeometry上添加了细化属性 细化公开了一些属性 考虑到了不同的模式
让我们首先来看一下最简单的例子
在这种模式中 你给SceneKit提供恒定的边 和内部细化因素 将被应用于全部粗网格的三角形 那么通过这种模式 你将拥有统一的细化 并且你将添加同等数量的几何体 在整个粗网格内
现在让我们看一个更复杂的例子
在这里你可以请求SceneKit 提供特别的细化因素 从而防止边太长 那么在这里 你在局部空间内 提供一个最大边长
甚至再强大点 你可以请求 SceneKit不断评估每一帧的 细化因素 根据对象内的项目 那么在这种模式中 你将提供屏幕空间中的 最大边长 以像素为单位
这是细化 现在如果你看一下原始三角形 及其细化版本 你可能会感到有点失望 这是因为全部新几何数据 实际上是位于原始三角形内 那么对于你高度细化的网格 你想要通过这种额外的网格 来实现一些别的东西 这就将我们引入了 基于细化的几何API
那么首先 我们回顾一下着色器修改器 着色器修改器完全支持新的细化管道 只需要通过几行代码 你就可以创建自定义效果了 那么比如说 如果你有一个应用 应用中涉及到水 你想模拟大海和波浪或任何其它想法 是你自己的效果 着色器修改器正是你所需要的工具 功能非常强大 当然了 我们还添加了一些 开箱即用的效果 比如使几何体平滑 这是一个新功能 比如如果你指定 pnTriangles smoothingMode SceneKit将考虑每个顶点 在法线上的位置 及其临近的点在法线上的位置 从而把它们放在一个平滑的表面上 你可能听说过的另一种效果 位移图和高度图
那么什么是高度图? 高度图是一个灰度图像 存储了表面上 任意点的海拔或高度 这种技术通常用于创建 比如地形渲染这样的效果 让我们看一个例子
这是一个平面 然后我们进行细化
然后通过高度图使其变形
那么这是一个很简单的例子 但这非常有效 API也很简单 我们在SCNMaterial上 添加了新位移材料属性 所以我敢说你们已经知道如何使用它了 你只需要指定它的内容 然后如果你修改它的强度 你就可以获得我刚刚所展示的动画
现在让我们更进一步 看看矢量位移图
矢量位移图是高度图的扩展 它不仅存储海拔 你还可以存储全部三个方位的位移 这就是为什么 你会拥有横断面图像 比如绿色是法线上的位移 而蓝色和红色 是切线和双切线上的位移
那么你猜到那有什么用吗? 让我们来看一下
好的 那么这是一个很傻的例子 但在你的应用中 你可以使用位移图 添加细节 给你的几何体添加精美的细节 那么比如说 如果你有一个变色龙的演示 你可以给它的皮肤添加细节 或者如果你有一个应用 应用中涉及到岩石 你可以近距离地接触到 那么正好可以使用矢量位移图 API是一样的 除了只有红色 你可以指定“全部” 纹理组件以表明你将包含一种以上的 色彩通道或输入图像
那么这就是细化和基于细化的效果 现在让我们看看细分曲面
那么你可能已经听说过我们的细分曲面 和 它是一个标准化算法 从粗网格开始 反复改善它
那么你可以看到我们从粗网格 到一个非常平滑和精制的网格是多么快
现在并不是所有东西都是完美的圆形 所以对于细分曲面 你可以指定褶皱和转角 以使边和至高点拥有明显的锐利度
那么细分曲面 它们被广泛用于创建、存储和推动 分辨率模型 当在屏幕上渲染这些分辨率模型时 可能会变成高品质的模型
并且几年前我们已经 在SceneKit中添加了 细分曲面的支持 但我们过去是在CPU上运行细分代码 那么那需要一些时间以及大量的内存 尤其是当你进入较高细分等级时 因为至高点的数量将呈指数增长
那么我们今年有个好消息
你可能听说了Pixar的 OpenSubdiv项目 这是一个开源的工具实施 用于细分曲面的高效评估 去年的WWDC时 Apple宣布我们将给这个项目 提供基于Metal的实施 以便你可以在GPU上 通过Metal运行细分代码
那么今年你可以利用 全部这些很棒的技术 非常简单
基于Metal的实施有许多好处 首先我们利用细分 它伴随着我之前讲过的 全部内存相关的优点 并且通过细分 我们甚至将会使低等级的细分 拥有更平滑的表面 现在除了统一细分 我们还支持功能适应性细分 我稍后会解释 最后我们还有全部GPU管道 用于细分网格的高效动画
那么让我们看一下这个例子 这是你在演示中看到的那把钥匙 正如你所看到的 它是一个很粗的网格 并没有那么精细 这是一个细化版本 细分版 那么通过这个资产 你可以看到你拥有很硬的边 但还有很漂亮的曲线 那么我们是如何实现的呢?通过褶皱
通过细分曲面 设计师们可以实现很棒的设计 他们可以简便地创建 并调整 获得他们想要的效果
现在功能适应性细分
当统一细分在一个有限的表面上实施时 这是通过呈指数增长的多边形数量 的增加而移动的
功能适应性细分可以 隔离你网格中的不规则部分 并创建很多补丁 那么然后 通过细化 我们可以创建新至高点 在这些完美的数学曲线上 因此它会生成非常平滑的表面 但却占用较低的内存
现在 API非常简单 你只需要指定细分等级 然后选择加入细化 然后对于功能适应性细分 配置起来也很简单
最后细分曲面的动画 今年我们有了全部GPU管道 非常高效 你可以有一个粗网格 并通过变形技术使其变形 那么只要你想 你就可以通过剥皮添加骨骼动画 最后作为最后一步 我们在GPU上运行精制代码 性能非常好 因为我们正在GPU上实现 在低分辨率的网格上 然后这个是非常精制的 是由GPU通过细化生成的
那么现在 你想试试细分曲面 你只需要记住两点 第一 如果你从文件中加载集合 请指定preserveOriginalTopology选项 如果你以编程方式创建几何体 请记住使用多边形原始类型 这是因为对于细分 处理三角形 与处理四边形并不一样
然后让我们来看一个快速演示
好的 那么这是一个简单的制陶应用 我要制作一件陶器 那么我可以缩放 并且可以拖动旋转 非常简单 现在如果我放大 然后关注对象的轮廓 正如你所看到的 非常平滑 你可以使用法线图 给表面添加一些细节
现在这个应用的目的很简单 我可以用我的手指 在网格上进行雕刻
让我们清除它 然后写一些东西 随着我的绘制 请看对象的轮廓
在这里我实际上正在修改几何体 我不只是添加表面细节 就像我们用法线图做的那样
好的 那么是如何实现的呢? 嗯 细分曲面、细化和高度图 让我们来看一下
我们所做的是 从一个非常粗的网格开始 正如你所看到的 分辨率非常低的多边形
它并没有法线 所以我们在这里有平坦阴影 但它有纹理坐标 所以我们可以 在它上面映射一个法线图 稍后再映射一个高度图 那么现在 让我们细分它
让我们看看所生成的平滑法线
然后让我们看看 线框以及创建了多少个至高点
当我启动细分时创建了多少个至高点
当我抬起手指时 我是在高度图上绘制图形
全部至高点都被移动了
现在让我们清除它 只是为了更有意思 让我们启用屏幕空间细化 现在我会放大 看看当我离对象 更近或更远时会怎么样
SceneKit将提供新的细化因素 它会在过程中创建新的至高点
这就是这个演示
谢谢 那么总的来说
细化和依赖于细化的功能 都能在全部Mac上的 Metal中 在拥有A9或更高版本芯片的 iOS设备上也有 那么包括iPhone 6S 以及全部iPad Pro型号
现在让我们一些完全不同的东西 我们对动画API的改进 (动画改进) 那么…
今年我们引入了新SCNAnimation协议 以及SCNAnimationPlayer类 使动画变得更简单了 当动画运行时 也使对它的操纵变得更简单了 那么比如说 现在你可以 轻松地修改动画速度 并且你可以在融合正在发生的动画 当然 我们仍完全支持CA动画API CA动画遵从我们的新协议 但通过新API 变得更简单了 你可以动态地操纵动画 当动画在运行时 并且这些API在全部平台上都可用 包括watchOS
那么让我们看看老的方式 那么假如你有一个角色 会走会跳 你首先要添加行走动画 然后当你想让角色跳跃时 你就需要添加跳跃动画 取代另一个动画
现在通过新API 你开始可以创建和配置动画播放器 然后当你想让角色跳跃时 你就操纵播放器 而不是直接操纵动画 所以这是一个很相似的API 不同点是你现在可以操纵 正在运行中的动画 所以你可以修改动画的速度 并且可以混合动画 动画混合实际上是今年的新功能
那么让我们来看一个例子 这是马克斯 他可以走、跑、迈步 每种运动都有不同的动画文件
通过新的混合API 你可以很简便地 从迈步动画过渡到行走动画 那么你可以引入流动性 并让你的应用更具有表现力 在你混合动画之后 你还可以调一下速度 马克斯可以跑慢点儿
最后让我提一下动画评估代码的改进 那么我们有一个新的实施 可以使在场景中 开启任意对象的动画变得更快 并且我们对骨骼动画的评估性能更好 那么如果你有许多角色 在你的场景中就会有很多骨骼 比如你刚才看到的小狐狸演示 那么通过我们这个新实施 可以让速度变得更快
然后让我把舞台交给Sebastien 他会给大家讲开发者工具的更新 (开发者工具) 谢谢Amaury
那么去年我们引入了FPS计量 那是一个了解你应用 对于SceneKit的性能概览的 一个很好的方式 并且它们进行了分类 所以你可以看到 CPU和GPU的具体信息 那么你可以了解是否正在渲染 和物理处理或微粒处理 它被整合在Xcode中 你可以始终看到 它的具体情况 能具体了解 哪些占用了时间很酷 所以你可以 减少网格或动画 比如说 但当你跳过某一帧时会发生什么呢? 你如何知道具体发生了什么? 到底是什么导致了跳帧?
今年我们引入了新工具 是SceneKit的模板 你可以用于记录你应用的踪迹 并具体了解每一帧到底发生了什么
非常简单易用 你只需要创建一个模板 就跟你创建用于其它追踪的模板一样 那么它将会记录你应用的性能 并且你会得到这个视图 它是全长的 显示了你应用中 所发生的具体细节 第一个是帧 它显示了所占用的时间 在应用中渲染某一个帧 并且你可以看到具体用了多少时间 第二个提供了渲染时间 是由SceneKit收集全部数据 并将其发送到GPU所占用的时间
第三个提供了更新过程 是用于更新物理处理、微粒处理 以及自定义委托(如果你有的话) 所占用的时间
最后一个但也是非常重要的一个 是将纹理上传到GPU 以及编译着色器所占用的时间
让我们看看跳帧时是什么样的 这是一个很简单的例子 你可以看到所有帧的渲染时间都很短 并且在某一点上来说 我们有一个帧占用的时间 与正常的四帧占用的时间一样 我们向下深挖 我们要看到底发生了什么 我们可以看到编译了一个新着色器 占用了很多时间 在这种情况下我们就可以了解 也许是在尝试找一种加载着色器的方式
在应用刚开启的时候
我们还添加了一种方式 可以结合 SceneKit工具和 Metal工具追踪 那么你可以同时看到这两者的结合 并查看具体 后台发生了什么 以便了解你的应用中发生了什么
今年我们还添加了一个新调试工具 是Xcode中视图调试器的改进 简单易用 你只需要使用 常规的视图调试器 就跟你往常的用法一样 它将自动捕捉视图等级以及场景 那么如果有SceneKit场景 在你应用的SceneKit视图中 它将捕捉场景 如果你在视图等级中选择场景 它将自动把它发送到 SceneKit编辑器 你可以检查你的全部对象 移动相机 看具体… 你的应用中发生了什么 以及场景中发生了什么
我们今年的新功能还有附加支持 那么我们有一种新方式 在Xcode中处理相机 你可以看到有一种新方式 来选择你想要的行为
我们添加了远景相机和自动绘图相机 因此你可以更简单地检验你的场景 你仍然可以获取全部常规相机
我们还添加了新行为 所以你可以在拐角处飞来飞去 并使用轨迹球 检验很大的场景变得更简单了
我们还完全修订了着色器修改器编辑器 那么现在你可以在一个屏幕上同时编辑 你的着色器修改器以及你的素材了 你不必来回选择对象 这是一个全新的实施 并且它支持自定义素材属性 那么如果你的素材中 没有足够多的属性slot 你可以添加颜色、浮动或矢量 以在你的着色器修改器中 添加你自己的实施 非常简单易用
我们今年添加的许多功能都有附加支持 首先是有一个新的位移素材slot 你可以用于细化 当然了 我们有细化 新的约束也有附加支持 那么你可以将它们添加到你的节点中 并在Xcode中进行实时测试 然后在检验器中编辑它们 我们有级联式阴影的支持 我们稍后会讲到 我们还有一个新的程序化天空 简单易用 可以作为背景 或照亮环境 比如说 测试你的PBM素材 当你没有合适的Qmap设置时 并且它是完全可配置的 所以你可以得到白天或晚上的天空 比如说
最后也是最重要的 我们添加了 用引用节点覆盖素材的可能性 什么是引用节点? 引用节点其实是指向一个 仅指向一个 场景文件的节点 但可在你的场景中多次使用 直到现在 我们只能对两者 执行完全一样的渲染 对于全部节点 不只是两个节点 但现在 你可以覆盖某些或全部素材 你正在场景中使用的素材 并修改其中一些 或全部素材的外观 比如说
接下来我要把舞台交给Thomas 他会跟大家谈谈相关技术 (相关技术) 谢谢
好的 让我们谈谈相关技术 从ARKit开始讲 那么你…是的
那么你们已经 都看到了周一的Keynote演讲 以及国情咨文中针对ARKit的介绍 你可能注意到ARKit 提供了一个ARSCNView ARSCNView为AR提供了一个 很简单的方案 开箱即用 事实上 ARSCNView 是SCNView的一个子类 意思是通过ARKit 你可以获得SceneKit的全部权限 你可以获取场景图 你可以添加后置处理、粒子系统、 物理系统、压力推进、自定义着色器 只要你想 你基本可以实现一切 通过ARKit和SceneKit 设置场景真的非常简单 就像这里的这个例子一样 我想让你猜一下这个视频的拍摄地 背景中有一条线索 我的口音是另一条线索
在这里要设施这样的一个场景 我们只需要加载一个SceneKit对象 就像你通常做的那样 并设置一个 AR视图 然后运行AR会话 然后从ARSCNView委托中 你只需要将你的3D对象附加 到ARKit所检测到的锚点上即可 就是那么简单
为了支持ARSCNView 我们扩展了素材属性 使其支持 AVCaptureDevice和AVPlayer 作为内容的原生支持类型 那么那意味着非常简单 只需要一行代码 你就可以直接连接了 所以如果你远离iPhone 或iPad直接在SceneKit的纹理 或场景背景执行feed
是的
现在我希望给你提供一些小技巧 关于增强现实 和阴影 那么事实是你的对象 看起来整合地更好 如果你的对象在地面上投有阴影的话 就像这个例子这样
那么这个小技巧就是为了实现这种效果 我们在Xcode中编辑了对象 我们添加了平行光 投射了一些阴影
然后我们添加了一个平面 来接收这些阴影 现在的目标是隐藏平面 因为我们不想在场景中看到它 但我们不能就那样使平面藏起来 否则阴影就会消失 那么技巧就是配置平面 使其不写入色彩缓冲器 这可以通过编程实现 或在Xcode中使用检验器实现 如果这样做平面将会消失 而阴影也会消失 但平面仍会写入深度缓冲器 意思就是我不能配置 我的光照并修改阴影技术 以及从这前边移动到延迟的阴影 现在阴影又回来了 因为延迟的阴影 是整个屏幕的第二个步骤 它会根据场景的深度缓存 以及光照图的深度缓存 在图像上制造阴影 那么对于延迟的阴影 平面仍然存在 因为平面 仍渲染到深度缓存中
这是在ARKit中关于阴影的小技巧 现在我想谈谈GamePlayKit
GamePlayKit实体和组件现在 支持驱动SceneKit对象 典型用例就是当你想实施角色行为时 这是我们在小狐狸2示例中对敌人做的 在我们的示例中有一个GKScene 有两个实体 一个是另一个的敌人 并且我们实施了两个行为 作为GKComponent 现在关键点在Xcode整合允许我们 在Xcode中直接给敌人分配行为 我们还可以使用Xcode检验器 直接编辑我们行为的属性
接下来Model I/O
Model I/O改进了 对3D中的USD的支持 提示一下 USD指的是通用场景描述 它是一个3D文件格式 由Pixar开发
SceneKit和Model I/O 改进了对USD的支持 且特别是对Metal I/O 和动画的支持 如果你想了解更多关于USD的信息 你可以参考我们去年的演讲 也可以参加周五下午 我们的另一场演讲 从艺术到引擎 Model I/O
接下来是UIFocus UIFocus引擎是UIKit的 一部分 允许你 选择对象并将其聚焦在你的Apple TV上 通过Siri Remote 现在SCN遵从UIFocusItem 意味着你可以决定 在你的场景中放哪个对象 并聚焦于哪个对象 然后聚焦引擎将回调你并告诉你 现在应该聚焦于哪个对象 在响应Apple Siri Remote上 的手势时
然后由你决定你要采取哪些行动 以及你想提供哪些视觉反馈 简要地解释一下 假如我把白色象棋配置为可聚焦 SceneKit将自动计算 你对象的投影区域 并将其提供给聚焦引擎 然后聚焦引擎会选择合适的对象 根据遥控上的手势
并且SceneKit会保持 屏幕上的投影区域持续更新 如果你移动对象或移动相机的话 那么你要做的唯一一件事就是 定义哪些对象是可聚焦的 仅此而已
现在让我们来总结一下 我想提一些渲染附件 是我们添加到我们的渲染器中的 一些渲染附加 第一个是对点云渲染的支持 我们改善了我们的SCN几何体对象 并添加了这些属性 这将允许你配置点云的外观 那么这些属性适用于是点云的几何体 意思就是 通过一堆点和一个原始类型点 创建的几何体 有了这些属性 你可以配置 屏幕空间和世界空间中的尺寸 并且SceneKit将渲染你的点云 给它们添加纹理和光照 根据附属于你几何体的素材
然后我们给我们的素材添加了两个 新透明度模式来解决 双面对象或凹面对象半透明的问题 那么如果你看一下左侧的对象 你可以看到一个双面球体 半透明 你会注意到 工件 因为多边形不是从后往前渲染的 那么SceneKit将从后往前渲染 你的对象以获得更好的透明度 但它并不会处理几何体的单一多边形 那么要解决这个问题 我们引入了两种新的透明度模式 那么第一个 单层 它将以两个步骤渲染你的对象 在第二个步骤中只渲染最靠前的面 那么这就修复了工件 但正如你所看到的 对象看起来并不像是双面的 这个模式的一个典型用例就是 当你想要淡出某个对象 并避免工件时 由于在淡出时对多边形的覆盖
那么第二个模式是双层 双层也会以两个步骤渲染你的对象 那么第一个步骤是渲染后面的面 第二个步骤是渲染前面的面 它允许我们正确地渲染这个双面球体 还有小狐狸演示中的宝石 这个宝石来自 Swift Playground Learn to Code课程
最后一个添加 是对级联式阴影图的支持 那么级联式阴影图是阴影图的一个优化 概念是它会把你的阴影图分成多个纹理 或多个级联 以更准确地分配给 距相机较近的区域 更模糊地分配给距相机较远的区域
要配置级联式阴影图 你只需要 告诉我们你想要多少个级联 你可以配置级联的侧面 然后你有一个参数 叫作shadowCascadeSplittingFactor 你可以调整它以控制级联的分配 根据距离视点的距离 比如这是一个片段 来自我们的小狐狸2示例 在我们的例子中 我们用了四个级联 呈现为不同的色彩
在这里我正在用拆分因素 那么你可以了解这是如何 影响在级联的分配了吧 取决于距离视点的距离 正如你所看到的 右侧区域代表第一级联 那么它呈现了世界中较小的一个区域 那么我们在这里有较高的精确度 而后面的绿色级联式一片较大的区域 那么我们对于绿色级联有较小的精确度 请注意你可以 你还可以可视化级联式阴影图 在你自己的场景中 通过Xcode实现
好了 总结一下 那么SceneKit的新版本 引入了新相机API 用于简化相机控制 通过一些新的很棒的效果 比如景深、运动模糊 和屏幕空间环境光遮蔽
同时针对细化和细分 有不错的GPU支持 一些新API 对于动画和动画混合有更好的性能 一些新的很棒的工具 可用于捕捉、追踪和编辑你的场景 当然了 因为有ARKit 还有一个很棒的增强现实模式
要获取更多信息 请参考我们的开发者网站 你可以从那里获取我们的示例代码
一些相关演讲
SceneKit整合了00图形技术 如Metal、SpriteKit 当然还有Model I/O
有一个演讲 是关于tvOS和UIFocus支持的 明天还有一场很棒的演讲 是关于SceneKit的 时间是明天早上 在Swift Playground中使用SceneKit 这就是全部内容了 谢谢大家
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。