完全快速的初学者努力通过点击按钮将节点添加到场景中。
我知道我可以使用点击手势来获取点击坐标并执行点击测试,然后将对象放置在点击的 3D 空间中。但是,我想在设备屏幕的中心显示一个球体或十字准线,并且当点击屏幕底部的按钮时,具有与点击手势所提供的相同信息相同的行为。(至少我认为这就是我的想法)需要在这里做我不确定。)
加载场景后,我将一个小球体添加到相机视点的子节点,如下所示:
sphereNode = SCNNode(geometry: SCNSphere(radius: 0.020))
sphereNode?.position = SCNVector3Make(0, 0, -2)
sceneView.pointOfView?.addChildNode(sphereNode!)
Run Code Online (Sandbox Code Playgroud)
这会将球体放置在屏幕中央,稍微位于相机前面。当我在房间内移动设备时,球体按预期保持在中间。我希望能够点击按钮,然后获取点击手势给出的信息,以便执行点击测试并将新球体放置在场景中的该位置。除非有另一种更好的方法来做到这一点?
我正在寻找的行为与 iOS 测量应用程序的行为非常相似。测量点始终位于屏幕中央,然后点击“添加”即可添加新点。
您使用hitTest(_:types:)的方法是可行的方法。我认为来自 的链接ARSession是最直接的。
由于您想从屏幕中心进行测试,并且CGPoint预期的参数hitTest(_:types:)位于标准化坐标空间中,从 (0.0, 0.0) 到 (1.0, 1.0),因此您所需要做的就是传递 (0.5, 0.5)。
这是一些代码:
func buttonAction() {
guard let currentFrame = session.currentFrame,
let hitTest = currentFrame.hitTest(CGPoint(x: 0.5, y: 0.5), types: .featurePoint).last else {
return
}
let anchor = ARAnchor(transform: hitTest.worldTransform)
session.add(anchor: anchor)
}
Run Code Online (Sandbox Code Playgroud)
添加锚点后,您可以使用 的ARSCNViewDelegate方法renderer(_:nodeFor:)添加节点。基本上,当您向会话添加锚点时,将调用此方法。
顺便说一句,由于您似乎正在使用ARSCNView,因此您可以像这样访问您的 AR 会话sceneView.session。
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |