首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点名被USDZ模型覆盖

节点名被USDZ模型覆盖
EN

Stack Overflow用户
提问于 2022-06-16 22:26:59
回答 1查看 104关注 0票数 2

我目前正在开发一个iOS应用程序,它使用ARKit和SceneKit来实现增强现实。在将.usdz模型加载到场景中时,我遇到了问题。我可以正确地将它加载到场景中,但是,当我尝试在点击后得到节点名称(在其中加载了.usdz模型),它返回的是.usdz名称,而不是我给它的名称。

用于加载.usdz模型的代码是:

代码语言:javascript
复制
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)

要捕获节点上的抽头,代码是:

代码语言:javascript
复制
@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“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-17 06:30:03

USDZ模型的名称不会被覆盖。这是SceneKit命中测试和场景层次结构的特点.执行命中测试搜索时,SceneKit沿着指定的射线查找SCNGeometry对象(而不是主节点)。因此,一旦命中测试完成,您所需要做的就是找到相应的父节点。

试试下面的代码:

代码语言:javascript
复制
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)
    }
}

你的命中测试方法:

代码语言:javascript
复制
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
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72652507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档