我正在与ARKit 2和ARWorldMapData一起工作,我已经创建了一个AR世界,它通过link here中的地图数据等来识别你的周围环境。现在我正试图找出如何获取所有的特征点,然后连接起来创建一个我周围的网格/ARWorldMap(我认为ARKit 2以前从未尝试过)。尽管我相信你可以通过将特征点与UIBezierPath连接来实现。以便可以使用路径创建的形状作为节点几何体。
在测试之后,下面的代码不会在屏幕上产生任何东西,或者至少我看不到它。所以现在这就是问题所在。尽管我相信这可能会有更多的问题。
我几乎只是用这个问题中的例子来看看它是否可以远程工作。
代码:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

guard !(anchor is ARPlaneAnchor) else { return }

let testNode = bezierNode.clone()

DispatchQueue.main.async {
    node.addChildNode(testNode)
}

}


func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

// take the current frame/views features points and create an array out of them

guard let currentFrame = self.sceneView.session.currentFrame,
    let featurePointsArray = currentFrame.rawFeaturePoints?.points else { return }

// Create STROKE BezierPath

let strokeBezierPath = UIBezierPath()
strokeBezierPath.lineWidth = 0.1

 // Start the BezierPath at the first feature points on the screen

strokeBezierPath.move(to: CGPoint(x: CGFloat(featurePointsArray.first!.x), y: CGFloat(featurePointsArray.first!.y)))

// iterate through all feature pints and add then to the path

featurePointsArray.forEach { (pointLocation) in
    strokeBezierPath.addLine(to: CGPoint(x: CGFloat(pointLocation.x), y: CGFloat(pointLocation.y)))
}

// Close the Stroke BezierPath

strokeBezierPath.close()

// Do fancy work, not sure what this does

let cgPath = strokeBezierPath.cgPath.copy(
    strokingWithWidth: strokeBezierPath.lineWidth,
    lineCap: strokeBezierPath.lineCapStyle,
    lineJoin: strokeBezierPath.lineJoinStyle,
    miterLimit: strokeBezierPath.miterLimit)

// Create the actually bezierpath that were going to use to create the nodes geometry

let bezierPath = UIBezierPath(cgPath: cgPath)
let shape = SCNShape(path: bezierPath, extrusionDepth: 0.1)
shape.firstMaterial?.diffuse.contents = UIColor.blue
let node = SCNNode(geometry: shape)

// Add newly created node to the reference that gets passed to the didAdd delegate


bezierNode = node

// Then anchor gets added when we touch the screen with a tap gesture temporary that call the didAdd delegate

}

因此,它几乎可以占用这样一个房间,填充墙/点来创建网格:
here
结果看起来是这样的,但很明显,从实际站在房间里的角度来看,是真人大小的:
ios - (ARKit 2 Room Scanner)如何通过ARKit 2和ARWorldMap使用UIBezierPath和featurePoints创建具有周围环境几何形状的节点-LMLPHP
如果有任何天才可以帮助重构我的代码,有比这更好的代码,或者可能知道如何真正做到这一点。那太棒了!.谢谢

最佳答案

ARWorldMap可以存储特征点,但对您来说更有趣的是,它还将保存ARPlaneAnchors,这些基本上是已经为您构建的网格。结果不会是完美的,但更接近你所要达到的目标,而且更容易。我之前做过这个工作,在twitter上展示了一个视频,展示了一个公园里的可视ARWorldMap,每次你在那个位置启动这个应用程序,它都会得到扩展(改进)。ARKit可以从特征点检测平面,数学已经为您完成了,因此使用它而不是试图将特征点链接在一起。
https://twitter.com/londonrom/status/1010150386848628736

关于ios - (ARKit 2 Room Scanner)如何通过ARKit 2和ARWorldMap使用UIBezierPath和featurePoints创建具有周围环境几何形状的节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53973939/

10-13 09:17