UE导入导出FBX的打组问题

前言

已知UE导出FBX模型以后, 会将Mesh和Joints打成一个组, 如下图

image-20220916104449336

这个组的存在会影响美术工作, K动画时是需要将这个组给删掉的, 也就是模型和骨架与组接触父子关系, 如果组有相对变换, 那么这个时候模型可能还会发生旋转

比如下图

image-20220916104502022

所以现在的问题是如何有效的解决这个问题?

先大概看一下源码

导出流程

主要流程就从这里开始

image-20220916104516310

image-20220916104522723

image-20220916104530115

第一步就会创建一个MeshNode, 用模型本身命名,然后把这个Node作为Root, 到

1
ExportSkeletalMeshToFbx 中去创建MeshNode和SkeletonNode

那么导出流程如果要改成不打组, 那么很简单, 在最前面把Scene的RootNode作为Mesh和Skeleton的Root传递过去就可以了

如下图

image-20220916104540593

可以直接在导出数据配置中加一个选项, 方便选择

image-20220916104551623

导入流程

导入流程稍微复杂一点, 看一下调用栈

image-20220916104614807

以下图的模型为例

image-20220916104627907

会递归的查找整个树, 找到最后的Root节点, 这里大概梳理一下FbxSdk中 这个模型的层级关系,

image-20220916104638504

**
每个FbxNode都拥有一个FbxNodeAttribute**

可以用此来定义是什么类型的Node, 所以这里引擎有个规则

image-20220916104648546

简单看就是要一直找到当前节点的ParentNode等于Scene的RootNode为止

所以需要改动的就是这里判断一下最上面的节点是不是

1
FbxNodeAttribute::eSkeleton

如果不是骨骼那么就不当做骨架创建

简单修改如下

image-20220916104657470

因为要公开参数, 这里折腾了一段时间

**
**

首先需要在我们获取的

1
FBXImportOptions

中添加一个变量, 这个变量要从ImportUI类中获取, 这个类就是弹出来的Slate界面的Object对象

因为上面获取RootNode的时候获取不到UI类, 只能通过Options类获取参数, 所以需要在两者内都定义一个变量

最简单的方法就是在读完配置真正导入File之前读取一下UI的配置

image-20220916104748061

另外还可以在

1
2
void ApplyImportUIToImportOptions(UFbxImportUI* ImportUI, FBXImportOptions& InOutImportOptions)
中去添加一条属性赋值的操作, 看着引擎自己是这么干的, 看上去比较符合规矩

image-20220916104806935

最终效果

录制_2022_09_02_11_32_03_558