本文概述
AR和VR成为主流, 所有顶级大型高科技公司都在追求它们:苹果拥有ARKit, 谷歌拥有ARCore, 微软拥有自己的HoloLens(当然还有Unity)。随着少数应用程序受到公众的广泛关注, 增强现实应用程序开发已成为移动开发人员非常希望获得的技能。
在本文中, 我想演示一个简单但有意义的小应用程序, 它不仅具有旋转的多维数据集, 还可以提供更多的功能。谁仍然需要旋转立方体?让我们来制作矩阵。
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”执行一些很酷的动作来躲避或阻止子弹
- 释放录制按钮, 并将视频保存到你的媒体库。
构建应用
如前所述, 我们希望能够在记录所有360º场景的同时自由移动, 并让子弹头和刀头适当地跟踪摄像机的运动。
出于演示目的, 我们只有两种类型的虚拟对象:刀和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;
}
类似的随机偏移逻辑可以用于刀具, 但是由于它们的行为不像簇, 因此可以使用简单的随机分布。
应用架构
深入探讨哪种架构范例是最好的讨论超出了本演示的范围。那里有很多文章涉及该主题。
取而代之的是, 我将布局项目的结构, 以作为在链接的GitHub项目中寻找方法的指南:主要组件是什么, 它们如何连接以及为何选择它们。
该应用程序只有三个屏幕:
PermissionViewController –我们要求用户向应用程序授予对所需移动功能的访问权限的屏幕。
- 相机–显然
- 图库–保存录制的视频和麦克风输入
- 麦克风–我用来创建视频的库需要许可(默认情况下, 来自麦克风的声音将用作音轨的来源)。
ExportViewController –此屏幕显示录制的视频, 并提供共享或保存视频的选项。
MainViewController –所有的魔术都发生在这里。
根据我的经验, 最好将所有必要的ARKit类包装起来, 例如ARSession, ARConfiguration和所有唯一类型的SCNNode。这样, 代码是不言自明的。
ARSession继承到srcminiARSession中, 并且新的会话类仅具有三种方法:用于设置所需所有内容的类构造函数以及resetTracking和pauseTracking方法。
该应用程序识别四种独特类型的SCNNodes:
- KnifeNode –表示刀具3D对象, 并自动加载3D刀具作为其几何形状。
-
BulletsNode –此节点代表一组shot弹枪弹。自动设置随机的高斯噪声, 颜色和物理照明模式。
使用KnifeNode或BulletsNode的类不需要任何特殊或额外的工作, 它们可以用作自定义应用程序以添加更多种类的3D对象的模板。
- ReticleNode –包装3D模型, 该模型出现在地板上方的场景中, 以显示将在其中添加刀或子弹的位置。
- DirectionalLightNode-这是一个表示向下的垂直光的节点。
参考和鸣谢
刀模:https://poly.google.com/view/3TnnfzKfHrq
从SCNScene录制:https://github.com/svtek/SceneKitVideoRecorder
按钮图标, ARKit演示应用程序:https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality
评论前必须登录!
注册