与ARCore和ARKit相比,Vuforia有任何限制吗?

时间:2018-06-12 07:41:40

标签: swift kotlin arkit vuforia arcore

我是增强现实领域的初学者,致力于使用智能手机创建建筑计划(平面图,房间平面图等,具有精确测量)的应用程序。所以我正在研究可用于此的最佳AR SDK。 Vuforia对抗ARCore和ARKit的文章并不多。

请建议使用最好的SDK,各自的优点和缺点。

2 个答案:

答案 0 :(得分:32)

更新时间:2019年4月5日

目前ARCore适用于Android和iOS,较年轻的ARKit仅适用于iOS(iPhone 6s及更高版本),而古老的Vuforia也适用于iOS和Android。 Vuforia使用ARCore / ARKit技术,如果它运行的硬件支持它,否则它使用自己的AR技术和引擎(没有相关硬件的软件解决方案)。

  

然而,开发运行Android的OEM智能手机存在问题:所有这些设备都需要校准才能观察到相同的AR体验。

enter image description here enter image description here

ARCore

成熟版ARCore的当前版本为1.8。最近的主要更新带来了诸如Augmented Faces API,开源场景中的动画,Point Cloud ID,多人游戏支持和改进的文档等重要功能。众所周知,ARCore允许移动设备使用Concurrent Odometry and Mapping(COM)相对于世界以6自由度(6-DoF)理解和跟踪其位置和方向,并允许检测其大小和位置。三种类型的表面:水平,垂直和有角度的表面,如地面,桌子,长凳,墙壁等,使用来自摄像机和陀螺仪和加速度计的视觉数据(以相同的方式操作ARKit和Vuforia)。 ARCore对现实世界的理解使您能够以与现实世界集成的方式放置3D对象和2D注释。因此,您可以使用Anchor(用于Android应用)或GARAnchor(用于iOS应用)类在现实世界咖啡桌的角落放置虚拟杯。

ARCore有三个主要的基本概念: Motion Tracking Environmental Understanding Light Estimation 。正如我之前所说,当您将手机移动到真实场景时,ARCore使用COM方法来了解手机的位置,相对于周围的世界。 ARCore在捕获的RGB图像序列中检测到所谓的feature points,并使用它们来计算手机的位置变化。视觉信息与来自惯性测量单元(IMU)的测量结果相结合,以估计相机随时间的位置和方向。然后,ARCore会查找看似位于水平或垂直曲面上的feature points群集,并将这些曲面作为planes提供给您的应用。因此,您可以使用所有这些数据将虚拟对象放入场景中。纹理3D几何体由ARCore的伴侣呈现 - Sceneform(有一个实时的基于物理的渲染引擎 - 细丝)。此外,ARCore可以检测有关其环境照明的信息,并为您提供给定摄像机图像的平均强度和颜色校正。此信息可让您在与周围环境相同的条件下点亮虚拟对象,从而增强真实感。

ARCore比ARKit年龄大得多。你还记得Tango吗?因此,ARCore是一款没有深度相机的探戈。明智地收购FlyBy和MetaIO帮助Apple迎头赶上。假设,它对AR行业非常有利。 ARCore需要Android 7.0 Nougat或更高版本,支持OpenGL ES 3.1加速,并与Unity,Unreal和Web应用程序集成。目前,Android平台上AR体验最强大,最节能的芯片组是Kirin 980(7nm),Snapdragon 855(7nm)和Exynos 9820(8nm)。 ARCore价格:免费

以下是用Kotlin语言编写的ARCore项目的样子:

// MainActivity.kt

class MainActivity: AppCompatActivity() {

