【问题标题】:Move nodes along axis with respect to camera position相对于相机位置沿轴移动节点
【发布时间】:2023-11-02 08:21:01
【问题描述】:

我目前有一个带有多个子节点的 rootNode,我想作为一个集群一起在场景中移动。我目前通过使用左、右、上和下按钮沿 x 和 y 轴移动它,每次单击按钮时一点一点地更改 rootNode 的位置,例如向左移动:

self.newRootNode.position.x = self.newRootNode.position.x - 0.01

这样,集群总是相对于应用程序初始化时设置的坐标系移动。每次他们改变位置时,我都试图让它相对于用户的左右移动。我试过这样做:

let nodeCam = self.sceneView.session.currentFrame!.camera
let cameraTransform = nodeCam.transform
self.newRootNode.position.x = cameraTransform.columns.3.x - 0.01

我知道这不是我想要的,我一定错过了从相机位置到根节点位置的转换,但我不确定要遵循哪些步骤。 解决这个问题的正确方法是什么?每次用户改变位置时我都需要重置跟踪吗?任何帮助将不胜感激:)

【问题讨论】:

  • 你的意思是你想让你的根节点跟随摄像头,例如在摄像头正在看的位置上保持相同的位置?例如,关于相机在哪里,总是在 SNVector3(0.0,-1)?
  • @JoshRobbins 不,我的意思是,我希望每次用户移动时相机位置基本上都是新的“原点”,并且能够沿 x 轴移动整个集群(例如)根据这个新的原点而不是应用程序初始化时设置的原点的 x 轴。

标签: ios swift arkit


【解决方案1】:

我相信您现在可以在 ARKit 1.5 中的 ARSession 上使用此功能:

func setWorldOrigin(relativeTransform: matrix_float4x4)

其中:

使用指定的变换更改 AR 世界坐标空间的基础。

这是一个示例(未经测试),它可能会为您指明正确的方向:

  func session(_ session: ARSession, didUpdate frame: ARFrame) {

    guard let currentFrame = augmentedRealitySession.currentFrame?.camera else { return }
    let transform = currentFrame.transform
    augmentedRealitySession.setWorldOrigin(relativeTransform: transform )

}

当然不要忘记使用这个ARSCNDebugOptions.showWorldOrigin 为了调试和调整您的矩阵和变换等。

您还可以将delegate callback 中的代码用作IBAction 等。

希望对你有帮助...

【讨论】:

  • 不知道这个,谢谢!会试一试