我在屏幕上放置模型时遇到了一些麻烦。模型出现了,但它出现在我的上方而不是我的前方。理想情况下,我希望模型出现在被点击的位置。请帮助!
此处此功能可从AWS成功下载模型:
private func dowloadModel(){
let url = URL(string: "url_string")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error{
print(error.localizedDescription)
return
}
if let data = data{
print(data)
let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let documentDirectory = documentDirectories.first{
let fileURL = documentDirectory.appendingPathComponent("Food.scn")
let dataNS : NSData? = data as NSData
try! dataNS?.write(to: fileURL, options: .atomic)
print("Saved!")
}
}
}.resume()
}
这里将模型渲染到屏幕上:
private func registerGestureRecogniser(){
print("Tapped")
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
self.sceneView.addGestureRecognizer(tapGestureRecognizer)
}
这里是点击的功能:
@objc func handleTap(gesture: UITapGestureRecognizer) {
let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let documentDirectory = documentDirectories.first{
let fileURL = documentDirectory.appendingPathComponent("Food.scn")
do{
let scene = try SCNScene(url: fileURL, options: nil)
let node = scene.rootNode.childNode(withName: "Burger", recursively: true)!
node.position = SCNVector3Make(0, 0, 0);
self.sceneView.scene.rootNode.addChildNode(node)
}
catch{
print(error)
}
}
}
我也收到错误:
Error: Failed to load <C3DImage
执行时
node.position = SCNVector3Make(0, 0, 0);
self.sceneView.scene.rootNode.addChildNode(node)
您将模型节点放置在场景的rootNode上,当场景开始时,其位置由ARKit确定。
[如果您希望模型出现在相机的前面,则需要获取相机变换(session.currentFrame?.camera.transform
),修改-z
组件,并将其设置为节点的位置。或者,如果要将模型放置在曲面上,请进行光线投射,然后将raycastResult
simdWorldPosition
用作节点的simdWorldPosition
。