Quantcast
Channel: Questions in topic: "skinned mesh renderer"
Viewing all articles
Browse latest Browse all 192

Some submeshes of my gameobject dissapears when I set the bindposes

$
0
0
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

Viewing all articles
Browse latest Browse all 192

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>