我有我的相机的位置和方向,屏幕上的CGPoint触摸位置,我需要在我的3D SCNNode环境中触摸屏幕的方向上的线(最好是矢量),我该怎么做到这一点?
代码片段会非常有用。
答案 0 :(得分:3)
您可以使用SCNSceneRenderer.unprojectPoint(_:)
方法。
此方法由SCNView
实施,将您的点坐标视为SCNVector3
。在视图的坐标空间中设置前两个元素。 Apple描述了第三个元素的使用:
点参数的z坐标描述了相对于渲染器的视锥体的近和远剪切平面取消投影点的深度(由其定义) 观点看法 节点)。取消投影z坐标为0.0的点将返回近剪裁平面上的点;取消投影z坐标为1.0的点将返回远剪裁平面上的一个点。
您不是在寻找这些点的位置,而是寻找连接它们的线。只需减去两者即可获得该行。
func getDirection(for point: CGPoint, in view: SCNView) -> SCNVector3 {
let farPoint = view.unprojectPoint(SCNVector3Make(point.x, point.y, 1))
let nearPoint = view.unprojectPoint(SCNVector3Make(point.x, point.y, 0))
return SCNVector3Make(farPoint.x - nearPoint.x, farPoint.y - nearPoint.y, farPoint.z - nearPoint.z)
}