如何获取SCNCamera正对的网格(SCNNode)点的localCoordinates与localNormal
问题
我创建了一个SCNScene,其中包含一个网格节点(SCNNode)和一个挂载SCNCamera的节点,代码如下:
let sceneView = SCNView() let scene = SCNScene() let meshNode: SCNNode() lazy var cameraNode: SCNNode = { let node = SCNNode() let camera = SCNCamera() node.camera = camera return node }()
用户可旋转相机查看场景,我需要随时获取相机当前正对的网格点的坐标,以及该点的法向量。
简单来说,就是模拟相机向前发射一条射线,获取射线与网格交点的局部坐标(localCoordinates)和局部法向量(localNormal),类似SCNHitTestResult提供的信息:
let hitResults = sceneView.hitTest(touchPoint, options: [:]) if let result: SCNHitTestResult = hitResults.first { let localCoordinates = result.localCoordinates let localNormal = result.localNormal }
请问如何获取相机正对的网格点的localCoordinates和localNormal?
解决方法
通过节点的线段检测方法可实现该需求,具体代码如下:
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 }
内容的提问来源于Stack Exchange,提问作者Ihor Kram
相关产品推荐
相关产品推荐

