从起始值到结束值绘制直线 ARKit
Draw straight line from start value to end value ARKit
一如既往,我需要你的帮助。我需要从起始值(声明为 SCNVector3
)画一条直线并连接到现实世界中的位置直到终点。
有人可以用几行代码向我解释我该怎么做吗?
谢谢!
您需要实施:
touchesBegan
、touchesMoved
、touchesEnded
、touchesCancelled
为您的相机视图控制器。
在 touchesBegan
中,您需要在 UITouch
位置为当前 ARFrame 创建 hitTest
。然后你会得到你的 startPosition
和你的 lastTouch
,这是你的开始 UITouch
.
然后您将需要添加具有 0.016_667
间隔 (60Hz) 的计时器,当您的相机移动时,它将使用 hitTest
更新您最后一次触摸的位置。您将在 touchesMoved
函数中执行相同的操作。在 touchesMoved
中,您还将更新 lastTouch
。所以此时你将拥有 startPosition
和 currentPosition
,即 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)
一如既往,我需要你的帮助。我需要从起始值(声明为 SCNVector3
)画一条直线并连接到现实世界中的位置直到终点。
有人可以用几行代码向我解释我该怎么做吗? 谢谢!
您需要实施:
touchesBegan
、touchesMoved
、touchesEnded
、touchesCancelled
为您的相机视图控制器。
在 touchesBegan
中,您需要在 UITouch
位置为当前 ARFrame 创建 hitTest
。然后你会得到你的 startPosition
和你的 lastTouch
,这是你的开始 UITouch
.
然后您将需要添加具有 0.016_667
间隔 (60Hz) 的计时器,当您的相机移动时,它将使用 hitTest
更新您最后一次触摸的位置。您将在 touchesMoved
函数中执行相同的操作。在 touchesMoved
中,您还将更新 lastTouch
。所以此时你将拥有 startPosition
和 currentPosition
,即 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)