gpt4 book ai didi

ios - 是否可以使用 ARKit 检测放置有物体的地板?

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:29 25 4
gpt4 key购买 nike

我想使用 ARkit 检测地板,当存在物体(例如 table 等)并想为检测到的表面着色时,这是否可以使用 ARkit,我是 ARKit 世界的新手,不确定这是否可能以及在哪里开始。

最佳答案

你的session配置函数应该是这样的,你在viewWillAppear上调用

func setUpSceneView() {
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = .horizontal

sceneView.session.run(configuration)

sceneView.delegate = self
sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
}

你也可以使用 .vertical 来表示墙壁或其他任何东西..

在 View 加载时添加一个 tapGestureRecognizer 到场景中,这样你就可以在你点击到检测到的表面的地方添加 SCNNode

在 viewDidLoad 中添加 TapGestureToSceneView()

func addTapGestureToSceneView() {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(placeOnSurface.addNodeToSceneView(withGestureRecognizer:)))
sceneView.addGestureRecognizer(tapGestureRecognizer)
}

addNodeToSceneView 方法会在检测到平面时将 SNNode 放置在表面上。

@objc func addShipToSceneView(withGestureRecognizer recognizer: UIGestureRecognizer) {
let tapLocation = recognizer.location(in: sceneView)
let hitTestResults = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)

guard let hitTestResult = hitTestResults.first else { return }
let translation = hitTestResult.worldTransform.translation
let x = translation.x
let y = translation.y
let z = translation.z

var name:String = "YourModel.obj" //you can add node whatever


let group = DispatchGroup()
group.enter()
DispatchQueue.global(qos: .background).async {
print("This is run on the background queue")

let tempScene = SCNScene(named: name)!
var geom:SCNGeometry = tempScene.rootNode.childNodes[0].geometry!
var boxNode:SCNNode = SCNNode(geometry: geom)
boxNode.position = SCNVector3(x,y,z)
self.sceneView.scene.rootNode.addChildNode(boxNode)
group.leave()

}
group.notify(queue: .main){
//Here you know that the node is has been put
}
}

and you need some functions for render



extension float4x4 {
var translation: float3 {
let translation = self.columns.3
return float3(translation.x, translation.y, translation.z)
}
}



extension placeOnSurface: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
// 1
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

// 2
let width = CGFloat(planeAnchor.extent.x)
let height = CGFloat(planeAnchor.extent.z)
let plane = SCNPlane(width: width, height: height)

// 3
plane.materials.first?.diffuse.contents = UIColor.transparentLightBlue

// 4
let planeNode = SCNNode(geometry: plane)

// 5
let x = CGFloat(planeAnchor.center.x)
let y = CGFloat(planeAnchor.center.y)
let z = CGFloat(planeAnchor.center.z)
planeNode.position = SCNVector3(x,y,z)
planeNode.eulerAngles.x = -.pi / 2

// 6
node.addChildNode(planeNode)
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
// 1
guard let planeAnchor = anchor as? ARPlaneAnchor,
let planeNode = node.childNodes.first,
let plane = planeNode.geometry as? SCNPlane
else { return }

// 2
let width = CGFloat(planeAnchor.extent.x)
let height = CGFloat(planeAnchor.extent.z)
plane.width = width
plane.height = height

// 3
let x = CGFloat(planeAnchor.center.x)
let y = CGFloat(planeAnchor.center.y)
let z = CGFloat(planeAnchor.center.z)
planeNode.position = SCNVector3(x, y, z)
}
}

我也建议你在viewDidLoad中调用函数configureLighting()以获得更好的用户体验

func configureLighting() {
sceneView.autoenablesDefaultLighting = true
sceneView.automaticallyUpdatesLighting = true
}

关于ios - 是否可以使用 ARKit 检测放置有物体的地板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com