UE5.1中静态网格体Actor与独立组件间变换矩阵获取方案
获取Actor局部空间到Component局部空间的变换矩阵
需求说明
- 目标:生成4×4变换矩阵,实现StaticMesh Actor局部空间到无关StaticMeshComponent局部空间的坐标转换,用于自定义HLSL计算着色器中完成位置空间转换。
- 已获取的变换数据:通过
actor->GetActorTransform()获取Actor的变换信息,通过component->GetComponentTransform()获取目标StaticMeshComponent的变换信息。 - 已知方法的局限:尝试过
FTransform的GetMatrixWithScale()、GetMatrixWithNoScale()函数,以及GetRelativeTransform()、GetRelativeTransformReversed()函数,但这些方法在对象同时存在非均匀缩放和旋转时无法正常工作。
自行实现的代码
FMatrix44d makeWorldToLocalTransformMatrix(const FTransform& transform) { auto L2WTranslation = makeTranslationMatrix(transform.GetTranslation()).InverseFast(); // 已反转 auto L2WRotation = transform.GetRotation().ToMatrix(); // 未反转 auto L2WScale = makeScaleMatrix(transform.GetScale3D()).InverseFast(); // 已反转 return L2WScale * L2WRotation * L2WTranslation; } FMatrix44d makeLocalToWorldTransformMatrix(const FTransform& transform) { auto L2WTranslation = makeTranslationMatrix(transform.GetTranslation()); // 未反转 auto L2WRotation = transform.GetRotation().ToMatrix().InverseFast(); // 已反转 auto L2WScale = makeScaleMatrix(transform.GetScale3D()); // 未反转 return L2WTranslation * L2WRotation * L2WScale; } FMatrix44d getLocalToLocalTransformMatrix(const FTransform& actor, const FTransform& component) { auto actorTransformMatrix = makeLocalToWorldTransformMatrix(actor); auto componentTransformMatrix = makeWorldToLocalTransformMatrix(component); return componentTransformMatrix * actorTransformMatrix; }
当前问题与期望
上述自行实现的代码效率不足,希望能使用UE的内置函数来完成相同功能。
着色器中矩阵的使用方式
float4x4 TransformMatrix = ...; float4 PositionToTransform = float4(..., 1) float4 result = mul(TransformMatrix, PositionToTransform);
寻求的解决方向
希望找到以下两种情况之一的解决方案:
- UE内置的可直接实现该空间转换功能的函数
- 其他未被知晓的高效实现方法
内容的提问来源于stack exchange,提问作者dast99
相关产品推荐
相关产品推荐

