下面的代码应该将触摸坐标转换为 SceneKit 场景的世界坐标。
但是,如下面的输出所示,unprojectPoint
无论您触摸屏幕的哪个位置(iPhone 5s),返回的点实际上都会返回相同的点。
类文档unprojectPoint
建议使用 0 到 1 之间的 Z 值,但使用 0.5 等不同的值不会改变unprojectPoint
.
这篇 SO 帖子讨论了如何设置 的深度值unprojectPoint
,但将 Z 值设置为大于 1 的值(例如 15、20)也不会改变输出。
在这两种情况下,从unprojectPoint
有效返回的 X 和 Y 值也保持不变。
1)什么是正确的使用方法unprojectPoint
?
2)如何unprojectPoint
解释相机旋转?例如,如果您将相机移动到 (0, 20, 0) 并将相机向下旋转 90 度使其面向地面,您如何确保旋转被考虑在内?如果您将深度设置为 20 并点击原点,则所需的返回值unprojectPoint
应该是 (0, 0, 0)。
3)如何unprojectPoint
在摄像头前返回值(例如,Z 值低于摄像头的 Z 值)
代码:
cameraNode.position = SCNVector3(x: 0, y: Float(0), z: Float(8))
func sceneViewTapped(recognizer: UITapGestureRecognizer) {
let point = recognizer.locationInView(sceneView)
let unprojectPoint = SCNVector3(x: Float(point.x), y: Float(point.y), z: 0.0)
let scenePos = sceneView.unprojectPoint(unprojectPoint)
print("2D point: \(point). 3D point: \(scenePos)")
}
输出:
二维点:(154.5, 169.5)。3D点:SCNVector3(x:-0.00111810782,y:0.0232769605,z:7.9000001)
二维点:(280.5, 252.0)。3D点:SCNVector3(x:0.0244967155,y:0.00650534919,z:7.9000001)
二维点:(32.0, 181.0)。3D点:SCNVector3(x:-0.0260214079,y:0.0209390987,z:7.9000001)
二维点:(12.0, 505.0)。3D点:SCNVector3(x:-0.0300872531,y:-0.0449275821,z:7.9000001)
二维点:(311.5, 12.5)。3D点:SCNVector3(x:0.0307987742,y:0.0551938377,z:7.9000001)
二维点:(22.5, 88.0)。3D点:SCNVector3(x:-0.0279526841,y:0.0398452766,z:7.9000001)
二维点:(313.5, 358.0)。3D点:SCNVector3(x:0.0312053617,y:-0.0150436237,z:7.9000001)
二维点:(314.0, 507.0)。3D点:SCNVector3(x:0.0313070044,y:-0.0453341678,z:7.9000001)
二维点:(155.0, 360.5)。3D点:SCNVector3(x:-0.00101646129,y:-0.0155518558,z:7.9000001)