感谢 stackoverflow 使用 Model I/O swift 概念解决了
第一步#
// first need to download file to local directory
func downloadSceneTask(){
//1. Get The URL Of The SCN File
guard let url = URL(string: "Your_url") else { return }
//2. Create The Download Session
let downloadSession = URLSession(configuration: URLSession.shared.configuration, delegate: self, delegateQueue: nil)
//3. Create The Download Task & Run It
let downloadTask = downloadSession.downloadTask(with: url)
downloadTask.resume()
}
第二步#
现在我已将 url 保存在本地设备内存中,现在我将单击相机中的任意位置并将该本地 url 加载到场景中。
func addTapGestureToSceneView() {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didReceiveTapGesture(_:)))
sceneView.addGestureRecognizer(tapGestureRecognizer)
}
@objc func didReceiveTapGesture(_ sender: UITapGestureRecognizer) {
let location = sender.location(in: sceneView)
guard let hitTestResult = sceneView.hitTest(location, types: [.featurePoint, .estimatedHorizontalPlane]).first
else { return }
let results = self.sceneView.hitTest(location, types: .featurePoint)
// 2
guard let result = results.first else {
return
}
// 3
let translation = result.worldTransform.translation
self.translation = translation
anchor = ARAnchor(transform: hitTestResult.worldTransform)
sceneView.session.add(anchor: anchor!)
}
第三步#
我的 ViewDidLoad 函数是这样的
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
addTapGestureToSceneView()
downloadSceneTask()
}
第四步#
添加协议 ARSCNViewDelegate
// Getting file from local directory and load
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard !(anchor is ARPlaneAnchor) else { return }
if let droneNode = loadModel() {
DispatchQueue.main.async {
node.addChildNode(droneNode)
}
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
// Loads The SCNFile From The Documents Directory
func loadModel() -> SCNNode? {
//1. Get The Path Of The Downloaded File
let downloadedScenePath = getDocumentsDirectory().appendingPathComponent("table.obj")
let asset = MDLAsset(url: downloadedScenePath)
let object = asset.object(at: 0)
let node = SCNNode(mdlObject: object)
//7. Add It To The Scene
return node
}
}