我想通过以下功能将点击手势处理的点的世界坐标返回给我。我已经正确地实现了它(使用一些在线资源)来处理帧的中心点,但是我无法在屏幕上移动这一点。
这是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
的世界坐标。
答案 0 :(得分:0)
也许代码可以帮助您。
// 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/