快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx

Posted

技术标签:

【中文标题】快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx【英文标题】:Quick and efficient way to transfer from an flt object with rgb/rgba textures to fbx with jpg/png textures 【发布时间】:2018-02-14 00:44:21 【问题描述】:

我有几个非常大的 flt 格式的目标文件。这些对象的所有纹理都在 rgb 和 rgba 文件中。我使用 3DS Max 将 flt 转换为 fbx,但所有纹理仍然是 rgb/rgba 格式。 Unity 似乎不接受这些图像文件。对于其中一个,我使用 image magik 转换了所有图像,然后在 Unity 中将每个相应的纹理添加到正确的材质中。这是一个痛苦和非常耗时的。不仅如此,它只适用于一个 Unity 项目,所以如果我想将它拉入任何其他项目或软件,我将不得不再做一次。那个模型有几百个纹理,我的其他模型也有。

有没有办法将带有 RGB/RGBA 纹理文件的 FLT 对象轻松转换为带有 JPG/PNG 纹理文件的 FBX 对象?我可以轻松地将所有 rgb 文件转换为 jpg 并将 rgba 文件转换为 png(如果这很重要)。我有可以使用的 3DS Max 和 Maya。

【问题讨论】:

【参考方案1】:

没有一种简单的一次性方法可以做到这一点——FLT 和 RGB 目前都不是常见的文件格式。

可能最好的代码解决方案是批量转换所有图像(更改它们的扩展名),然后在 Unity 中编写 AssetPostprocesor 匹配找到与资产引用的材料对应的新 .tga 或 .jpg 文件并交换它们。这将节省 Unity 端的手工工作。如果这将成为您经常做的事情,那么这项工作是值得的。

您可以在 Maya 中进行类似的操作:将 fbx 文件导入到空白的 Maya 场景中,查找文件纹理节点,然后将 rgb/rgba 扩展名替换为 tga 或 jpg 等。看起来像这样:

 def update_fbx(filname, source = 'rgb', target = 'tga'):
     cmds.file(f=True, new=True) # clear the scene
     cmds.FBXImport(f=filename)  # import the fbx

     #assuming you have materials with file nodes pointing at
     # rgb extensions, replace with tga
     for each_file_node in cmds.ls(type = 'file'):
         oldname = cmds.getAttr(each_file_node + ".ftn")
         newname = oldname.replace(source, target)
         cmds.setAttr(each_file_node + ".ftn", newname)

然后将场景重新导出为新的 FBX,它将具有正确的文件引用。

有很多变数,具体取决于源文件的结构,但这是解决问题的一般思路。

【讨论】:

以上是关于快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中怎么使用压缩纹理?

如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 还是 hsl 颜色?

快速创建具有相同纹理的多个精灵(节点)

有效地从 ArrayList 中获取子列表

如何正确地从有效载荷中添加和删除元素? (或有条件更换)

CSS3 rgba用法