Пример #1
0
        public void ExportVrmMeta(Vrm src, List <Texture> textures)
        {
            if (!Storage.Gltf.extensionsUsed.Contains(VrmExtensionName))
            {
                Storage.Gltf.extensionsUsed.Add(VrmExtensionName);
            }

            if (Storage.gltfVrm == null)
            {
                Storage.gltfVrm = new UniGLTF.Extensions.VRMC_vrm.VRMC_vrm();
            }

            Storage.gltfVrm.SpecVersion = src.SpecVersion;
            Storage.gltfVrm.Meta        = src.Meta.ToGltf(textures);
        }
Пример #2
0
        public void ExportVrmMeta(Vrm src, List <Texture> textures)
        {
            if (!Gltf.ExtensionsUsed.Contains(VrmExtensionName))
            {
                Gltf.ExtensionsUsed.Add(VrmExtensionName);
            }
            if (Gltf.Extensions == null)
            {
                Gltf.Extensions = new VrmProtobuf.Extensions();
            }
            if (Gltf.Extensions.VRMCVrm == null)
            {
                Gltf.Extensions.VRMCVrm = new VrmProtobuf.VRMCVrm();
            }
            var vrm = Gltf.Extensions.VRMCVrm;

            vrm.SpecVersion = src.SpecVersion;
            vrm.Meta        = src.Meta.ToGltf(textures);
        }
Пример #3
0
        public static bool LoadVrm(this Model self, Gltf gltf)
        {
            var gltfVrm = gltf.extensions?.VRM;

            if (gltfVrm == null)
            {
                return(false);
            }

            var Vrm = new Vrm(gltfVrm.meta.FromGltf(self.Textures), gltfVrm.exporterVersion, gltfVrm.specVersion);

            self.Vrm = Vrm;

            if (gltfVrm.humanoid != null)
            {
                foreach (var humanBone in gltfVrm.humanoid.humanBones)
                {
                    if (humanBone.bone != GltfFormat.HumanoidBones.unknown)
                    {
                        self.Nodes[humanBone.node].HumanoidBone = (VrmLib.HumanoidBones)humanBone.bone;
                    }
                }
            }

            if (!self.CheckVrmHumanoid())
            {
                throw new Exception("duplicate human bone");
            }

            // blendshape
            if (gltfVrm.blendShapeMaster != null &&
                gltfVrm.blendShapeMaster.blendShapeGroups != null &&
                gltfVrm.blendShapeMaster.blendShapeGroups.Any())
            {
                Vrm.BlendShape = gltfVrm.blendShapeMaster.FromGltf(self.MeshGroups, self.Materials, self.Nodes);
            }

            // secondary
            if (!(gltfVrm.secondaryAnimation is null))
            {
                Vrm.SpringBone = new SpringBoneManager();

                // colliders
                Vrm.SpringBone.Colliders.AddRange(
                    gltfVrm.secondaryAnimation.colliderGroups.Select(y =>
                                                                     new SpringBoneColliderGroup(
                                                                         self.Nodes[y.node],
                                                                         y.colliders.Select(z => VrmSpringBoneCollider.CreateSphere(z.offset, z.radius))
                                                                         )
                                                                     ));

                // springs
                Vrm.SpringBone.Springs.AddRange(gltfVrm.secondaryAnimation.boneGroups.Select(x =>
                {
                    var sb = new SpringBone();
                    sb.Bones.AddRange(x.bones.Select(y => self.Nodes[y]));
                    if (x.center >= 0)
                    {
                        sb.Origin = self.Nodes[x.center];
                    }
                    sb.Colliders.AddRange(x.colliderGroups.Select(y => Vrm.SpringBone.Colliders[y]));
                    sb.Comment      = x.comment;
                    sb.DragForce    = x.dragForce;
                    sb.GravityDir   = x.gravityDir;
                    sb.GravityPower = x.gravityPower;
                    sb.HitRadius    = x.hitRadius;
                    sb.Stiffness    = x.stiffiness;
                    return(sb);
                }));
            }

            // material(already replaced)

            if (gltfVrm.firstPerson != null)
            {
                Vrm.FirstPerson = gltfVrm.firstPerson.FromGltf(self.Nodes, self.MeshGroups);
                Vrm.LookAt      = gltfVrm.firstPerson.LookAtFromGltf();
                Vrm.LookAt.OffsetFromHeadBone = gltfVrm.firstPerson.firstPersonBoneOffset;
            }

            return(true);
        }