Well, I'm trying to animate some Source models imported into Unity3D using this Unity-Source-Tools library:
https://github.com/lewa-j/Unity-Source-Tools
To animate a Mesh generated by this tool I need to create a `SkinnedMeshRenderer` replacing the `MeshRenderer` and the `MeshFilter` components, so I created this method:
private static void ReplaceRenderer(this GameObject obj, SourceStudioModelv2 model)
{
if (obj.GetComponent() != null)
return;
var mesh = Object.Instantiate(obj.GetComponent().sharedMesh);
const bool debugPoses = true;
const bool useNativePoses = true;
var nativeBuilder = debugPoses ? new StringBuilder($"Native Matrix\n{new string('=', 10)}\n") : null;
var unityBuilder = debugPoses ? new StringBuilder($"Unity Matrix\n{new string('=', 10)}\n") : null;
var nativeMatrix = model.GetBindPosesFromModel(nativeBuilder).ToArray();
var unityMatrix = obj.transform.GetBindPoses(model.Bones, unityBuilder).ToArray();
if (debugPoses)
{
Debug.Log(nativeBuilder.ToString());
Debug.Log(unityBuilder.ToString());
}
var matrix = useNativePoses
? nativeMatrix
: unityMatrix;
mesh.bindposes = matrix;
Object.Destroy(obj.GetComponent());
Object.Destroy(obj.GetComponent());
var skinned = obj.AddComponent();
skinned.sharedMesh = mesh;
skinned.rootBone = obj.transform;
skinned.bones = model.Bones;
}
As you can see, I'm creating two bind poses, because one of them is created from this part of the code: https://github.com/lewa-j/Unity-Source-Tools/blob/c5469deb1d630c1582c940ff3cdb0f69fc55eda3/Assets/Code/Read/SourceStudioModel.cs#L724-L728
And this is how I create the bindposes:
## Native Poses
private static IEnumerable GetBindPosesFromModel(this SourceStudioModelv2 model, StringBuilder sb = null)
{
for (var i = 0; i < model.MdlBones.Length; i++)
{
var mdlBone = model.MdlBones[i];
// From: https://stackoverflow.com/a/49268287/3286975
var matrix = (new Matrix4x4(
new Vector4(mdlBone.PoseToBone[0], mdlBone.PoseToBone[1], mdlBone.PoseToBone[2],
mdlBone.PoseToBone[3]),
new Vector4(mdlBone.PoseToBone[4], mdlBone.PoseToBone[5], mdlBone.PoseToBone[6],
mdlBone.PoseToBone[7]),
new Vector4(mdlBone.PoseToBone[8], mdlBone.PoseToBone[9], mdlBone.PoseToBone[10],
mdlBone.PoseToBone[11]),
new Vector4(0, 0, 0, 1)
)).transpose;
sb?.AppendLine($"{i}: {matrix.ToString("F2")}");
yield return matrix;
}
}
## Unity Poses
private static IEnumerable GetBindPoses(this Transform transform, Transform[] bones, StringBuilder sb = null)
{
for (var i = 0; i < bones.Length; i++)
{
var bone = bones[i];
var matrix = bone.worldToLocalMatrix * transform.localToWorldMatrix;
sb?.AppendLine($"{i}: {matrix.ToString("F2")}");
yield return matrix;
}
}
And these are the values that each of them gives to me:
## Unity Bindposes
https://pastebin.com/9tybGq7Z
And this is the result:
![...][1]
## Native Bindposes
https://pastebin.com/YRZVq04y
But this one doesn't shows anything.
---
I saw this reference on internet: https://hg.alliedmods.net/hl2sdks/hl2sdk/file/4966093d3274/utils/studiomdl/simplify.cpp#l3745
But I'm not sure if I'll be able to transcript this into Unity and if it will be useful...
If you would like to test this model out I created a `*.unitypackage` file for you to test:
https://mega.nz/file/xKpRSYwJ#j3ckM3GyFDFZKI6Y-OvN2cmcGC_GudGe2finLRQoA4U
![...][2]
So I don't know how to proceed in this case, could anybody help me out with this?
[1]:https://i.imgur.com/kHpwpYq.png
[2]: https://i.imgur.com/AR42h6k.png
↧