从起始值到结束值绘制直线 ARKit

Draw straight line from start value to end value ARKit

一如既往,我需要你的帮助。我需要从起始值(声明为 SCNVector3)画一条直线并连接到现实世界中的位置直到终点。

有人可以用几行代码向我解释我该怎么做吗? 谢谢!

您需要实施: touchesBegantouchesMovedtouchesEndedtouchesCancelled 为您的相机视图控制器。 在 touchesBegan 中,您需要在 UITouch 位置为当前 ARFrame 创建 hitTest。然后你会得到你的 startPosition 和你的 lastTouch,这是你的开始 UITouch.

然后您将需要添加具有 0.016_667 间隔 (60Hz) 的计时器,当您的相机移动时,它将使用 hitTest 更新您最后一次触摸的位置。您将在 touchesMoved 函数中执行相同的操作。在 touchesMoved 中,您还将更新 lastTouch。所以此时你将拥有 startPositioncurrentPosition,即 SCNVector3。如果你需要直线,你可以为这些位置重新绘制 SCNCylinder(例如半径为 0.001m)。

touchesEnded 的最后一步,您将修复您的行,或者如果 touchesCancelled 您将删除它并清除 lastTouch

UPD

如果您需要屏幕上的 2D 线,那么您需要为您的 ARSceneView 使用 projectPoint

3D线描

要绘制 3D 线,您可以SCNGeometry使用扩展名:

extension SCNGeometry {
    class func line(from vector1: SCNVector3, to vector2: SCNVector3) -> SCNGeometry {
        let indices: [Int32] = [0, 1]
        let source = SCNGeometrySource(vertices: [vector1, vector2])
        let element = SCNGeometryElement(indices: indices, primitiveType: .line)
        return SCNGeometry(sources: [source], elements: [element])
    }
}

使用:

let line = SCNGeometry.line(from: startPosition, to: endPosition)
let lineNode = SCNNode(geometry: line)
lineNode.position = SCNVector3Zero
sceneView.scene.rootNode.addChildNode(lineNode)