我有一台SCNScene.在它里面,我有一个网格(SCNNode)和另一个带有SCNCamera的SCNNode.
let sceneView = SCNView()
let scene = SCNScene()
let meshNode: SCNNode()
lazy var cameraNode: SCNNode = {
let node = SCNNode()
let camera = SCNCamera()
node.camera = camera
return node
}()
用户可以旋转相机四处看看. 无论何时我想,我需要能够得到网格点的坐标,相机正在看,和法线向量在这一点.
我想更简单地解释一下.想象一下,相机将一条激光光线指向它自己前面(在它看的方向).这条光线打到了网眼上.我需要这个点(光线击中网格的位置)的坐标.在这一点上还有一个法矢.
基本上,我需要的信息类似于SCNHitTestResult提供的信息:
let hitResults = sceneView.hitTest(touchPoint, options: [:])
if let result: SCNHitTestResult = hitResults.first {
let localCoordinates = result.localCoordinates
let localNormal = result.localNormal
}
我如何才能在相机正在观察的网格上获得一个点的localCoordinates和localNormal?
Solved!个
在@mnuages和这个答案https://stackoverflow.com/a/42034883/19433422的帮助下,我解决了问题:
func sceneSpacePosition(inFrontOf node: SCNNode, atDistance distance: Float) -> SCNVector3 {
let localPosition = SCNVector3(x: 0, y: 0, z: Float(CGFloat(-distance)))
let scenePosition = node.convertPosition(localPosition, to: nil)
return scenePosition
}
let to: SCNVector3 = sceneSpacePosition(inFrontOf: cameraNode, atDistance: Float(radius))
if let hitTest = scene.rootNode.hitTestWithSegment(from: cameraNode.position, to: to, options: .none).first {
let localCoordinates = hitTest.localCoordinates
let localNormal = hitTest.localNormal
}