从起始值到终止值绘制直线ARKit [英] Draw straight line from start value to end value ARKit
问题描述
一如既往,我需要您的帮助.我需要从一个起始值(声明为 SCNVector3
)绘制一条直线,并将其连接到现实世界中直到终点的位置.
As always I need your help. I need to draw a straight line from a start value (declared as SCNVector3
) and connected to the position in the real world till the end point.
有人可以用几行代码向我解释我该怎么做?谢谢!
Can someone explain to me with some lines of code how can I do it? Thank you!
推荐答案
您需要实现: touchesBegan
, touchesMoved
, touchesEnded
, touchesCancelled
用于您的相机视图控制器.在 touchesBegan
中,您需要在 UITouch
位置为当前的ARFrame进行 hitTest
.然后,您将拥有您的 startPosition
和您的 lastTouch
,这是您的起始 UITouch
.
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
.
然后,您将需要添加间隔为 0.016_667
(60Hz)的计时器,该间隔将在摄像机移动时使用 hitTest
更新您的最后触摸位置.与您在 touchesMoved
函数中所做的相同.在 touchesMoved
中,您还将更新您的 lastTouch
.因此,此时您将拥有 startPosition
和 currentPosition
,即 SCNVector3
.如果需要直线,则可以为这些位置重新绘制SCNCylinder(例如,半径为0.001m).
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.
在 touchesEnded
的最后一步,您将修复您的行,或者,如果 touchesCancelled
,您将其删除并清除 lastTouch
.
At last step in touchesEnded
you'll fix your line, or if touchesCancelled
you will remove it and clear lastTouch
.
UPD
如果需要在屏幕上显示2D线,则需要对ARSceneView使用 projectPoint
.
If you need 2D line on the screen, then you'll need to use projectPoint
for your ARSceneView.
3D线条图
要绘制3D线,您可以 SCNGeometry
使用扩展名:
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])
}
}
使用:
let line = SCNGeometry.line(from: startPosition, to: endPosition)
let lineNode = SCNNode(geometry: line)
lineNode.position = SCNVector3Zero
sceneView.scene.rootNode.addChildNode(lineNode)
这篇关于从起始值到终止值绘制直线ARKit的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!