如何使用ARKit将SCNNode的方向更改为相机
问题描述:
下面的代码将SCNPlane放置到所触摸的点上,但是该平面的方向(旋转)为手机在应用程序启动时的位置。理想情况下,我希望将节点定位到实体墙或摄像机的当前方向。这是如何与ARKit完成的?如何使用ARKit将SCNNode的方向更改为相机
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {return}
let result = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
guard let hitResult = result.last else {return}
let hitTransform = SCNMatrix4.init(hitResult.worldTransform)
let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43)
createPlane(position: hitVector)
}
func createPlane(position: SCNVector3) {
let background = SCNNode()
background.geometry = SCNPlane.init(width: 0.12, height: 0.10) // better set its size
background.geometry?.firstMaterial?.diffuse.contents = "odinBW2.jpeg"
background.position = position
sceneView.scene.rootNode.addChildNode(background)
}
答
1 - 这是你如何让相机的第一旋转:
间距 - 旋转绕X轴
let pitch = sceneView.session.currentFrame?.camera.eulerAngles.x
打哈欠 - 旋转而绕Y轴
let yawn = sceneView.session.currentFrame?.camera.eulerAngles.y
罗尔 - 旋转绕Z轴
let roll = sceneView.session.currentFrame?.camera.eulerAngles.z
2 - 然后你可以创建你想保留(0,如果你不希望任何旋转的旋转相匹配的SCNVector3上轴):
let newRotation = SCNVector3Make(pitch, yawn, roll)
3 - 然后你认为这为:eulerAngles到您的节点:
whateverNode.eulerAngles = newRotation
答
如果您想将节点与相机的方向对齐,只需使用SCNBillboardConstraint即可。
let yourNode = SCNNode()
let billboardConstraint = SCNBillboardConstraint()
billboardConstraint.freeAxes = [.X, .Y, .Z]
yourNode.constraints = [billboardConstraint]
您是否找到任何解决方案? –
最后,我决定准备指导用户,在开始arkit视图之前按正确的方向面对手机。 –