本文概述
- ARKit简介
- 应用程序概念
- 构建应用
- 应用架构
- 参考和鸣谢
在本文中, 我想演示一个简单但有意义的小应用程序, 它不仅具有旋转的多维数据集, 还可以提供更多的功能。谁仍然需要旋转立方体?让我们来制作矩阵。
ARKit简介 ARKit是一个Apple框架, 用于为iOS设备创建AR应用程序。可以使用多个渲染器:用于2D对象的SpriteKit, 用于3D的SceneKit和如果我们要实现自定义渲染器的Metal。
对于本演示, 我们将使用SceneKit渲染和放置完全渲染的3D对象(刀)。
文章图片
从ARKit v2开始, ARKit支持五种类型的配置:
AROrientationTrackingConfiguration –仅要跟踪设备的方向时(例如, 对于星形星座应用程序)。使用此配置, 不会跟踪诸如脚步这样的物理运动, 并且不会影响场景上对象的位置或方向。
ARWorldTrackingConfiguration –这可能是AR最常用的配置, 因为它支持大多数人认为的增强现实。示例包括虚拟宠物或神奇宝贝狩猎应用程序。
ARFaceTrackingConfiguration – iPhone X当前仅支持此配置, 因为它需要TrueDepth相机(例如Face ID)。此配置跟踪面部特征及其相对于中性面部表情的相对偏移(例如, 用户可以在订购太阳镜之前尝试使用太阳镜的应用程序)。
ARImageTrackingConfiguration –如果你有一组标记, 并且想要显示动物跳出标记, 则此配置非常适合你。这些不一定是像卡片一样的标记, 而是任何2D图片。你可以将相机对准” 蒙娜丽莎” , 她会转过头告诉你一些事情。缺点是你必须事先说出图像标记的物理尺寸是多少。
ARObjectScanningConfiguration –此配置是ARImageTrackingConfiguration的3D版本。
在此演示中, 我们将在场景中添加刀和子弹, 我们希望有六个自由度, 因此合适的工具是ARWorldTrackingConfiguration。
应用程序概念 每个看过《黑客帝国》的人都可以回忆起Neo(Keanu Reeves)躲避子弹并将其停在空中的情况。我们的应用程序将帮助我们从实时摄像机供稿中重新创建此场景。因此, 我们可以创建展示新力量的自定义视频。
我们的应用程序将具有子弹和刀具的3D模型。由用户决定他们的电影中需要多少颗子弹或刀子。如果你想花一些时间并添加其他模型, 则该应用程序代码是开源的, 可以在GitHub(https://github.com/altaibayar/srcmini_ar_video_maker)上找到。虽然这不是完整的AR教程, 但如果你想进入iOS上的AR App开发, 则演示和源代码应该是宝贵的资源。
预期的用例场景如下:
- 让朋友装扮成Neo(对于应用程序的功能并非严格要求, 但在我们执行此操作时可能看起来还不错)。
- 让” Neo” 站在距离你约10米(30英尺)的位置。
- 启动应用程序并扫描接地层。
- 添加在” Neo” 飞行的子弹和刀具。
- 按住” 录制” 按钮以录制视频, 而” Neo” 执行一些很酷的动作来躲避或阻止子弹
- 释放录制按钮, 并将视频保存到你的媒体库。
出于演示目的, 我们只有两种类型的虚拟对象:刀和shot弹枪子弹。
刀是详细的对象, 我将使用https://poly.google.com/view/3TnnfzKfHrq中的免费模型(感谢Andrew)。
不过, 弹枪子弹是简单的球形物体, 我们只需对其进行编码即可。我们将其制成金属色并发红, 以备不时之需。由于我们正在模拟a弹枪, 因此我们还将它们生成为分组集群。为了使聚类有意义而又没有太多麻烦, 我们可以使用GamplayKit中的高斯随机数生成器。
GameplayKit是一个有用的工具, 每当你需要随机噪声生成, 状态机, AI或基于概率的决策时, 便会派上用场。
override init() {
super.init();
// generate 50 gaussian distributed position around [0, 0, 0]
let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50);
for pos in positions {
let node = SCNNode(geometry: sphereGeometry());
node.position =pos;
self.addChildNode(node);
}
}
private func sphereGeometry() ->
SCNGeometry {
// radius of one projectile sphere is 5mm/0.2inch
let sphere = SCNSphere(radius: 0.005);
// sphere is reddish
sphere.firstMaterial?.diffuse.contents = UIColor.red;
// reflection on light is gray/silver
sphere.firstMaterial?.reflective.contents = UIColor.gray;
// metalness is 0.3
sphere.firstMaterial?.metalness.contents = 0.3;
// shading should be realistic
sphere.firstMaterial?.lightingModel = .physicallyBased;
return sphere;
}
类似的随机偏移逻辑可以用于刀具, 但是由于它们的行为不像簇, 因此可以使用简单的随机分布。
应用架构 【ARKit演示(增强现实电影制作)】深入探讨哪种架构范例是最好的讨论超出了本演示的范围。那里有很多文章涉及该主题。
取而代之的是, 我将布局项目的结构, 以作为在链接的GitHub项目中寻找方法的指南:主要组件是什么, 它们如何连接以及为何选择它们。
该应用程序只有三个屏幕:
PermissionViewController –我们要求用户向应用程序授予对所需移动功能的访问权限的屏幕。
- 相机–显然
- 图库–保存录制的视频和麦克风输入
- 麦克风–我用来创建视频的库需要许可(默认情况下, 来自麦克风的声音将用作音轨的来源)。
MainViewController –所有的魔术都发生在这里。
根据我的经验, 最好将所有必要的ARKit类包装起来, 例如ARSession, ARConfiguration和所有唯一类型的SCNNode。这样, 代码是不言自明的。
ARSession继承到srcminiARSession中, 并且新的会话类仅具有三种方法:用于设置所需所有内容的类构造函数以及resetTracking和pauseTracking方法。
该应用程序识别四种独特类型的SCNNodes:
- KnifeNode –表示刀具3D对象, 并自动加载3D刀具作为其几何形状。
- BulletsNode –此节点代表一组shot弹枪弹。自动设置随机的高斯噪声, 颜色和物理照明模式。
使用KnifeNode或BulletsNode的类不需要任何特殊或额外的工作, 它们可以用作自定义应用程序以添加更多种类的3D对象的模板。
- ReticleNode –包装3D模型, 该模型出现在地板上方的场景中, 以显示将在其中添加刀或子弹的位置。
- DirectionalLightNode-这是一个表示向下的垂直光的节点。
从SCNScene录制:https://github.com/svtek/SceneKitVideoRecorder
按钮图标, ARKit演示应用程序:https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality
推荐阅读
- iOS与Xcode Server的持续集成说明
- 串通(iOS中具有MultipeerConnectivity的附近设备联网)
- 使用静态模式(Swift MVVM教程)
- iOS中的RxSwift和动画
- Android更改活动名称
- 使用AppleScript单击菜单项
- Apple Mail全功能HTML签名
- 用LoadRunner录制手机APP脚本
- wpf开源控件MahApps.Metro