我有一台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
}

我如何才能在相机正在观察的网格上获得一个点的localCoordinateslocalNormal

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
}

推荐答案

您可以使用[SCNNode hitTestWithSegmentFromPoint:toPoint:options:]来实现这一点.

或者,如果摄像机是当前视点,则在SCNView的中间进行命中测试可以达到您想要的效果.

Swift相关问答推荐

如何在AudioKit中实现自定义音效 node ?

了解SWIFT中的任务行为

通常从数组调用的SWIFT静态协议函数

按下一步后无法让文本字段切换焦点

如何根据 DatePicker 中选定的日期实现 TabView 页面切换?

为什么Swift可以在没有足够信息的情况下推断类型?

是否可以利用 Codable 从 Dictionary 初始化符合类型

从一个范围减go 多个范围

如何制作具有 2 个视图的 3D 旋转动画?

在 Swift 中增量写入大型文本文件的最佳方法

故事板未在助手中显示视图控制器

如何以快速 Select 器菜单样式调整图像大小

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

我如何从 UIAlertController 导航到新屏幕(swiftUI)

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

NSFontAttributeName 已更改为 String

如何在界面生成器中创建 UILayoutGuide?

使 struct 可散列?

Swift 中惰性 var 的优势是什么

你如何在 UIBarItem 中使用 setTitleTextAttributes:forState?