我目前正在开发一个iOS应用程序,它使用ARKit和SceneKit来实现增强现实。在将.usdz模型加载到场景中时,我遇到了问题。我可以正确地将它加载到场景中,但是,当我尝试在点击后得到节点名称(在其中加载了.usdz模型),它返回的是.usdz名称,而不是我给它的名称。
用于加载.usdz模型的代码是:
let mdlAsset = MDLAsset(url: urlPath)
mdlAsset.loadTextures()
let asset = mdlAsset.object(at: 0) // extract first object
var assetNode = SCNNode(mdlObject: asset)
assetNode = SCNNode(mdlObject: asset)
assetNode.name = "Node-2"
sceneView.scene.rootNode.addChildNode(assetNode)要捕获节点上的抽头,代码是:
@objc func handleTap(recognizer: UITapGestureRecognizer){
let location = recognizer.location(in: sceneView)
let results = sceneView.hitTest(location, options: nil)
guard recognizer.state == .ended else { return }
if results.count > 0 {
let result = results[0] as SCNHitTestResult
let node = result.node
print(node.name)
}
}正如我前面提到的,当我点击对象时,它会打印“0")值,这个值可以在右上角的模型详细信息页中找到。我所期望的正确值是"Node-2“。
发布于 2022-06-17 06:30:03
USDZ模型的名称不会被覆盖。这是SceneKit命中测试和场景层次结构的特点.执行命中测试搜索时,SceneKit沿着指定的射线查找SCNGeometry对象(而不是主节点)。因此,一旦命中测试完成,您所需要做的就是找到相应的父节点。
试试下面的代码:
import SceneKit.ModelIO
class GameViewController: UIViewController {
var sceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView = (self.view as! SCNView)
let scene = SCNScene(named: "art.scnassets/ship.scn")!
sceneView.scene = SCNScene()
sceneView.backgroundColor = .black
let recog = UITapGestureRecognizer(target: self, action: #selector(tap))
sceneView.addGestureRecognizer(recog)
// ASSET
let mdlAsset = MDLAsset(scnScene: scene)
let asset = mdlAsset.object(at: 0)
let node = SCNNode(mdlObject: asset.children[0])
node.name = "Main-Node-Name" // former "ship"
node.childNodes[0].name = "SubNode-Name" // former "shipMesh"
node.childNodes[0].childNodes[0].name = "Geo-Name" // former "Scrap_MeshShape"
sceneView.scene?.rootNode.addChildNode(node)
}
}你的命中测试方法:
extension GameViewController {
@objc func tap(recognizer: UITapGestureRecognizer) {
let location = recognizer.location(in: sceneView)
let results = sceneView.hitTest(location)
guard recognizer.state == .ended else { return }
if results.count > 0 {
let result = results[0] as SCNHitTestResult
let node = result.node
print(node.name!) // Geo-Name
print(node.parent!.name!) // SubNode-Name
print(node.parent!.parent!.name!) // Main-Node-Name
}
}
}https://stackoverflow.com/questions/72652507
复制相似问题