个性化阅读
专注于IT技术分析

ARKit演示:增强现实电影制作

本文概述

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开发, 则演示和源代码应该是宝贵的资源。

预期的用例场景如下:

  1. 让朋友装扮成Neo(对于应用程序的功能并非严格要求, 但在我们执行此操作时可能看起来还不错)。
  2. 让” Neo”站在距离你约10米(30英尺)的位置。
  3. 启动应用程序并扫描接地层。
  4. 添加在” Neo”飞行的子弹和刀具。
  5. 按住”录制”按钮以录制视频, 而” Neo”执行一些很酷的动作来躲避或阻止子弹
  6. 释放录制按钮, 并将视频保存到你的媒体库。

构建应用

如前所述, 我们希望能够在记录所有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

赞(0)
未经允许不得转载:srcmini » ARKit演示:增强现实电影制作

评论 抢沙发

评论前必须登录!