首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SCNNode创建.usdz?

如何从SCNNode创建.usdz?
EN

Stack Overflow用户
提问于 2018-11-15 10:31:13
回答 3查看 8.1K关注 0票数 8

我下载了苹果公司提供的.usdz型号:https://developer.apple.com/arkit/gallery/

但是现在,我想用这些模型之一创建一个SCNNode,所以我这样做是为了获得节点:

代码语言:javascript
复制
guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
    return
}
let mdlAsset = MDLAsset(url: urlPath)
let modelRootNode = SCNScene(mdlAsset: mdlAsset).rootNode

然后我把它添加到场景中,结果是:

为什么它没有纹理?

我将下载的.usdz文件放到项目目录中的一个文件夹中,如您所见:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-20 16:27:27

添加.USDZ对象的正确方法实际上是使用文件的URL创建场景:

代码语言:javascript
复制
 let scene = try! SCNScene(url: usdzURL, options: [.checkConsistency: true])

甚至通过引用节点创建:

代码语言:javascript
复制
 let referenceNode = SCNReferenceNode(url: usdzURL)
 referenceNode.load()
票数 17
EN

Stack Overflow用户

发布于 2021-03-30 09:54:57

可以将usdz加载到ARKit场景中。

重要的是有这些进口

代码语言:javascript
复制
import ARKit
import SceneKit
import SceneKit.ModelIO

通过URL加载usdz。

代码语言:javascript
复制
guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
    return
}
let mdlAsset = MDLAsset(url: urlPath)
// you can load the textures on an MDAsset so it's not white
mdlAsset.loadTextures()

将其封装在一个节点中。

代码语言:javascript
复制
let asset = mdlAsset.object(at: 0) // extract first object
let assetNode = SCNNode(mdlObject: asset)

现在可以将此节点附加到ARKit中。您需要缩放对象并将其定位到您在现实世界中想要的位置,但是代码取决于您想要做什么,所以我忽略了这一点。

票数 2
EN

Stack Overflow用户

发布于 2021-03-30 11:53:33

访问内部USDZ节点的正确方法

代码语言:javascript
复制
func usdzNodeFrom(file: String, exten: String, internal_node: String) -> SCNNode? {
    let rootNode = SCNNode()
    let scale = 1

    guard let fileUrl = Bundle.main.url(forResource: file, withExtension: exten) else {
        fatalError()
    }
    
    let scene = try! SCNScene(url: fileUrl, options: [.checkConsistency: true])
    let node = scene.rootNode.childNode(withName: internal_node, recursively: true)!
    node.name = internal_node
    let height = node.boundingBox.max.y - node.boundingBox.min.y
    node.position = SCNVector3(0, 0, 0)
    tNode.scale = SCNVector3(scale, scale, scale)
    rootNode.addChildNode(tNode)
    return rootNode
}

进一步的纹理不显示是不同的问题,可以解决通过增加闪电到环境。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53317392

复制
相关文章

相似问题

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