我是增强现实领域的初学者,致力于使用智能手机创建建筑计划(平面图,房间平面图等,具有精确测量)的应用程序。所以我正在研究可用于此的最佳AR SDK。 Vuforia对抗ARCore和ARKit的文章并不多。
请建议使用最好的SDK,各自的优点和缺点。
答案 0 :(得分:32)
更新时间:2019年4月5日。
目前ARCore
适用于Android和iOS,较年轻的ARKit
仅适用于iOS(iPhone 6s及更高版本),而古老的Vuforia也适用于iOS和Android。 Vuforia使用ARCore
/ ARKit
技术,如果它运行的硬件支持它,否则它使用自己的AR技术和引擎(没有相关硬件的软件解决方案)。
然而,开发运行Android的OEM智能手机存在问题:所有这些设备都需要校准才能观察到相同的AR体验。
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)
}
}
}
<强> 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
<强> 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 Terrain
和ARKit
- 或者由Vuforia专门校准过的设备), VuMarks (允许识别和添加内容到一系列对象),对象目标< / strong>(用于扫描对象)和 Fusion 。
Vuforia Fusion是一种旨在解决AR支持技术碎片问题的功能,如相机,传感器,芯片组和ARKit等软件框架。使用Vuforia Fusion,您的应用程序将自动提供最佳体验,无需额外的工作。
外置摄像头功能是Vuforia Engine Driver Framework的一部分。外部相机为增强现实提供了一个新视角。它允许Vuforia Engine访问手机和平板电脑配备的摄像头以外的外部视频源。通过使用独立的相机,开发人员可以创建AR体验,从玩具,机器人或工业工具提供第一人称视角。
Vuforia支持iOS设备的金属加速。您也可以将Vuforia Samples用于您的项目。例如:ARCore
库包含使用Vuforia功能的各种场景,包括预先配置的对象识别场景,您可以将其用作对象识别应用程序的参考和起点。
Vuforia SDK价格(有四个选项):免费(您需要注册免费的开发许可证密钥), <4> 每个经典许可(针对收入低于1000万美元/年的公司构建的应用), 99美元/月每 Cloud许可和PTC还提供个人价格 Pro许可证(没有收入限制)。
与ARCore和ARKit 相比,Vuforia的开发没有明显限制。
有关详细信息,请参阅Why is ARKit better than the alternatives?文章。
<强>
Vuforia Core Samples
即可。 Vuforia的测量精度取决于您正在开发的平台。注意: Vuforia Chalk 应用程序使用Apple的ARKit。
在App Store和Google Play中试用免费的AR应用。
以下是用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更好地区分了表面的水平和垂直检测。