如何从 .usdz 创建 SCNNode?
How to create a SCNNode from a .usdz?
我下载了Apple提供的.usdz模型:https://developer.apple.com/arkit/gallery/
但是现在,我想用这些模型之一创建一个 SCNNode,所以我这样做是为了获取节点:
guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
return
}
let mdlAsset = MDLAsset(url: urlPath)
let modelRootNode = SCNScene(mdlAsset: mdlAsset).rootNode
然后我把它添加到场景中,结果是这样的:
为什么没有纹理?
我已将下载的 .usdz 文件放入我的项目目录中的一个文件夹中,如您所见:
添加 .USDZ 对象的正确方法实际上是使用文件 URL:
创建场景
let scene = try! SCNScene(url: usdzURL, options: [.checkConsistency: true])
甚至通过参考节点创建:
let referenceNode = SCNReferenceNode(url: usdzURL)
referenceNode.load()
可以将 usdz 加载到 ARKit 场景中。
拥有这些导入很重要
import ARKit
import SceneKit
import SceneKit.ModelIO
通过 URL.
加载 usdz
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()
将其包裹在一个节点中。
let asset = mdlAsset.object(at: 0) // extract first object
let assetNode = SCNNode(mdlObject: asset)
您现在可以在 ARKit 中附加此节点。您需要在现实世界中将对象缩放和定向到您想要的位置,但该代码取决于您要执行的操作,因此我将其省略。
USDZ内部节点的正确访问方式
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
}
不显示的其他纹理是不同的问题,可以通过在环境中添加闪电来解决。
我下载了Apple提供的.usdz模型:https://developer.apple.com/arkit/gallery/
但是现在,我想用这些模型之一创建一个 SCNNode,所以我这样做是为了获取节点:
guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
return
}
let mdlAsset = MDLAsset(url: urlPath)
let modelRootNode = SCNScene(mdlAsset: mdlAsset).rootNode
然后我把它添加到场景中,结果是这样的:
为什么没有纹理?
我已将下载的 .usdz 文件放入我的项目目录中的一个文件夹中,如您所见:
添加 .USDZ 对象的正确方法实际上是使用文件 URL:
创建场景 let scene = try! SCNScene(url: usdzURL, options: [.checkConsistency: true])
甚至通过参考节点创建:
let referenceNode = SCNReferenceNode(url: usdzURL)
referenceNode.load()
可以将 usdz 加载到 ARKit 场景中。
拥有这些导入很重要
import ARKit
import SceneKit
import SceneKit.ModelIO
通过 URL.
加载 usdzguard 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()
将其包裹在一个节点中。
let asset = mdlAsset.object(at: 0) // extract first object
let assetNode = SCNNode(mdlObject: asset)
您现在可以在 ARKit 中附加此节点。您需要在现实世界中将对象缩放和定向到您想要的位置,但该代码取决于您要执行的操作,因此我将其省略。
USDZ内部节点的正确访问方式
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
}
不显示的其他纹理是不同的问题,可以通过在环境中添加闪电来解决。