    lateinit var fragment: ArFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)
        fragment = supportFragmentManager.findFragmentById(R.id.sceneform_fragment) as ArFragment

        button.setOnClickListener {
            addObject(Uri.parse("Helicopter.sfa"))
        }
    }
    private fun addObject(parse: Uri) {
        val frame = fragment.arSceneView.arFrame
        val point = getScreenCenter()
        if (frame != null) {
            val hits = frame.hitTest(point.x.toFloat(), point.y.toFloat())

            for (hit in hits) {
                val trackable = hit.trackable
                if (trackable is Plane && trackable.isPoseInPolygon(hit.hitPose)) {
                    placeObject(fragment, hit.createAnchor(), parse)
                    break
                }
            }
        }
    }
    private fun placeObject(fragment: ArFragment, createAnchor: Anchor, model: Uri) {
        ModelRenderable.builder()
            .setSource(fragment.context, model)
            .build()
            .thenAccept {
                addNodeToScene(fragment, createAnchor, it)
            }
            .exceptionally {
                val builder = AlertDialog.Builder(this)
                builder.setMessage(it.message)
                    .setTitle("Hey, I'm error!")
                val dialog = builder.create()
                dialog.show()
                return@exceptionally null
            }
    }
    private fun addNodeToScene(fragment: ArFragment, createAnchor: Anchor, renderable: ModelRenderable) {
        val anchorNode = AnchorNode(createAnchor)
        val rotatingNode = RotatingNode()
        val transformableNode = TransformableNode(fragment.transformationSystem)
        rotatingNode.renderable = renderable
        rotatingNode.addChild(transformableNode)
        rotatingNode.setParent(anchorNode)
        fragment.arSceneView.scene.addChild(anchorNode)
        transformableNode.select()
    }
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }
    private fun getScreenCenter(): android.graphics.Point {
        val s = findViewById<View>(android.R.id.content)
        return Point(s.width/2, s.height/2)
    }
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}

enter image description here enter image description here

<强> ARKit

ARKit具有许多有用的功能,可用于精确测量。例如,其最新版本2.0为ARWorldMap添加了Persistent AR experiences功能。这使您可以在应用变为非活动状态时保存世界地图,然后在下次应用程序在同一物理环境中启动时将其还原。您可以从恢复的世界地图中集中使用ARAnchor父类,将相同的虚拟内容放置在已保存会话的相同位置。 ARKit中的测量工具非常准确。 ARKit具有3D跟踪,2D跟踪,垂直/水平平面检测,图像检测,QR码检测(使用Vision框架),3D对象检测等。在ARKit中使用iBeacons,iBeacon感知应用程序可以知道它在哪个房间,并显示该房间的正确3D / 2D内容。

ARKit使用Visual Inertial Odometry(VIO)准确跟踪周围的世界。 VIO方法与ARCore中使用的Concurrent Odometry and Mapping非常相似。 ARKit中还有三个主要的基本概念: World Tracking Scene Understanding (包括 平面检测< / em> 点击测试 灯光评估 )和 {{ 1}} 在ARKit的伴侣 - SceneKit框架的帮助下。 VIO将RGB相机传感器数据以60 fps的速度与Core-Motion数据(IMU)以1000 fps融合。 SceneKit以60/120 fps渲染其3D几何体。应该注意的是,由于能量影响非常大(因为CPU和GPU的负担很大),iPhone的电池电量会很快耗尽。

当您在Mac上构建兼容ARKit 2.0的iOS应用程序时,您需要Xcode 10和运行iOS 12的移动设备.ARKit支持Metal 2.0和OpenGL GPU加速。 ARKit拥有一个Rendering(最多6人)和Pixar的全新multiuser support(适用于复杂的3D场景),当然还有基于物理的渲染a.k.a. USDZ file format。 ARKit与Unity和Unreal集成。目前,iOS平台上最强大,最节能的AR体验芯片组是A12 Bionic(7nm)。 ARKit价格:免费

以下是用Swift语言编写的ARKit双视图项目的样子:

PBR

enter image description here enter image description here

<强> Vuforia

