【问题标题】:Dynamically scale scene/USDZ file to plane?将场景/USDZ 文件动态缩放到平面?
【发布时间】:2020-10-15 09:40:23
【问题描述】:

目前,我的应用正在跟踪图像。找到后,它将 3D 模型放置在其顶部。我的问题是:是否可以自动将 USDZ/场景文件缩放到平面?

我目前正在跟踪一张明信片(5X7 英寸),并且我希望模型在检测到后简单地放在明信片上(与我的大多数 3d 模型相比非常小)。我目前不得不手动进入每个文件并对其进行缩放,但这需要大量手动时间。

我认为会有一种更简单的方法来以编程方式缩放模型,但不确定。

class ViewController: UIViewController, ARSCNViewDelegate {
    
    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
    }
    
    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            
            let configuration = ARImageTrackingConfiguration()
            
            guard let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "Photos", bundle: Bundle.main) else {
                print("No images available")
                return
            }
            
            configuration.trackingImages = trackedImages
            configuration.maximumNumberOfTrackedImages = 7
            
            sceneView.session.run(configuration)
        }
    

//MARK-:CODE WHERE I PLACE MY 3D MODEL

        func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
            
            let node = SCNNode()
            
            if let imageAnchor = anchor as? ARImageAnchor {
                let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)

                plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.8)

                let planeNode = SCNNode(geometry: plane)
                planeNode.eulerAngles.x = -.pi / 2

                guard let url = Bundle.main.url(forResource: "hamburguer", withExtension: "usdz") else { fatalError() }
                let mdlAsset = MDLAsset(url: url)
                let shipScene = SCNScene(mdlAsset: mdlAsset)
//                let shipScene = SCNScene(named: "retro.scn")!
                let shipNode = shipScene.rootNode.childNodes.first!

                shipNode.position = SCNVector3Zero
                shipNode.position.z = 0.15

                planeNode.addChildNode(shipNode)
                
                node.addChildNode(planeNode)
            }
            return node
        }
    
    
}
       

【问题讨论】:

    标签: swift augmented-reality scenekit arkit


    【解决方案1】:

    您可以尝试使用以下内容:

        let width     = 10 //calculate the length of the target image
        let nodeWidth = shipNodeLength //calcualate the length of the original model
        if width > 0 {
            if nodeWidth > width {
                scale = width/nodeWidth
            } else {
                scale = nodeWidth/width
            }
        }
        
        shipNode.scale = SCNVector3(scale, scale, scale)
    

    【讨论】:

    • 嗨@brockhampton!在 StackOverflow 上,对接受的答案进行投票是一种很好且常见的做法。很抱歉这么说,但我没有看到任何赞成的答案(上箭头)。
    • 我刚做了。谢谢
    猜你喜欢
    • 2018-12-06
    • 2020-06-07
    • 2022-08-03
    • 1970-01-01
    • 2018-09-17
    • 2021-11-05
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多