【问题标题】:Get World Coordinates of CGPoint in ARSCNView (Swift)在 ARSCNView (Swift) 中获取 CGPoint 的世界坐标
【发布时间】:2018-08-27 13:53:13
【问题描述】:

问题

我希望下面的函数返回由轻击手势处理的点的世界坐标。我已经正确地实现了它(使用一些在线资源)来处理框架的中心点,但是我无法在屏幕上移动这个点。


尝试

这是 getScreenCoordinates 的完整注释和工作代码,它返回一个元组,其中包含 (0) 屏幕坐标的方向向量和 (1) 屏幕坐标的位置向量。问题是通过screenCoord 参数传入的中心点以外的点进行这项工作。

private func getScreenCoordinates(screenCoord:CGPoint) -> (SCNVector3, SCNVector3) { // (direction, position)
      if let frame = self.canvasView.session.currentFrame {
            let mat = SCNMatrix4(frame.camera.transform) // 4x4 transform matrix describing camera in world space
            let direction = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33) // orientation of camera in world space
            let position = SCNVector3(mat.m41, mat.m42, mat.m43) // location of camera in world space

            return (dir, position)
      }
      return (SCNVector3(0, 0, -1), SCNVector3(0, 0, -0.2))
}

所需的解决方案

提供修改后的getScreenCoordinates 函数,该函数返回相同的数据类型,但它不是获取相机帧中心点的世界坐标,而是获取screenCoord 的世界坐标。

【问题讨论】:

  • 对不起,如果我误解了您的问题,但您是否尝试从 CGPoint 获取 SCNVector3?
  • @JoshRobbins 基本上,预期的行为是用户点击屏幕,从点击位置获取一个 CGPoint,然后上面的函数将该点转换为一个 SCNVector3,x 和 y 值对应于如果解是正确的,则 CGPoint 和 az 值应该为 0。它应该从中得到一个位置向量和一个方向向量。

标签: ios swift arkit arscnview scnvector3


【解决方案1】:

也许代码可以帮助你。

// Get transform using ARCamera
func getCameraTransform(for camera: ARCamer) -> MDLTransform {
  return MDLTransform(transform: camera.transform)
}

// Intercept touch and place object 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  guard let touch = touches.first else { return }
  guard touch.tapCount == 1 else { return }

  guard let camera = sceneView.session.currentFrame?.camera else { return }
  let transform = getCameraTranform(for: camera)
  let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
  let cube = SCNNode(geometry: boxGeometry)
  let position = SCNVector3(
   transform.translation.x,
   transform.translation.y,
   transform.translation.z,
  )
  cube.position = position
  sceneView.scene.rootNode.addChildNode(cube)
}

要查看更多详细信息,请参阅此帖子https://arvindravi.com/arkit-a-noobs-guide-part-three/

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 2021-10-22
    • 1970-01-01
    • 2021-06-13
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2019-08-22
    相关资源
    最近更新 更多