将节点放置在摄影机前面并旋转



我想在用户双击场景视图时显示一个指针。为此,我想使用SCNTorus,因为从某个角度来看,它是一个圆。

let geometry = SCNTorus(ringRadius: 0.01, pipeRadius: 0.001)
let node = SCNNode(geometry: geometry)

我已经从hitTest中得到了一个向量,我用它作为节点的位置

private func getVector(for point: CGPoint) -> SCNVector3? {
guard let hitTest = self.sceneView.hitTest(point, types: .featurePoint).first else {
return nil
}
let transform = SCNMatrix4.init(hitTest.worldTransform)
let vector = SCNVector3Make(transform.m41, transform.m42, transform.m43)
return vector
}

如何在添加节点时将其转换为始终显示为圆形。

对于由.pi/2沿X轴旋转的垂直设备位置,效果很好,但当设备在空间中移动时,它会中断,所以我不能硬编码角度

node.eulerAngles.x = .pi / 2
sceneView.scene.rootNode.addChildNode(node)

我认为我需要以某种方式sceneView.pointOfView来应用转换。但我一直呆在这里。

这是的完整代码

@objc private func didDoubleTap(_ sender: UITapGestureRecognizer) {

let point = sender.location(in: sceneView)
guard let vector = getVector(for: point) else { return }
guard let pov = sceneView.pointOfView else { return }
guard let camera = sceneView.session.currentFrame?.camera else { return }
let geometry = SCNTorus(ringRadius: 0.01, pipeRadius: 0.001)
let node = SCNNode(geometry: geometry)
node.position = vector
node.eulerAngles.x = .pi / 2
sceneView.scene.rootNode.addChildNode(node)
animatePointingNode(node)
}

我可以通过将eulerAngles.y设置为等于相机的Y并通过π/2 调整相机的X来解决这个问题

guard let camera = sceneView.session.currentFrame?.camera else { return }
pointerNode.position = vector
pointerNode.eulerAngles.x = camera.eulerAngles.x + .pi / 2
pointerNode.eulerAngles.y = camera.eulerAngles.y

相关内容

  • 没有找到相关文章

最新更新