コード例 #1
0
        void CreateGameObjects(int nodeIndex, Dictionary <int, GameObject> gameObjects)
        {
            var gltf     = Container.Gltf;
            var gltfNode = gltf.Nodes[nodeIndex];

            var go = new GameObject();

            go.name = gltfNode.Name;

            var matrix = PrimitiveImporter.AsMatrix4x4(gltfNode.Matrix);

            if (!matrix.isIdentity)
            {
                throw new NotImplementedException("matrix is not implemented");
            }
            else
            {
                var t = PrimitiveImporter.AsVector3(gltfNode.Translation);
                var r = PrimitiveImporter.AsQuaternion(gltfNode.Rotation);
                var s = PrimitiveImporter.AsVector3(gltfNode.Scale);
                go.transform.localPosition = CoordUtils.ConvertSpace(t);
                go.transform.localRotation = CoordUtils.ConvertSpace(r);
                go.transform.localScale    = s;
            }

            gameObjects.Add(nodeIndex, go);

            if (gltfNode.Children != null)
            {
                foreach (var childIndex in gltfNode.Children)
                {
                    if (gameObjects.ContainsKey(childIndex))
                    {
                        throw new NotImplementedException("Node duplication"); // TODO:
                    }
                    CreateGameObjects(childIndex, gameObjects);

                    var childGo = gameObjects[childIndex];
                    childGo.transform.SetParent(go.transform, false);
                }
            }
        }
コード例 #2
0
        public IndexedResource <Transform> ForceExport(Transform trans)
        {
            var go = trans.gameObject;

            IndexedResource <Mesh> meshResource = null;
            int?skinIndex = null;
            var mr        = go.GetComponent <MeshRenderer>();
            var smr       = go.GetComponent <SkinnedMeshRenderer>();

            if (mr != null)
            {
                var meshFilter = mr.gameObject.GetComponent <MeshFilter>();
                var sharedMesh = meshFilter.sharedMesh;

                meshResource = Meshes.Export(mr, sharedMesh);
            }
            else if (smr != null)
            {
                var sharedMesh = smr.sharedMesh;
                meshResource = Meshes.Export(smr, sharedMesh);

                if (smr.bones.Length > 0)
                {
                    skinIndex = ExportSkin(smr, sharedMesh).Index;
                }
            }

            var t        = CoordUtils.ConvertSpace(go.transform.localPosition);
            var r        = CoordUtils.ConvertSpace(go.transform.localRotation);
            var s        = go.transform.localScale;
            var gltfNode = new Types.Node
            {
                Name = go.name,

                Mesh = meshResource != null ? (int?)meshResource.Index : null,
                Skin = skinIndex,

                Matrix      = null,
                Translation = new float[] { t.x, t.y, t.z },
                Rotation    = new float[] { r.x, r.y, r.z, r.w },
                Scale       = new float[] { s.x, s.y, s.z },
            };

            var nodesIndices = new List <int>();

            for (int i = 0; i < go.transform.childCount; ++i)
            {
                var c            = go.transform.GetChild(i);
                var nodeResource = Export(c.gameObject);
                nodesIndices.Add(nodeResource.Index);
            }
            if (nodesIndices.Count > 0)
            {
                gltfNode.Children = nodesIndices.ToArray();
            }

            foreach (var h in Hooks)
            {
                h.PostHook(this, trans, gltfNode);
            }

            return(new IndexedResource <Transform>
            {
                Index = Types.GltfExtensions.AddNode(Gltf, gltfNode),
                Value = trans,
            });
        }