Поместите узел перед камерой и поверните

Я хочу показать указатель, когда пользователь дважды нажимает на sceneView. Для этого я хочу использовать 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)
}

1 ответ

Мне удалось решить проблему, установив eulerAngles.y чтобы быть равным Y камеры и отрегулировав X камеры на .pi/2

      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
Другие вопросы по тегам