You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:24