Xcode导入dae建模文件
Xcode导入dae建模文件

Xcode导入dae建模文件

在Xcode项目当中创建一个文件夹并命名为:

art.scnassets

命名也可以自定义,通常使用 art.scnassets 是约定俗成的命名方式。

然后将本地电脑上的dae文件拖放到art.scnassets文件夹中。

实现效果:

如果导入后,仍然不显示,请检查Bundle.main.url代码是否含有subdirectory字段。如果有的话,就将subdirectory字段删除掉。

我在测试应用时,组和文件夹以及导入dae文件的引用方式都调试过,问题均未解决,在删除subdirectory字段后,问题才得以解决。

删除前:

if let sceneURL = Bundle.main.url(forResource: "piggyBank", withExtension: "dae", subdirectory: "art.scnassets")

删除后:

if let sceneURL = Bundle.main.url(forResource: "piggyBank", withExtension: "dae")

实现效果:

dae文件完整代码:

import SwiftUI
import SceneKit

struct ModelView: UIViewRepresentable {
    @ObservedObject var appData: AppData

    func makeUIView(context: Context) -> SCNView {
        let sceneView = SCNView()
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.backgroundColor = .clear  // 设置背景色为透明

        // 安全加载 .dae 文件并打印调试信息
        if let sceneURL = Bundle.main.url(forResource: "piggyBank", withExtension: "dae") {
            print("Scene URL: \(sceneURL)")
            if let scene = try? SCNScene(url: sceneURL, options: nil) {
                print("Successfully loaded .dae file")
                sceneView.scene = scene
            } else {
                print("Failed to load .dae file")
            }
        } else {
            print("Failed to find .dae file in the bundle")
        }
        return sceneView
    }

    func updateUIView(_ uiView: SCNView, context: Context) {
        guard let node = uiView.scene?.rootNode.childNodes.first else {
            print("Failed to get the first child node")
            return
        }
        
        let material = SCNMaterial()
        let percentage = CGFloat(appData.pigLetCount / 100.0)
        
        // Set up gradient effect for the model
        let gradient = CAGradientLayer()
        gradient.colors = [UIColor.clear.cgColor, UIColor.systemYellow.withAlphaComponent(percentage).cgColor]
        gradient.locations = [0.0, NSNumber(value: Float(percentage))]
        gradient.frame = CGRect(x: 0, y: 0, width: 1, height: 1)
        
        // Convert the gradient layer to a texture
        UIGraphicsBeginImageContext(gradient.frame.size)
        gradient.render(in: UIGraphicsGetCurrentContext()!)
        let gradientImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        
        material.diffuse.contents = gradientImage
        
        // Apply the material to the model
        node.geometry?.materials = [material]
    }
}

还需要注意的是,我在调试过程中发现dae文件即使是中文名称也是可以展示的,同时针对文件夹和组、导入文件的引用方式都对展示没有较深的影响。

参考资料

  1. 在Xcode中创建组与创建文件夹引用:https://cloud.tencent.com/developer/ask/sof/212851

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注