Swift / ARKit:在不接触屏幕的情况下将对象节点放置在检测到的表面上
Swift / ARKit: Place an object node on a detected surface without touching the screen
我想使用 hitTest
将我面前的物体放置在检测到的表面上,而无需触摸屏幕(如 IKEA Place 或 Snapchat)
有人有解决方案吗?
谢谢
这是在不接触屏幕的情况下将节点放置在检测到的表面上的方法。
在 viewWillAppear 中将配置添加到您的 ARSCNView。添加布尔变量,它将检查是否检测到表面。
var surfaceDetected = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
sceneView.delegate = self
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = .horizontal
sceneView.session.run(configuration)
}
不要忘记继承ARSCNViewDelegate协议并实现下一个方法。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard !surfaceDetected else { return }
surfaceDetected = true
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
let x = CGFloat(planeAnchor.transform.columns.3.x)
let y = CGFloat(planeAnchor.transform.columns.3.y)
let z = CGFloat(planeAnchor.transform.columns.3.z)
let position = SCNVector3(x,y,z)
sceneView.scene.rootNode.addChildNode(yourNode)
yourNode.position = position
}
希望对您有所帮助!
我想使用 hitTest
将我面前的物体放置在检测到的表面上,而无需触摸屏幕(如 IKEA Place 或 Snapchat)
有人有解决方案吗?
谢谢
这是在不接触屏幕的情况下将节点放置在检测到的表面上的方法。
在 viewWillAppear 中将配置添加到您的 ARSCNView。添加布尔变量,它将检查是否检测到表面。
var surfaceDetected = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
sceneView.delegate = self
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = .horizontal
sceneView.session.run(configuration)
}
不要忘记继承ARSCNViewDelegate协议并实现下一个方法。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard !surfaceDetected else { return }
surfaceDetected = true
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
let x = CGFloat(planeAnchor.transform.columns.3.x)
let y = CGFloat(planeAnchor.transform.columns.3.y)
let z = CGFloat(planeAnchor.transform.columns.3.z)
let position = SCNVector3(x,y,z)
sceneView.scene.rootNode.addChildNode(yourNode)
yourNode.position = position
}
希望对您有所帮助!