我是增强现实类型应用程序的初学者。我想创建一个可以检测房间角落的应用程序,点击这些角落点后,它将在其中放置对象并使用增强现实技术在3D中创建完整的平面图。
我现在可以看到默认对象,也可以检测水平地板并将网格图像放置在此处。
我从那里检测水平流并放置网格图像的视图控制器。
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
var planes = [ARPlaneAnchor: Plane]()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.showsStatistics = true
sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = .horizontal
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}
// MARK: - ARSCNViewDelegate
func session(_ session: ARSession, didFailWithError error: Error) {
}
func sessionWasInterrupted(_ session: ARSession) {
}
func sessionInterruptionEnded(_ session: ARSession) {
}
func addPlane(node: SCNNode, anchor: ARPlaneAnchor) {
let plane = Plane(anchor)
planes[anchor] = plane
node.addChildNode(plane)
}
func updatePlane(anchor: ARPlaneAnchor) {
if let plane = planes[anchor] {
plane.update(anchor)
}
}
// MARK: - Add, Update, Remove Object Methods
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.main.async {
if let planeAnchor = anchor as? ARPlaneAnchor {
self.addPlane(node: node, anchor: planeAnchor)
}
}
}
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.main.async {
if let planeAnchor = anchor as? ARPlaneAnchor {
self.updatePlane(anchor: planeAnchor)
}
}
}
}
节点类
class Plane: SCNNode {
var planeAnchor: ARPlaneAnchor
var planeGeometry: SCNPlane
var planeNode: SCNNode
init(_ anchor: ARPlaneAnchor) {
self.planeAnchor = anchor
let grid = UIImage(named: "plane_grid.png")
self.planeGeometry = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
let material = SCNMaterial()
material.diffuse.contents = grid
self.planeGeometry.materials = [material]
self.planeGeometry.firstMaterial?.transparency = 0.5
self.planeNode = SCNNode(geometry: planeGeometry)
self.planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2.0, 1, 0, 0)
super.init()
self.addChildNode(planeNode)
self.position = SCNVector3(anchor.center.x, anchor.center.y, anchor.center.z) // 2 mm below the origin of plane.
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(_ anchor: ARPlaneAnchor) {
self.planeAnchor = anchor
self.planeGeometry.width = CGFloat(anchor.extent.x)
self.planeGeometry.height = CGFloat(anchor.extent.z)
self.position = SCNVector3Make(anchor.center.x, anchor.center.y, anchor.center.z)
}
}
现在,我想检测拐角,并希望基于拐角和门,在iOS 3D中创建完整的平面图。