public static void BuildXform(Matrix4x4 xf, GameObject go, SceneImportOptions options) { UnityEngine.Profiling.Profiler.BeginSample("Change Handedness"); ImportXform(ref xf, options); UnityEngine.Profiling.Profiler.EndSample(); Vector3 localPos; Quaternion localRot; Vector3 localScale; UnityEngine.Profiling.Profiler.BeginSample("Decompose Matrix"); bool success = UnityTypeConverter.Decompose(xf, out localPos, out localRot, out localScale); UnityEngine.Profiling.Profiler.EndSample(); if (!success) { Debug.LogError("Non-decomposable transform matrix for " + go.name); return; } UnityEngine.Profiling.Profiler.BeginSample("Assign Values"); go.transform.localPosition = localPos; go.transform.localScale = localScale; go.transform.localRotation = localRot; UnityEngine.Profiling.Profiler.EndSample(); }
public static void BuildDebugBindTransforms(SkeletonSample skelSample, GameObject goSkeleton, SceneImportOptions options) { var debugPrefix = "usdSkel_bindPose_debug_cube"; if (options.meshOptions.debugShowSkeletonBindPose) { int i = 0; foreach (var bindXf in skelSample.bindTransforms) { // Undo the bindXf inversion for visualization. var mat = bindXf.inverse; var cubeName = debugPrefix + i++; var cube = goSkeleton.transform.Find(cubeName); if (!cube) { cube = GameObject.CreatePrimitive(PrimitiveType.Cube).transform; cube.SetParent(goSkeleton.transform, worldPositionStays: false); cube.name = cubeName; } Vector3 t, s; Quaternion r; UnityTypeConverter.Decompose(mat, out t, out r, out s); cube.localPosition = t; cube.localScale = s; cube.localRotation = r; } } else { var zero = goSkeleton.transform.Find(debugPrefix + 0); if (zero) { var toDelete = new List <GameObject>(); foreach (Transform child in goSkeleton.transform) { if (child.name.StartsWith(debugPrefix)) { toDelete.Add(child.gameObject); } } foreach (var child in toDelete) { GameObject.DestroyImmediate(child); } } } }
public static void BuildSkeletonBone(string skelPath, GameObject go, Matrix4x4 restXform, VtTokenArray joints, SceneImportOptions importOptions) { // Perform change of basis, if needed. XformImporter.ImportXform(ref restXform, importOptions); // Decompose into TSR. Vector3 pos = Vector3.zero; Quaternion rot = Quaternion.identity; Vector3 scale = Vector3.one; if (!UnityTypeConverter.Decompose(restXform, out pos, out rot, out scale)) { throw new Exception("Failed to decompose bind transforms for <" + skelPath + ">"); } go.transform.localScale = scale; go.transform.localRotation = rot; go.transform.localPosition = pos; var cubeDebugName = "usdSkel_restPose_debug_cube"; if (importOptions.meshOptions.debugShowSkeletonRestPose) { var cube = go.transform.Find(cubeDebugName); if (!cube) { cube = GameObject.CreatePrimitive(PrimitiveType.Cube).transform; cube.name = cubeDebugName; cube.SetParent(go.transform, worldPositionStays: false); cube.localScale = Vector3.one * 2; } } else { var existing = go.transform.Find(cubeDebugName); if (existing) { GameObject.DestroyImmediate(existing.gameObject); } } }