UE盒体碰撞体非均匀缩放问题

UE问题记录

本文参考UE4.27.2源码

起因是发现在fbx文件内给模型添加轴对齐的盒体碰撞体时,如果将碰撞体命名为UCX,导入UE后缩放模型时碰撞体均正常缩放;如果将碰撞体命名为UBX,导入UE后非均匀缩放模型时出现碰撞体缩放不一致的问题。如果直接在UE中添加盒体碰撞体,均正常缩放。

检索时发现了同样的问题:

Box Collision non-uniform scale issue - Development / World Creation - Epic Developer Community Forums

这个问题的原因在于,UE的UBX由FKBoxElem存储,只记录了盒体的中心、旋转和三条边长,在对模型进行缩放时,其盒体碰撞体相当于在盒体坐标系(与盒体轴对齐的坐标系)下进行缩放。当从fbx导入盒体碰撞体时,调用StaticMeshImportUtils::AddBoxGeomFromTris函数生成盒体,其原理是遍历所有三角面片,统计每个法线方向上出现的平面(理论上盒体有3组法线,每组有2个平面),判断是否可以生成合适的盒体。这个过程生成的盒体的轴对齐坐标系不一定和模型的坐标系一致,例如当盒体坐标系的XYZ轴和模型坐标系的YZX轴对齐时,在缩放模型的X轴时,会缩放盒体的Z轴。这就会导致在非均匀缩放时,盒体碰撞体的缩放与模型并不一致。如果直接在UE中添加盒体碰撞体,此时盒体的坐标系和模型的坐标系默认是一致的,所以不会出现这种问题。UCX由FKConvexElem存储,记录的是顶点数据,所以可以正确非均匀缩放。

通过修改StaticMeshImportUtils::AddBoxGeomFromTris函数(调换盒体的XYZ三边的次序使其轴对称坐标系与模型坐标系一致),可以保证在fbx导入的盒体碰撞体无旋转的情况下(即盒体轴对齐)确保碰撞体与模型坐标系一致,即和直接在UE中添加的盒体碰撞体一致,这样模型在非均匀缩放时碰撞体能跟着正确缩放。

但是如果UBX盒体碰撞体本身不是轴对齐的,那还是无法正确非均匀缩放。本质上来说,如果盒体和模型坐标系不是轴对齐的,当对模型非均匀缩放后,盒体若正确缩放,则可能变形而不再是正确的盒体。

只要制作中使用的盒体碰撞体是轴对齐的,那么以UBX形式导入UE后就可以跟着模型非均匀缩放。否则只能以UCX导入。


UE盒体碰撞体非均匀缩放问题
https://tech.reddish.fun/Article/UE-Non-Uniform-Scale-Issue/
作者
bit704
发布于
2025年8月10日
许可协议