【问题标题】:How to recreate pose of model from Unity in Blender?如何在 Blender 中从 Unity 重新创建模型的姿势?
【发布时间】:2021-07-16 03:46:24
【问题描述】:

所以,我在 Unity 中制作了一些模型,我想在 Blender 中重新创建它们,作为更大的静态场景的一部分。我在 Blender 中使用与 Unity 中相同的模型,并且我有一个包含每个部分/骨骼的所有位置和旋转的文件,针对从 XYZ 到 XZY 的移动进行了调整。但是,Blender 中的所有旋转都是错误的,而且我似乎找不到模式。

我一直在做的事情:我在 Blender 中制作了一个盒子人的基本小模型,并给了它一个基本的骨架(这是一个非常糟糕的模型 - 我不是建模师 - 但它很有效而且很简单)。我一直在模型上的每个骨骼上附加一个脚本,这样我就可以获得它们在 Unity 中旋转的四元数值,并否定 x、y 和 z,并交换 y 和 z 值以从左手转换为在将它们放回 Blender 之前的右手坐标。您可以在下图中看到结果。

左侧是 Unity 中的模型,右侧是 Blender 中的相同旋转值

作为记录,我也尝试过使用欧拉值,因为我更熟悉它们,但我认为使用四元数会得到更可靠的结果,因为 Unity 中的欧拉值可能与我读到的不一致。

我能找到的一切似乎相关的东西,合理地,都在另一个方向,从 Blender 到 Unity。
老实说,在这种特殊情况下,我可以在 Blender 中重新创建姿势并继续前进。但是,我有兴趣了解导致这些奇怪旋转的 Blender 和 Unity 之间的差异。

这里是块人的 .blend 和 .fbx 供参考。 https://drive.google.com/drive/folders/1p4jhh8CVMwN7RlP0YQvwqOQJ3Ft569G6?usp=sharing

【问题讨论】:

    标签: unity3d blender modeling quaternions


    【解决方案1】:

    Blender 和 Unity 之间的差异导致这些奇怪的旋转。

    你基本上已经知道了:Blender uses a right-handed whereas Unity uses a left-handed coordinate system

    Afaik 应该这样做

    对于职位来说,这很简单:

    • 翻转 Z 和 Y

    也适用于规模

    • 翻转 Z 和 Y

    旋转

    • 对 X、Y、Z 求反
    • 翻转 Z 和 Y

    它应该在两个方向上工作相同(左手 -> 右手和右手 -> 左手)

    public class Test : MonoBehaviour
    {
        public Vector3 BlenderPosition;
        public Quaternion BlenderRotation;
        public Vector3 BlenderScale;
    
        [ContextMenu(nameof(ApplyTransformValuesFromBlender))]
        private void ApplyTransformValuesFromBlender()
        {
            transform.localPosition = FlipLeftRightHanded(BlenderPosition);
            transform.localRotation = FlipLeftRightHanded(BlenderRotation);
            transform.localScale = FlipLeftRightHanded(BlenderScale);
        }
    
        [ContextMenu(nameof(ConvertTransformValuesToBlender))]
        private void ConvertTransformValuesToBlender()
        {
            BlenderPosition = FlipLeftRightHanded(transform.localPosition);
            BlenderRotation = FlipLeftRightHanded(transform.localRotation);
            BlenderScale = FlipLeftRightHanded(transform.localScale);
        }
        
        private Vector3 FlipLeftRightHanded(Vector3 vector)
        {  
            return new Vector3(vector.x, vector.z, vector.y);
        }
    
        private Quaternion FlipLeftRightHanded(Quaternion quaternion)
        {
            return new Quaternion (-quaternion.x, -quaternion.z, - quaternion.y, quaternion.w);
        }
    }
    

    【讨论】:

    • 感谢您的回复!不幸的是,我已经按照您所说的调整坐标开关了。结果是上面的图片,在 Blender 中结果看起来仍然非常不同。我注意到我忘了提及:当我尝试在 Blender 中手动重新创建姿势时,大致相同位置的值非常不同。特别是 Blender 中的 W 值通常保持在 1 附近,而在 Unity 中则更接近 -1。我尝试在 Unity W 值上加 1,但没有使它们变为正数。
    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 2022-10-07
    • 2012-02-10
    • 2023-02-03
    • 2021-08-28
    • 1970-01-01
    • 2021-04-22
    • 2020-11-13
    相关资源
    最近更新 更多