这是 RealityKit 的东西构思不佳还是我遗漏了什么?
Is this RealityKit stuff poorly conceived or am I missing something?
我正在尝试使用 Reality Kit 玩增强现实。
我想让我的程序执行以下操作之一,可由用户选择:
- 仅检测水平表面。
- 仅检测垂直表面。
- 同时检测水平和垂直表面。
- 检测图像,就像我打印一个目标,附加到现实世界中的一个对象上,应用程序检测到它。
据我所知,为了做到这一点,我需要调整 3 件事:
ARWorldTrackingConfiguration
做类似
的事情
func initSession() {
let config = ARWorldTrackingConfiguration()
config.planeDetection = .vertical
arView.session.delegate = self
arView.session.run(config)
}
在里面创建场景Experience.rcproject
一个适合我需要的锚定类型。我创建了三个具有以下锚点类型的“场景”:horizontal
、vertical
和 image
.
创建 ARCoachingOverlayView
指导用户使检测正常工作。
这些是问题:
ARWorldTrackingConfiguration
对于planeDetection
只有两个选项:horizontal
或vertical
.
Experience.rcproject
里面的场景,只能是3种:horizontal
、vertical
或image
.
ARCoachingOverlayView.goal
的选项是:tracking
(如果没有适当的文档很难弄清楚)、horizontalPlane
、verticalPlane
和 anyPlane
.
问题:
如何配置 ARWorldTrackingConfiguration
和 ARCoachingOverlayView.goal
以使应用仅检测 horizontal
、仅检测 vertical
、horizontal and vertical
和images
如果他们没有这四个选项?
我在Experience.rcproject
里面有3个场景,一个用于horizontal
,一个用于vertical
,一个用于image
检测。那是怎么做到的?
假设我们在 Reality Composer 中创建了三个名为 BoxScene
的场景,用于水平面检测(世界跟踪),StarScene
分别用于垂直平面检测(世界跟踪)和 PrismScene
分别用于图像检测(图像跟踪)。在每个场景中,我们都为我们的模型命名——这些名称会自动生成变量——goldenBox
、plasticStar
和 paintedPrism
.
要在 RealityKit 中从 World Tracking
配置切换到 Image Tracking
配置,我们必须使用在按钮的 @IBActions 中编写的明确的 AnchorEntity 初始化程序 – .image
和 .plane
.
查看以下代码以了解如何执行您想要的操作。
import RealityKit
import UIKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let cubeScene = try! Experience.loadBoxScene()
let starScene = try! Experience.loadStarScene()
let prismScene = try! Experience.loadPrismScene()
// IMAGE TRACKING
@IBAction func image(_ button: UIButton) {
arView.scene.anchors.removeAll()
let anchor = AnchorEntity(.image(group: "AR Resources",
name: "image"))
let prism = prismScene.paintedPrism!
anchor.addChild(prism)
arView.scene.anchors.append(anchor)
}
// WORLD TRACKING
@IBAction func verticalAndHorizontal(_ button: UIButton) {
arView.scene.anchors.removeAll()
let trackingAnchor = AnchorEntity(.plane([.vertical, .horizontal],
classification: .any,
minimumBounds: [0.1, 0.1]))
let cube = cubeScene.goldenBox!
let star = starScene.plasticStar!
if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical,
.horizontal],
classification: .any,
minimumBounds: [0.1, 0.1])) {
let anchor1 = AnchorEntity(.plane(.horizontal,
classification: .any,
minimumBounds: [0.1, 0.1]))
anchor1.addChild(cube)
arView.scene.anchors.append(anchor1)
}
if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical,
.horizontal],
classification: .any,
minimumBounds: [0.1, 0.1])) {
let anchor2 = AnchorEntity(.plane(.vertical,
classification: .any,
minimumBounds: [0.1, 0.1]))
anchor2.addChild(star)
arView.scene.anchors.append(anchor2)
}
}
}
P。 S.
目前我没有电脑,我已经在iPhone上写了。所以不知道这段代码有没有错误...
我正在尝试使用 Reality Kit 玩增强现实。
我想让我的程序执行以下操作之一,可由用户选择:
- 仅检测水平表面。
- 仅检测垂直表面。
- 同时检测水平和垂直表面。
- 检测图像,就像我打印一个目标,附加到现实世界中的一个对象上,应用程序检测到它。
据我所知,为了做到这一点,我需要调整 3 件事:
ARWorldTrackingConfiguration
做类似
的事情func initSession() {
let config = ARWorldTrackingConfiguration()
config.planeDetection = .vertical
arView.session.delegate = self
arView.session.run(config)
}
在里面创建场景Experience.rcproject
一个适合我需要的锚定类型。我创建了三个具有以下锚点类型的“场景”:horizontal
、vertical
和 image
.
创建 ARCoachingOverlayView
指导用户使检测正常工作。
这些是问题:
ARWorldTrackingConfiguration
对于planeDetection
只有两个选项:horizontal
或vertical
.Experience.rcproject
里面的场景,只能是3种:horizontal
、vertical
或image
.ARCoachingOverlayView.goal
的选项是:tracking
(如果没有适当的文档很难弄清楚)、horizontalPlane
、verticalPlane
和anyPlane
.
问题:
如何配置
ARWorldTrackingConfiguration
和ARCoachingOverlayView.goal
以使应用仅检测horizontal
、仅检测vertical
、horizontal and vertical
和images
如果他们没有这四个选项?我在
Experience.rcproject
里面有3个场景,一个用于horizontal
,一个用于vertical
,一个用于image
检测。那是怎么做到的?
假设我们在 Reality Composer 中创建了三个名为 BoxScene
的场景,用于水平面检测(世界跟踪),StarScene
分别用于垂直平面检测(世界跟踪)和 PrismScene
分别用于图像检测(图像跟踪)。在每个场景中,我们都为我们的模型命名——这些名称会自动生成变量——goldenBox
、plasticStar
和 paintedPrism
.
要在 RealityKit 中从 World Tracking
配置切换到 Image Tracking
配置,我们必须使用在按钮的 @IBActions 中编写的明确的 AnchorEntity 初始化程序 – .image
和 .plane
.
查看以下代码以了解如何执行您想要的操作。
import RealityKit
import UIKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let cubeScene = try! Experience.loadBoxScene()
let starScene = try! Experience.loadStarScene()
let prismScene = try! Experience.loadPrismScene()
// IMAGE TRACKING
@IBAction func image(_ button: UIButton) {
arView.scene.anchors.removeAll()
let anchor = AnchorEntity(.image(group: "AR Resources",
name: "image"))
let prism = prismScene.paintedPrism!
anchor.addChild(prism)
arView.scene.anchors.append(anchor)
}
// WORLD TRACKING
@IBAction func verticalAndHorizontal(_ button: UIButton) {
arView.scene.anchors.removeAll()
let trackingAnchor = AnchorEntity(.plane([.vertical, .horizontal],
classification: .any,
minimumBounds: [0.1, 0.1]))
let cube = cubeScene.goldenBox!
let star = starScene.plasticStar!
if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical,
.horizontal],
classification: .any,
minimumBounds: [0.1, 0.1])) {
let anchor1 = AnchorEntity(.plane(.horizontal,
classification: .any,
minimumBounds: [0.1, 0.1]))
anchor1.addChild(cube)
arView.scene.anchors.append(anchor1)
}
if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical,
.horizontal],
classification: .any,
minimumBounds: [0.1, 0.1])) {
let anchor2 = AnchorEntity(.plane(.vertical,
classification: .any,
minimumBounds: [0.1, 0.1]))
anchor2.addChild(star)
arView.scene.anchors.append(anchor2)
}
}
}
P。 S.
目前我没有电脑,我已经在iPhone上写了。所以不知道这段代码有没有错误...