在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文件即使是中文名称也是可以展示的,同时针对文件夹和组、导入文件的引用方式都对展示没有较深的影响。
参考资料
- 在Xcode中创建组与创建文件夹引用:https://cloud.tencent.com/developer/ask/sof/212851