大多数浏览器和
Developer App 均支持流媒体播放。
-
Core Haptics 简介
借助 Core Haptics,您可以设计全面定制附带同步音频的触感体验。通过示例体验触感和音频如何为您的 app 或游戏带来更强的沉浸感。了解如何创建、播放和分享内容,以及 Core Haptics 如何与其他音频和振动 API 搭配使用。
资源
- Core Haptics
- Human Interface Guidelines: Playing haptics
- Playing a Custom Haptic Pattern from a File
- Playing Collision-Based Haptic Patterns
- Updating Continuous and Transient Haptic Parameters in Real Time
- 演示幻灯片 (PDF)
相关视频
WWDC21
WWDC19
-
下载
(Core Haptics介绍) 我是Michael Diu 来自触觉交互团队 我将和你一起来 探讨iOS 13上的 关于触觉的一些进阶功能 我们来看下议程
首先 我们来讲一下 Core Haptics使用场景 它是如何与其他音频和触觉 API工作的 (使用Core Haptics 的场景) (展示内容) 我们来看一下API里面的两组类 我们为描述触觉和音频内容 使用的基本范围和描述符
我们以基本的方法来 说明其内容 (触觉初体验) 接下来 我们来介绍动态参数 你可以在你的app中 自定义动态参数 触觉反馈形式来给予用户使用 你app时的反馈 (动态参数) 以及 我们会探讨一种表现 存储 和分享你的音频触觉内容的新方式 我们称之为Apple触觉音频样式 或AHAP的一种新文件格式 (Apple触觉 音频样式(AHAP)) 所以我们开始吧
(使用Core Haptics 的场景) 首先 什么是 Core Haptics? (什么是 Core Haptics?) 我们认为它是iPhone上的 一种事件驱动的 音频和触觉渲染API 或音响合成器
我们和Core Haptics 一起继续使用其他 音频、触觉和反馈的API 比如AVAudioPlayer、 UIKit的UIFeedbackGenerator
你可能在想 “哪种型号的iPhone 支持使用呢?” (设备支持) 从iPhone 8开始 所有的设备都支持触觉驱动 只需一个API和一种文件格式 同其他产品一样 我们将你的触觉模式 都统一了 这样 你只需创作原型和发布了 一个产品
以及 这些iPhone不仅适配了旧的 型号驱动器 它们都具备Apple设计的 触感引擎 它能给你带来结合了多种特质 功率 宽泛 富有表现力 以及细节设计 和无与伦比的用户操作体验
接下来 我们来聊聊 你们中已经在iPhone 使用UIKit的反馈API 来集成了触觉功能的人
(上下文中的 Core Haptics) 现在 Core Haptics 并不是这个API的替代 (选择正确的 Haptics API) 在多数情况 你想要继续使用 FeedbackGenerator 特别是添加触觉来控制UIKit 使用这个API 你为你的事件指派了设计意图 无论是一个选择 撞击或一则通知 你让别人 Apple 担心开发一个词汇来表达 和混合正确的形式 比如音效触碰动画 来传达消息
现在 iOS 13上 已经优化了这个API 你可以查看文档来了解更多信息
相比之下 Core Haptics适用于 当你向要自己设计 声音和触觉的开发者 使用它 你就能自己设计样式 你能自己控制很多使用时候的细节 你可以与其他API一同使用 比如Core Animation里的动画 或AVAudioEngine 的音效事件 你有非常丰富的播放和控制设置 现在 UIKit的底层包括 Core Haptics 所以 API之间的使用性能是 低延迟的 现在...
设计你自己的 触觉模式需要更多的时间 但是 当考虑到它允许你实现的效果 以及让你的app变得与众不同 这是值得去做的 接下来 我来讲一下音效的性能 (触觉和音效之间的关系) Core Haptics 同样也是一个音效的API 它和触碰行为结合一起 允许你同步播放短的 合成的或客制化波形音效
这类音效触觉结合 对Apple自己的 触觉体验是至关重要的 比如iPhone 7的 触觉主界面按钮
Series 4 Watch的 触觉表冠 和UIDatePicker 当你选择日期、时间和闹钟时 滚动的轮子 你可能并没有意识到 你可能甚至没有注意到 使用时的提示音 不过 如果你关闭了音效 你会意识到使用过程中 音效反馈是不可分割的一部分 所以现在... 你可以在自己的app中使用 Core Haptics来达到同样的效果 我想来聊一下某些类型的app 一类会大量使用到 Core Haptics的app 那就是游戏了 (游戏app) 想象我们在赛跑 我们想要进入快速模式 我们来想象一下
当你在app中想要表现 爆炸和隆隆响的效果时 可以同时使用触觉和音效来传达
另一个非常好的app 是模仿我们身体接触 来让你的app更具真实感 思考一个网球游戏 你可以用到声音和触觉组件 声音的大小 触摸的强度 和你的摆幅的速度成正比 或是球在球拍中的位置 你甚至可以控制撞击后 球拍的弦共振声的长度
另一种使用 Core Haptics的好例子 是增强现实类的app (Core Haptics 和AR) 如果你在这个领域从事工作 你应该清楚高视觉保真 和
3D音效一起带来的身临其境的好处 现在 我们能更一步实现 这种沉浸式体检 依据用户的肢体动作来自定义 触觉感官回馈
或是对app的反应 设备 AR物件事件 比如 移动你的设备或四处移动
你的所有用户
作为一个灵感 今年 我们增强了 Swift Shot示例代码 通过使用触觉来调节拉弹弓的速度
你拉回手机的速度 拉回时你会感受到紧张感 当你释放时会感受到满意的转换
我想给你们展示一段视频 我将会使用音效来体现触觉感受 那就是你将会感受到的 它们听起来是这样的
现在 我们来看整个过程 视觉和触觉... 不是一般的音效
这就是我们同时使用触觉 声音和视觉 来增强AR体验的一个例子 还有更多的一些app 游戏和AR通过使用触觉感官 和音效做出有创意的探索 我知道你也能想到很多
现在 我们来看 如何使用Core Haptics 来表达我们的内容
Core Haptics 只有两种类 它们中一种用来展现你的内容 另一种来播放那个内容 (内容类 播放类) 我们先来看一下内容类 (事件、参数和模式) Core Haptics中 基本的不可分割的内容元素 被称为CHHapticEvent 现在 每个事件都有 一个类型和一个时间 根据不同的需要 不同参数可以定义不同的感觉
这些事件可以部分重叠 重叠时 它们混合在一起
所有的事件都归为一类模式
接下来 我想要谈谈我们的 这些不同类别的事件
第一类称为 HapticTransient 我觉得 HapticTransient是槌子 它是一个击打动作 它是短暂和瞬间发生的 我们还有两种连续的类型 (事件类型) 是HapticContinuous类 和AudioContinuous类 这个 我觉得 像是拉动弦乐器的弓 它不是短暂的 它能被用作 比如 背景纹理 它有你能操作的更多控件 比如 控制它的共振声
最后 是AudioCustom类型 我之前提到过 AudioCustom 你能和触觉感知 一起同步回放 你自己的音效
接下来 我们来讲一下它们的 一些可选参数
(我们的第一个事件参数) 我们的第一个事件参数叫做 HapticIntesnity 它有一个模拟音频和音频音量 你可能已经非常熟悉了
现在 你从没有输出 当你把滑块从0调到1 变成了系统输出最大值
我们下一个参数是 HapticSharpness HapticSharpness 是一个新的概念 它既没有实体的类比物 也没有音频的类比物 (HapticsSHARPNESS) 在这个... 世界 我希望你不要 向知觉空间前进 从一开始... 一个非常圆和自然的0
到最后更加简洁和清晰的1 为了解释得更加清楚 我要使用iOS 12上的一些例子
锁屏上的闪光灯 是一个非常高级别的触觉感受 的例子
以及... App Switcher 向上滑动 这是一个更加圆滑 低级别的触觉感知
为什么如此设计呢 为什么会有两种类型的体验 强烈和不强烈呢? 我会在音频触觉设计的演讲上告诉你
现在 我们有几个多类型的事件参数 比如 音效的pitch和pan 对于触觉来说 我们能让你改变这些共振等等 是这两个... 就足够我们使用了
现在 为了研究如何控制 强度和清晰度 的动态范围和精度 我们有一段示例代码 调色板 它能允许你
自己尝试体验这种感觉 当你移动 点击或是拖动手指 你会接触到强度的轴和清晰度的轴 当你操作时 它会提供相应的 持续或短暂的触碰体验 这会帮你找到直觉
(触觉初体验) 以上是Core Haptics 使用场景的介绍 以及如何展示我们的内容 有请我们Core Haptics 架构师Doug Scott 来为我们介绍 播放Core Haptics 播放相应的模式 和将Core Haptics 集成至我们的app 请欢迎Doug
谢谢Michael 大家晚上好 我非常高兴能在这里和大家交流集成 Core Haptics API 到你的app中
在我展示演示和示例代码之前 我们来回顾一下 当你想要在app中 使用触觉感知模式的几个步骤
第一步是创建内容 因为它能在任何节点创建 在你需要使用它之前创建 在这个例子中 我们在触觉模式中 加载了NSDictionary 这个词典是我们 在app里存储的资源的一部分 我们之后会看到 模式也能在它们播放之前被创建 如果在你的app中它们需要 非常多的互动来回应改变 (播放一个触觉模式:推荐的模式) 下一步就是创建一个触觉引擎的实例 这需要在你的app知道 它会使用触觉功能之前完成
接下来 你为你的触觉模式 创建了一个触觉播放器 每个播放器都与一个模式关联在一起 和一个特别的触觉引擎
启动触觉引擎 告知系统来初始化音效和触觉硬件 做好播放模式的准备
在你app要开始播放模式的瞬间 你启动了播放器 这可以用两种模式完成 第一种 是快速模式 告诉系统我想要这个模式在 最短延时内立刻播放 第二种 是预定模式 你给它一个固定的时间戳 告诉系统你想要 和一些其他的系统 比如 另一个音效播放器 或是游戏事件和图形事件一起 同步这个事件
如果你想要知道你的模式 何时完成播放 你能让触觉引擎通过回调函数通知你 当你的播放器都播放完成时
这里 引擎向app发送请求
app现在选择停止触觉引擎 或继续使用下一个触觉引擎
这些是基本的步骤 现在 我们来看一个 使用了这个系统的app
在这之前 我来向你们秘密展示 一个使用了集成触觉反馈的API的 一个特殊的问题 观众们可能感受不到 我们处理它的方式是为每一个 触觉事件的输出添加一个音效同等物 这样你就会听到触碰后的音效了 (演示)
这个app使用了一个 简单的物理引擎 通过加速传感器在屏幕中移动球
它集成了触感和音效反馈 当球触碰到屏幕边缘时 用户会有撞击 到游戏墙的边缘的感觉 也能听到声音 球撞击边缘越重 触觉的强度则更大 声音音量也会加大
好的 我们来看一下这个示例代码如何将 Core Haptics API 集成至app的 我们来看事件参数是如何被用来 改变触觉和音效的 这个例子 所有的代码 是从网上下载的示例代码 但它已被编辑过 只展示重要的部分 (使用Core Haptics API)
首先 我们导入 Core Haptics模块 和其他我们app需要的模块
CHHapticEngine被声明为 ViewController的一个成员变量 因为我们想要控制它的生命周期 让它在app的整个生命周期都存在
就像我们之前在流程图讨论过的 我们在使用触觉引擎之前就设置好它 这里 我们调用一个视图 加载后的协助方法
在这个协助方法里 我们开始 通过创建一个触觉引擎的实例 来检查可能存在的错误 这个引擎被分配到我们的成员变量 所以我们能一直保留它
它是可选的 但是分配一个闭包 给引擎的stoppedHandler属性 非常有用 如果引擎因为app本身之外的 行为停止运作了 可能的原因有 音效会话中断或app被终止运行了
我们启用触觉引擎来完成这个方法 以及检查可能存在的错误 这个引擎会持续运作 直到app或外部行为让它停止
请留意app会持续关注 引擎是否需要重启 通常 只要屏幕有可见的视图 就会有触觉交互行为 你可能会让引擎一直保持运行
这里是简单的物理引擎 在app中的位置 它让我们知道球碰到了墙 在这个例子中 我们想要 集成触觉和音效模式 来和球的速度产生交互行为 所以模式播放器和它的模式 在它们被需要的时候创建
这个方法负责创建 响应播放球的碰撞模式 在这里 我们会创建一个 有两个事件的模式 一个触觉和一个音效
我们创建一个hapticTransient 类型的触觉事件 来处理有效的感觉
我们给它两个事件色参数 来配置事件的强度和清晰度 你已经知道的 基于球的速度
接下来 我们创建 audioContinuous类型的音效事件
和一系列音量的事件参数 包络衰减也被用来计算球的速度 持续参数让我们 不用持续关注事件的长度 就知道这个事件的强度将会衰减为0
我们创建了一个包括了两个 实时同步的事件
最后 我们为模式创建了模式播放器 然后返回它
给这一层 回到响应碰撞的方法 最后一步是 在atTime CHHapticTimeImmediate 启动模式播放器 它表示以最小延时立刻播放
请注意 这个app并不拥有这个 播放器的实例 它的模式会被一直播放直到结束 所以app能简单地关掉并忘记它
这就是使用模式播放内容 最简单的方法 它在你app的代码中 由代码自动创建 因为这个app是不间断交互的 直到游戏屏幕不再可见之前 我们不会停止触觉引擎
现在 我们来讲一下Core Haptics 最强大的功能之一的 动态参数
在模式播放时 动态参数 能让你增加或减少已有事件 活跃的和将要到来的事件的参数的值 (动态参数) 动态参数在你提供的时间戳生效 你能在任意时间点 同时调整多个不同的参数
在你创建模式时 你能加入动态参数 或在播放时实时将它们传给播放器
通过动态修改模式 你可以使用一个模式就能 创建出无数个触觉和音效变量
我们来看一个例子 在这张示意图底部 我们有一个触觉模式 所有的触觉事件强度都被 设置为它们的最大值 前一半是HapticTransients 后一半是HapticContinuous
我们想要暂时减小游戏中所有的 触觉强度 比如 游戏中的角色在讲话 (动态参数和事件参数交互) 我传给强度一个值为0.3动态参数 需要0.5秒生效 你能看到它在那个 时间点明显的降低了强度 至原来的1/3
(Apple触觉音效模式(AHAP) 在文件中播放模式) 最后 我们来了解一下 创建模式的另一种方法
所以 到底什么是AHAP? (什么是AHAP?) Apple 触觉音效模式是一个 基于文字样式的描述 Core Haptics模式说明 它创建于嵌套的键值对 当你开始使用 Core Haptics API的类时 你会非常容易上手
它是广泛使用的JSON文件格式 的一个模式 意味着 你已经有很多不同的 读、写和编辑它们 的框架 包括比如Swift可编辑的框架
AHAP让分享和编辑触觉模式 变得简单 因为它是所有开发者都认可的格式
从外部的AHAP文件加载 你的触觉模式 允许你从app的代码中分离 你的内容
(创建一个AHAP文件) 通过使用幻灯片组的魔力 我们在这里创建一个 简单的AHAP文件
我们从一个版本字符串开始 它包含了这个模式设计的 系统的版本
接下来 我们需要为我们的模式 加入键 它是一个字典的数组
我们为模式数组加入我们第一个 事件字典 这个事件需要两个键值对 模式启动 事件发生时的精确到秒的时间
和事件类型 这是一个短暂的触觉事件 在模式开始时开始
对于这个事件 我们加入了能影响这个事件的 事件参数 它们被存在了它们自己的字典数组中
我们添加了一个事件参数来控制 事件的强度 另一个参数来控制它的清晰度
我们能按上述方法创建第二个事件 这一个在第一个事件启动后0.5 秒后启动 它的类型是 HapticContinuous 至于事件类型 我们使用和第一个事件相同的参数
HapticContinuous和 AudioContinuous类型的事件 除了时间和事件类型 它还需要一个事件持续时间 事件持续时间的值需要精确到秒
这里 是一个我们创建的模式的视图 可以看到两种不同类型的事件最开始 的HapticTransient 和之后相关的时机和时长 以及它们的强度和清晰度参数值 (创建一个AHAP文件) (AHAP结构概括) 这是一个AHAP快速的讲解 这是一个AHAP文件结构的示意图 一个单一的模式 包括了事件字典的数组
可选的动态参数和 可选择使用的动态曲线 是动态参数的一个扩展 你可以从我们的网站上阅读 它的更多信息 你能在我们演讲页面 找到AHAP说明的连接
(Haptics示例 示例代码) 同时 在我们的演讲页面 你会发现我们的示例代码 它展示了如何创建 加载和 播放被AHAP文件描述的模式 这个触觉示例app包含了 一系列使用 Core Haptics API的模式 它的精巧 动态范围和音效触觉同步 特质都是值得关注的
非常感谢 现在我们将舞台交给 我的同事Michael
谢谢Doug 那么 虽然我们今天讲了很多 但Core Haptics 还有很多未被提及到的特征
你可以通过在线文档查阅更多细节 (Core Haptics: 了解更多) 当你构建允许基本的说明内容 以及播放内容 你可能会思考这些连接触觉和 音频模式的设计原则
你也会思考触觉设计中 的声音设计的规则和指导 有哪些坑是我需要留意避开的? 有个好消息是我们的音效 和触觉设计团队已经为此工作 很多年了 它们在更新的 Human Interface Guidelines 为触觉设计方案 提供了很多建议和指导 在今年的WWDC上 也有很多相关的演讲 你可以来看看 (利用更新的触觉HIG) 所以 我们来总结一下 今天 我们谈到了 触觉提升了你的app的沉浸式体验 让交互变得更加便捷 (总结) 同步问候音频 和触觉感受 是一个非常有效的结合 不过 现在还没有 API支持你这样做 在iOS 13上 你现在有了可用的资源 来创建丰富多彩的多媒体体验 我们有了词汇来描述触觉和音效事件
和文件格式AHAP 我们有了新的高性能API Core Haptics 它为低延时和实时调制而设计
我们将示例代码 示例模式 设计指导和Apple的 支持整合在了一起 最后 你有了很棒的观众 优质的硬件 你能感受到和你预期一样的触觉感受 一个功能强大的触觉引擎能 给你提供强大的 生动的和精准可用的硬件
所以 请来参加周四和周五的 实验室活动吧 你可以查看我们今天展示过的 触觉示例代码 来聊一下你app的想法 你也能在我们演讲的页面找到 指导和说明意见
我知道你将使用 触觉模式在你的app中 创建有趣好玩的内容 我们期待着你的作品 谢谢大家 晚安
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。