【发布时间】:2021-07-12 00:31:59
【问题描述】:
用户在绘图视图上画一条线,然后我需要将这些点转换为 3d 世界,但将这些点放在一个“表面”中。为此,我将点数组映射为向量(我将 hitTest 与 .featurePoint 一起使用),然后过滤该数组以获取下一个
func didEndDrawing(with points: [CGPoint]) {
guard let transform = sceneView.pointOfView?.transform else { return }
let cameraVectror = SCNVector3(transform.m31, transform.m32, transform.m33)
let farthestVector = points
.reduce((vector: SCNVector3(0, 0, 0), distance: CGFloat.zero)) { result, point in
guard let vector = getVector(for: point) else { return result }
let distance: CGFloat = cameraVectror.distance(to: vector)
return distance > result.distance ? (vector, distance) : result
}
.vector
}
let parentNode = SCNNode()
parentNode.position = farthestVector
如何调整坐标(我猜是 z 位置)以使所有子节点与视点的距离相同? 该应用的理念是在 AR 中进行手绘。
更新
在 Voltan 的帮助下,我能够解决它
points.forEach { point in
let scenePoint = sceneView.unprojectPoint(SCNVector3(point.x, point.y, CGFloat(projectedPoint.z)))
let sphere = SCNSphere(radius: 0.01)
let material = SCNMaterial()
material.diffuse.contents = UIColor.green
sphere.materials = [material]
let node = SCNNode(geometry: sphere)
node.position = scenePoint
sceneView.scene.rootNode.addChildNode(node)
}
【问题讨论】:
标签: ios swift augmented-reality scenekit arkit