Я новичок в приложениях типа дополненной реальности.Я хочу создать приложение, которое будет определять углы комнаты, и после нажатия на такие угловые точки оно будет размещать объекты там и создавать полный план этажа в 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)
}
}
Теперь я хочу определить угол и, основываясь на углах и дверях, хочу создать полный план этажа в 3D в iOS.