PTC Vuforia Engine 8.1拥有与最新版本的ARKit和ARCore大致相同的功能,以及它自己的新功能,例如带有深度学习的模型目标,用于无标记AR体验的VISLAM和用于外部摄像头的外部摄像头支持iOS,以及ARCore和ARKit的新实验API。 Vuforia有一个独立版本,一个版本直接烘焙到Unity。它具有以下功能:具有深度学习的模型目标(允许使用预先存在的3D模型和深度学习算法通过形状立即识别对象),图像目标(最简单)将AR内容放在平面对象上的方法),多目标(对于具有平面和多边的对象),圆柱目标(用于将AR内容放置在具有圆柱形状的对象上) ,地平面(作为// ViewController.swift import UIKit import SceneKit import ARKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet weak var sceneView: ARSCNView! @IBOutlet weak var sceneView2: ARSCNView! let spotLight = SCNNode() let ambientLight = SCNNode() override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView2.delegate = self sceneView.showsStatistics = true sceneView2.showsStatistics = sceneView.showsStatistics let scene = SCNScene(named: "art.scnassets/Helicopter.scn")! sceneView.scene = scene sceneView2.scene = scene sceneView.isPlaying = true sceneView2.isPlaying = true spotLight.light = SCNLight() spotLight.light!.type = .spot spotLight.light!.intensity = 55 ambientLight.light = SCNLight() ambientLight.light!.type = .ambient ambientLight.light!.intensity = 40 sceneView.scene.rootNode.addChildNode(spotLight) sceneView.scene.rootNode.addChildNode(ambientLight) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let configuration = ARWorldTrackingConfiguration() configuration.isAutoFocusEnabled = false configuration.planeDetection = .horizontal configuration.environmentTexturing = .automatic configuration.isLightEstimationEnabled = true sceneView.session.run(configuration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) sceneView.session.pause() } func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { let node = SCNNode() return node } func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { guard let lightEstimate = sceneView.session.currentFrame?.lightEstimate else { return } spotLight.light!.intensity = lightEstimate.ambientIntensity / 1000 } } 的一部分,此功能可将数字内容放置在地板和桌面上,并且它仅与平台启动器支持的设备兼容 - Smart TerrainARKit - 或者由Vuforia专门校准过的设备), VuMarks (允许识别和添加内容到一系列对象),对象目标< / strong>(用于扫描对象)和 Fusion

Vuforia Fusion是一种旨在解决AR支持技术碎片问题的功能,如相机,传感器,芯片组和ARKit等软件框架。使用Vuforia Fusion,您的应用程序将自动提供最佳体验,无需额外的工作。

外置摄像头功能是Vuforia Engine Driver Framework的一部分。外部相机为增强现实提供了一个新视角。它允许Vuforia Engine访问手机和平板电脑配备的摄像头以外的外部视频源。通过使用独立的相机,开发人员可以创建AR体验,从玩具,机器人或工业工具提供第一人称视角。

Vuforia支持iOS设备的金属加速。您也可以将Vuforia Samples用于您的项目。例如:ARCore库包含使用Vuforia功能的各种场景,包括预先配置的对象识别场景,您可以将其用作对象识别应用程序的参考和起点。

enter image description here

Vuforia SDK价格(有四个选项):免费(您需要注册免费的开发许可证密钥), <4> 每个经典许可(针对收入低于1000万美元/年的公司构建的应用), 99美元/月 Cloud许可和PTC还提供个人价格 Pro许可证(没有收入限制)。

  

与ARCore和ARKit 相比,Vuforia的开发没有明显限制。

enter image description here

有关详细信息,请参阅Why is ARKit better than the alternatives?文章。

enter image description here

  

<强> Vuforia Core Samples 即可。 Vuforia的测量精度取决于您正在开发的平台。注意: Vuforia Chalk 应用程序使用Apple的ARKit。

在App Store和Google Play中试用免费的AR应用。

enter image description here

以下是用C#语言编写的Unity Vuforia项目的样子(以下示例说明如何使用自定义3D模型扩充Vuforia For me, ARKit has a greater measurement accuracy without any need to calibrate a scene):

Image Target

答案 1 :(得分:1)

出色的信息。但是,根据使用ARCore和ARkit的经验,我想补充几点。关于映射,与ARkit相比,ARCore具有管理更大地图的能力。与ARkit相比,ARcore跟踪更多的功能点。 另一个要点是,ARKit比ARcore更好地区分了表面的水平和垂直检测。