我正在创建AR应用程序(Xcode 10.1,Swift 4.2.1)。
我想将USDZ
3D对象加载到空 SceneKit的场景中,然后将其作为MDL
网格进行处理。
这是我的代码:
import ARKit
import SceneKit.ModelIO
let scene = SCNScene(named: "art.scnassets/emptyScene.scn")!
if let filePath = Bundle.main.path(forResource: "Helicopter",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let refNode = SCNReferenceNode(url: refURL)
refNode?.load()
scene.rootNode.addChildNode(refNode!)
}
let helicopterGeo = refNode!.geometry
let mdlMesh = MDLMesh(scnGeometry: helicopterGeo!) // ERROR APPEARS HERE
try! mdlMesh.makeVerticesUniqueAndReturnError()
let flattenedGeometry = SCNGeometry(mdlMesh: mdlMesh)
let flattenedNode = SCNNode(geometry: flattenedGeometry)
scene.rootNode.addChildNode(flattenedNode)
但是编译器给我一个错误:
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
问题是 :我应该使用哪种方法将 "Helicopter.usdz"
几何分配给 {{1 }} 不变?
请帮助我找到解决方法!
您可以下载helicopterGeo
文件以测试HERE。
答案 0 :(得分:1)
这应该有效:
var scene: SCNScene!
if let filePath = Bundle.main.path(forResource: "Helicopter",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let mdlAsset = MDLAsset(url: refURL)
scene = SCNScene(mdlAsset: mdlAsset)
}
SCNReferenceNode
仅适用于.scn文件。然后,您可以从rootNode
的{{1}}的子节点获取几何。
scene
使用AR Quick Look Gallery中的一个文件,我设法使此代码起作用。我遇到的主要问题是特定子节点的名称,有一个名为“ RetroTV”的节点,但没有附加任何几何图形,它只是“ RetroTVBody”和“ RetroTVScreen”的父节点。唯一的问题是它没有为几何图形加载纹理。
let helicopterNode = scene.rootNode.childNode(withName: "helicopter", recursively: true)
let geometry = helicopterNode.geometry!
以上代码也可用于var scene: SCNScene!
if let filePath = Bundle.main.path(forResource: "retrotv",
ofType: "usdz",
inDirectory: "art.scnassets") {
let refURL = URL(fileURLWithPath: filePath)
let mdlAsset = MDLAsset(url: refURL)
scene = SCNScene(mdlAsset: mdlAsset)
let tvNode = scene.rootNode.childNode(withName: "RetroTVBody", recursively: true)
let geometry = tvNode!.geometry!
} else {
print("invalid path!")
}
语句之外的tvNode
和geometry
声明。
答案 1 :(得分:1)
我没有确切的答案,但是在您遇到的情况下,我将要做的是检查refNode
的层次结构。
在加载后放置一个断点,并使用调试器查看它是否有子代。那些孩子有几何形状吗?他们有没有带几何的孩子?
创建3D资产时,有时会将多个部分分组到一个父节点上,并且在许多情况下,该父节点为空。
答案 2 :(得分:0)
是Maya二进制文件中的错误,还是SELECT
t1.total_amount :: float AS amount,
t1.status :: TEXT
FROM accounting.payment_in_records AS t1
UNION ALL
SELECT
t1.fees :: float AS amount,
'Processed' :: TEXT AS status
FROM accounting.payment_out_record_detail_groups AS t1
WHERE t1.fees > 0;
转换中的错误–我不清楚。 Xcode在最简单的usdz
层次结构中看不到对象的正确名称:代替Scene graph
,它只是显示pHelicopter1
。我的3D对象是由Helicopter
使用多边形pCube1
工具制成的。
这是最终代码,它可以正常工作:
Extrude