You'll need to implement:
touchesBegan
, touchesMoved
, touchesEnded
, touchesCancelled
for your camera view controller.
In touchesBegan
you will need to make hitTest
for current ARFrame in the UITouch
location. Then you'll have your startPosition
and your lastTouch
, which is your start UITouch
.
Then you will need to add timer with 0.016_667
interval (60Hz) which will update your last touch position with hitTest
when you camera moves. Same you'll do in touchesMoved
function. And in touchesMoved
you'll also update your lastTouch
. So at this point you'll have your startPosition
and currentPosition
, which is SCNVector3
. And you can just redraw SCNCylinder (with 0.001m radius for example) for those positions if you need straight line.
At last step in touchesEnded
you'll fix your line, or if touchesCancelled
you will remove it and clear lastTouch
.
UPD
If you need 2D line on the screen, then you'll need to use projectPoint
for your ARSceneView.
3D line drawing
For drawing 3D line you could SCNGeometry
use extension:
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])
}
}
Using:
let line = SCNGeometry.line(from: startPosition, to: endPosition)
let lineNode = SCNNode(geometry: line)
lineNode.position = SCNVector3Zero
sceneView.scene.rootNode.addChildNode(lineNode)