2016-03-30 92 views
1

我試圖加載.obj文件。如何在加載後,secenekit只生成一個具有多個子網格的巨大幾何體的節點。任何人都知道如何將這個巨大的節點分割成多個節點,每個節點擁有一個原始節點的子網格?因爲我需要對它們應用不同的物理。提前致謝。在Scenekit中如何將一個SCNNode拆分爲多個節點?

我曾嘗試以下方法:

  1. 手工解析.obj文件。這個工程,但吃了太多的內存
  2. 加載文件後,我得到了巨大的節點。然後我對每個目(obj文件獲得) 這也是工作做

     let geometry = SCNGeometry(sources: rootNode.geometry!.geometrySources, elements: [rootNode.geometry!.geometryElementAtIndex(count)]) 
         geometry.firstMaterial = rootNode.geometry!.materials[count] 
         let node = SCNNode(geometry: geometry) 
    

,但需要較長的時間進行渲染,我想是因爲我複製整個源爲每個節點。

回答

1

聽起來好像你已經找到了一些方法可以給你正確的結果,但是在運行時它們需要很長的時間。所以與這些運行,但提前做。

在輔助程序中運行您的手動OBJ解析或您的每個元素幾何檢索。將結果歸檔爲SCNScene(或者SCNNodes)。將檔案/檔案嵌入到您的公共項目中。解壓縮.SCN文件將比分析和實例化大型OBJ文件快得多。

以下是將場景存檔到文件的功能。然後,您可以將該文件嵌入到您的項目中,並以在模板代碼中打開太空船的方式打開它,或者使用Xcode Scene Editor對其進行調整。

func archiveToFile(fileName: String) -> Bool { 
    let data = NSKeyedArchiver.archivedDataWithRootObject(gameView!.scene!) 

    // Save data to file 
    let DocumentDirURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) 

    let fileURL = DocumentDirURL.URLByAppendingPathComponent(fileName).URLByAppendingPathExtension("scn") 
    print("FilePath:", fileURL.path) 

    if (!data.writeToURL(fileURL, atomically: true)) { 
     return false 
    } 
    return true 
} 
+0

嗨哈爾,非常感謝您的建議。這聽起來不錯,但它看起來像我需要花很多時間來編寫一個轉換器。無論如何將嘗試這一點,如果有時間。謝謝。 – must

+0

我以爲你已經寫了轉換代碼?從那裏,添加一個存檔步驟,你就完成了。 –

+0

Hi Hal,我所做的只是讀取.obj文件中的數據並使用sceneKit API根據這些數據創建節點。要預先生成.scn文件,我想我需要更多關於.scn文件格式的知識。你有什麼想法如何通過代碼生成一個.scn文件?謝謝。 – must

相關問題