带Armature的Skinned Mesh模型无法绕自身实际中心进行X轴旋转求助
解决带Armature的Skinned Mesh绕错误原点旋转的问题(面部滤镜场景)
核心解决方案
不用修改原始导出模型,通过嵌套层级+轴心偏移补偿,把旋转操作的轴心转移到模型自身中心,替代直接操作Armature。
具体操作步骤(以Unity为例,其他引擎逻辑通用)
- 创建一个空GameObject(命名为
HeadPivot),作为新的旋转根节点 - 将带Armature的模型对象设置为这个空节点的子物体
- 计算模型的实际中心:获取
SkinnedMeshRenderer的bounds.center,这是模型在世界空间的包围盒中心 - 把空节点的位置移动到这个模型中心位置
- 调整模型子物体的本地位置,让模型中心和空节点的原点完全重合(抵消偏移)
- 后续所有面部旋转(X轴抬头/低头)都作用在这个空父节点上,不再直接操作Armature或Skinned Mesh
示例代码(Unity)
// 获取模型的SkinnedMeshRenderer组件 SkinnedMeshRenderer skinnedMesh = GetComponentInChildren<SkinnedMeshRenderer>(); if (skinnedMesh == null) return; // 计算模型的世界空间中心 Vector3 modelWorldCenter = skinnedMesh.bounds.center; // 创建旋转轴心节点 GameObject pivot = new GameObject("HeadPivot"); pivot.transform.position = modelWorldCenter; // 将模型挂载到轴心节点下 transform.SetParent(pivot.transform); // 修正模型的本地位置,确保中心与轴心原点对齐 transform.localPosition = -pivot.transform.InverseTransformPoint(modelWorldCenter);
原理说明
自动导出的Armature原点在底部,Skinned Mesh的所有顶点权重都是基于这个原点绑定的,直接旋转Armature必然会绕其自身原点摆动。通过新增父节点,我们相当于重新定义了旋转轴心,同时通过位置偏移补偿,让模型的实际中心和新轴心重合,这样旋转时就会绕自身中心转动,完全符合面部滤镜的需求。
如果是其他引擎(比如Unreal),逻辑一致:创建空Actor作为轴心,将模型作为子Actor,调整两者的位置关系后,旋转空Actor即可。
内容的提问来源于stack exchange,提问作者noob7
相关产品推荐
相关产品推荐

