Is there a way to make a skinned mesh have it’s armature be in bind pose?
I can’t seem to find anything.
Preferably I’d like to do this in code
Is there a way to make a skinned mesh have it’s armature be in bind pose?
I can’t seem to find anything.
Preferably I’d like to do this in code
Couldn’t find a simple function or setting (which is odd IMO, as this should be an easy thing for Unity to add), But I managed to do it like this:
var bindposes = smr.sharedMesh.bindposes;
var bones = smr.bones;
var parents = new Transform[bones.Length];
for (int i = 0; i < bones.Length; i++)
{
parents[i] = bones[i].parent;
bones[i].parent = null;
}
for (int i = 0; i < bones.Length; i++)
{
bones[i].localScale = bindposes[i].inverse.ExtractScale();
bones[i].rotation = bindposes[i].inverse.ExtractRotation();
bones[i].position = bindposes[i].inverse.ExtractPosition();
}
for (int i = 0; i < bones.Length; i++)
{
bones[i].parent = parents[i];
}
using these extension methods:
(which I got from How to assign Matrix4x4 to Transform? )
public static class MatrixExtensions
{
public static Quaternion ExtractRotation(this Matrix4x4 matrix)
{
Vector3 forward;
forward.x = matrix.m02;
forward.y = matrix.m12;
forward.z = matrix.m22;
Vector3 upwards;
upwards.x = matrix.m01;
upwards.y = matrix.m11;
upwards.z = matrix.m21;
return Quaternion.LookRotation(forward, upwards);
}
public static Vector3 ExtractPosition(this Matrix4x4 matrix)
{
Vector3 position;
position.x = matrix.m03;
position.y = matrix.m13;
position.z = matrix.m23;
return position;
}
public static Vector3 ExtractScale(this Matrix4x4 matrix)
{
Vector3 scale;
scale.x = new Vector4(matrix.m00, matrix.m10, matrix.m20, matrix.m30).magnitude;
scale.y = new Vector4(matrix.m01, matrix.m11, matrix.m21, matrix.m31).magnitude;
scale.z = new Vector4(matrix.m02, matrix.m12, matrix.m22, matrix.m32).magnitude;
return scale;
}
}