我一直在尝试ARKit,并且一直在尝试调整Apple的对焦范围以在水平和垂直平面检测之间切换。目标是首先在水平面上进行测量,在其上放置一个节点(例如在地板上),然后立即切换到垂直平面检测,并且焦点正方形现在也垂直定向。
希望有人可以阐明如何最好地解决这个问题。
我一直在使用怀特史密斯公司对Apple Focus Square的实现作为起点:https://github.com/whitesmith/MeasureThings
我在一些地方修改了代码,以尝试实现所需的行为。
我正在尝试从视图控制器中的handleTapGesture(sender:UITapGestureRecognizer)将Focus Square加载到适当的方向,期望的行为是第一次单击将节点放置在水平面上,然后将方向切换为垂直方向,第二次单击将节点放置在垂直平面上。
我尝试过向FocusSquare类添加一种方法,该方法可重新初始化焦点正方形,但是会产生意外的行为,例如同时具有水平和垂直焦点正方形,或者根本没有。
要获得垂直焦点平方,只需将planeNode.eulerAngles更改为以下值即可达到所需的结果。
planeNode.eulerAngles = SCNVector3Make(Float.pi / 1.0, 0, 0) // Vertical
在ViewController类之内
// Configuration - Vertical Plane Detection Enabled
viewDidLoad()
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
在FocusSqaure类中
// Vertical planeNode eulerAngles added
// state parameter added to focusSquareNode method for if statement between vertical & horizontal angles.
func focusSquareNode(state: Bool) -> SCNNode {
if state == true {
planeNode.eulerAngles = SCNVector3Make(Float.pi / 2.0, 0, 0) // Horizontal
print("eulerAngles Horizontal")
} else {
planeNode.eulerAngles = SCNVector3Make(Float.pi / 1.0, 0, 0) // Vertical
print("eulerAngles Vertical")
}
}
extension FocusSquare {
func planeChanged(measuringHorizontalPlane: Bool, sender: String) {
print("CALLED!! PlaneChangedFocusSquare, is measuringHorizontalPlane = \(measuringHorizontalPlane), sender = \(sender)")
isHorizontal = measuringHorizontalPlane
self.addChildNode(focusSquareNode(state: measuringHorizontalPlane))
open()
lastPositionOnPlane = nil
lastPosition = nil
recentFocusSquarePositions = []
anchorsOfVisitedPlanes = []
}
预期结果:在水平和垂直平面之间切换焦点正方形
实际结果:水平和垂直焦点框同时出现或根本不出现。