【问题标题】:Place node in front of the camera and rotate将节点放在相机前面并旋转
【发布时间】:2021-07-07 01:14:59
【问题描述】:

我想在用户双击场景视图时显示一个指针。为此,我想使用 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)
}

【问题讨论】:

    标签: arkit scnnode scnscene scnvector3


    【解决方案1】:

    我可以通过将eulerAngles.y 设置为等于相机的 Y 并通过 .pi/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
    

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 2019-10-25
      • 1970-01-01
      • 2017-12-03
      • 2018-07-06
      • 2013-09-04
      • 2015-02-28
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多