如何在 Blender 中从 Unity 重新创建模型的姿势?

Posted

技术标签:

【中文标题】如何在 Blender 中从 Unity 重新创建模型的姿势?【英文标题】:How to recreate pose of model from Unity in Blender? 【发布时间】: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

【问题讨论】:

【参考方案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,但没有使它们变为正数。

以上是关于如何在 Blender 中从 Unity 重新创建模型的姿势?的主要内容,如果未能解决你的问题,请参考以下文章

如何将布料模拟从 Blender 导入 Unity

如何从 Blender 导出到 unity3d

如何在 Unity 中从 .fbx 文件创建 .anim 文件?

在 Blender (python) 中从 Windows 剪贴板中读取二进制数据

如何在 Blender 中从不同的摄像机角度渲染 3d 模型的不同贴图(漫反射、深度、镜面反射、阴影)?

游戏开发创新自学Blender建模,自制孔明灯,在Unity中点亮整个星空,愿新年,胜旧年(Unity | 建模 | 粒子系统 | 预设)