以下のコードは、タッチ座標を SceneKit シーンのワールド座標に変換する必要があります。
ただし、以下の出力に示されているように、 によってunprojectPoint
返されるポイントは、画面のどこをタッチしても事実上同じポイントを返します (iPhone 5s)。
のクラス ドキュメントでunprojectPoint
は、0 から 1 の間の Z 値を使用することを提案していますが、0.5 などの異なる値を使用しても の出力は変化しませんでしたunprojectPoint
。
This SO postでは、 の深さの値を設定する方法について説明してunprojectPoint
いますが、Z 値を 1 より大きい値 (15、20 など) に設定しても、出力は変わりませんでした。
どちらの場合も、から返される X 値と Y 値はunprojectPoint
事実上同じままでした。
1) 正しい使い方はunprojectPoint
?
unprojectPoint
2)カメラの回転はどのように考慮されますか? たとえば、カメラを (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)")
}
出力:
2D ポイント: (154.5, 169.5)。3D ポイント: SCNVector3(x: -0.00111810782、y: 0.0232769605、z: 7.9000001)
2D ポイント: (280.5, 252.0)。3D ポイント: SCNVector3(x: 0.0244967155、y: 0.00650534919、z: 7.9000001)
2D ポイント: (32.0, 181.0)。3D ポイント: SCNVector3(x: -0.0260214079、y: 0.0209390987、z: 7.9000001)
2D ポイント: (12.0, 505.0)。3D ポイント: SCNVector3(x: -0.0300872531、y: -0.0449275821、z: 7.9000001)
2D ポイント: (311.5, 12.5)。3D ポイント: SCNVector3(x: 0.0307987742、y: 0.0551938377、z: 7.9000001)
2D ポイント: (22.5、88.0)。3D ポイント: SCNVector3(x: -0.0279526841、y: 0.0398452766、z: 7.9000001)
2D ポイント: (313.5, 358.0)。3D ポイント: SCNVector3(x: 0.0312053617、y: -0.0150436237、z: 7.9000001)
2D ポイント: (314.0, 507.0)。3D ポイント: SCNVector3(x: 0.0313070044、y: -0.0453341678、z: 7.9000001)
2D ポイント: (155.0, 360.5)。3D ポイント: SCNVector3(x: -0.00101646129、y: -0.0155518558、z: 7.9000001)