从Blender导出COLLADA/.dae格式并在SceneKit中使用时包括纹理

14

我可以使用COLLADA/.dae格式导出在Blender中创建的网格以供在SceneKit中使用,但是iOS设备上没有纹理显示。

此外,在OS X上,预览无法打开从Blender导出的任何COLLADA文件 - 但是侧边栏预览确实显示了网格。导出时需要哪些选项才能使其正常工作?


我认为你需要告诉我们更多关于你如何导出这些纹理的信息。此外,如果预览甚至无法打开这些纹理,那么这听起来更像是Blender的问题,而不是Scene Kit的问题。 - David Rönnqvist
我一直在寻找有关如何从Blender导出到SceneKit的教程或解释,但实际上并没有找到什么。这段文字很有趣,但已经过时了:http://iphonedevelopment.blogspot.jp/2012/08/an-introduction-to-scenekit.html 到目前为止,我只是尝试将Blender导出到COLLADA,更改了一些关于COLLADA的导出选项-起初它没有导出我正在使用的一个纹理文件,但后来成功了-它将其放在同一个文件夹中。然而,我得到的结果就像我的问题描述的那样。 - Jonny
如果您在Xcode中启动一个Scenekit游戏,模板“ship”定义在“ship.dae”中,打开xml文件会发现Apple使用了“SceneKit Collada Exporter v1.0”来导出它 - 这看起来像是他们自己的工具。让人想知道他们最初从什么工具/格式导出,也许是3dsmax、Maya或其他工具。Collada版本是1.4.1,与Blender相同。我将继续查看有什么不同... - Jonny
还有一点需要注意:Apple的ship.dae文件是以Y轴为上方,而Blender则是以Z轴为上方。这可能会导致一些问题。 - Jonny
3个回答

26

首先创建一个 scnassets 文件夹(不是必须的,但很有用)

  1. 在桌面上创建一个文件夹,并将其扩展名更改为“.scnassets”。

  2. 将您的 Collada(.dae) 文件和任何要使用的纹理放入其中。

  3. 将文件夹拖到您的项目中,并像往常一样另存为副本。

  4. 单击您的 scnassets 文件夹,您会看到一个被选中的复选框(如果没有,请选中该复选框)以将其转换为“y”向上轴。

将纹理分配给您的场景模型

  1. 在 Xcode 中单击您项目中的 Collada(.dae) 文件。

  2. 您应该看到您的场景以及其左侧相机、灯光、材质等列表。 这是您的场景树。

  3. 打开材料选项卡,然后单击其中一个材质。

  4. 在检查窗口右侧单击蓝色球形图标(材质检查器),以查看该材质的漫反射、高光等。

  5. 单击漫反射选项卡,然后当其打开时,您应该可以在您的项目中选择颜色和纹理。选择您在 3D 程序中用于模型的纹理。只要您在 3D 程序中正确进行了 UV 解包,它们就应立即应用于您的场景视图。

如果我想在加载场景后更改材质怎么办?好问题!

为此,我们必须使用 SCNSceneSource 类的 entryWithIdentifier 方法。 我将在这里使用 Swift,因为它很棒! 准备好了...

  1. 获取您场景(.dae) 的 URL,如下所示...

    let url = NSBundle.mainBundle().URLForResource("YourFolder.scnassets/yourScene", withExtension "dae")
    
  2. 现在让我们利用这个URL...

  3. let source = SCNSceneSource(URL: url, options: nil)
    
  4. 点击你的.dae文件,在场景图下面是一个项目列表,其中之一就是你的几何形状。它右边会有一个茶壶标识。我们将在此处使用它的名称。假设你的几何形状名为Geo。像这样使用它...

  5. let yourGeometry = source.entryWithIdentifier("Geo", withClass: SCNGeometry.self) as SCNGeometry
    
  6. 现在我们已经将一个名为yourGeometry的SCNNode连接到了一个源上。让我们创建一个新的材质,使用UIColor来实现...

  7. let newMaterial = SCNMaterial()
    newMaterial.diffuse.contents = UIColor.redColor()
    
  8. 最后我们将以这样的方式更换旧材料为新材料...

  9. yourGeometry.geometry.replaceMaterialAtIndex(0, withMaterial: newMaterial)
    

如果您有多种材料,可以尝试使用其他索引来进行操作。您还可以使用UIImage类来使用另一种纹理而不是颜色。

提示 如果您想要添加或删除scnassets文件夹中的内容,请导航到您的项目文件夹中进行操作,而不是在Xcode中操作。这花了我一段时间才弄明白,所以我想节省大家的麻烦。


我知道我已经在Blender Jonny上为你回答了这个问题,但我想在这里也放一下。 - FlippinFun
刚刚更新了一下,展示了如何在加载场景后切换材质。 - FlippinFun
抱歉耽误了,这是正确的方法。不知何故,Blender 无法以 OSX/iOS 能理解的方式编写 COLLADA。只有在 Xcode 的 3D 编辑器中手动设置纹理并保存后,.dae 文件才能在 Preview 中打开并与 SceneKit 一起使用。感谢您的耐心等待。如果有足够的时间,可以比较 Xcode 和 Blender 编写的 COLLADA 格式。然后,可以为 Blender 编写插件或类似工具,以便 Blender 在第一时间就能编写兼容 SceneKit 的 COLLADA - 这将是一个巨大的时间节省,因为现在您必须每次在 Xcode 中手动选择这些纹理。 - Jonny
我们如何将标识符从“Geo”更改为其他名称? - Sai Bharath Yadav
我在Scenekit内部更改名称没有成功。名称是从你的Collada中提取的。因此,在导出之前,只需在你使用的3D程序内部重命名几何图形即可。 - FlippinFun
@FlippinFun请指导如何将3D模型放入服务器并获取URL。请先指导如何将普通的3D模型放入服务器,然后我再加载对象。位置:可选(file:///private/var/mobile/Containers/Data/Application/A1B996D7-ABE9-4000-91DB-2370076198D5/tmp/CFNetworkDownload_duDlwf.tmp)新位置:/var/mobile/Containers/Data/Application/A1B996D7-ABE9-4000-91DB-2370076198D5/Documents/mug.scn 发生了这个错误。 - Gangireddy Rami Reddy

4

使它工作的三件事。

  1. 确保图像已打包在.blend文件中(这是UV编辑器中的选项)

  2. 当您导出时,文件不会自动包括UV或材料。在DAE中包括UV和材料的复选框。我在执行此操作时也错过了这个选项。

  3. 如果您要放置一个游乐场,则只需要这一个。 DAE并没有完全应用,但我能够使用开发人员工具中的scntool导出一个DAE。这是我使用的一个示例命令行。

./scntool --convert ~/Documents/Art/BlenderArt/tableandappleUV.dae --format c3d --output ~/Documents/Table5.dae

注意c3d格式。使用它,您的游乐场现在也可以识别DAE。(另一个注意事项:如果您想在游乐场中使用DAE,则需要将其放入游乐场的资源文件夹中)


还有一点需要注意的是,打包图像会将UV资源的完整路径放入其中。如果您将它们保存在外部,我发现它将使用相同相对路径中放置的UV图像。 - Scott Jenkins
如何使用scntool的文档在哪里可以找到? - Lance Kind
在Blender 2.79中,需要进行以下操作:“在DA中有一个复选框可以包括UV和材质”。 - μολὼν.λαβέ

4

Collada文件不会嵌入纹理,它们只有对纹理的引用。在预览时确保您的纹理可以从Collada文件中访问,并在构建应用程序时确保将纹理包含在应用程序包中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接