Пример #1
0
        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();
        }
Пример #2
0
        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);
                    }
                }
            }
        }
Пример #3
0
        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);
                }
            }
        }