如何在 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 重新创建模型的姿势?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Unity 中从 .fbx 文件创建 .anim 文件?
在 Blender (python) 中从 Windows 剪贴板中读取二进制数据
如何在 Blender 中从不同的摄像机角度渲染 3d 模型的不同贴图(漫反射、深度、镜面反射、阴影)?
游戏开发创新自学Blender建模,自制孔明灯,在Unity中点亮整个星空,愿新年,胜旧年(Unity | 建模 | 粒子系统 | 预设)