예제 #1
0
        public MountAnimationGeneratorService(AnimationSettingsViewModel animationSettings, Rmv2MeshNode mountMesh, int mountVertexId, int riderBoneIndex, AssetViewModel rider, AssetViewModel mount)
        {
            _animationSettings = animationSettings;
            _mountVertexId     = mountVertexId;

            _riderBoneIndex = riderBoneIndex;
            _riderSkeleton  = rider.Skeleton;
            _mountSkeleton  = mount.Skeleton;

            float mountScale = (float)_animationSettings.Scale.Value;

            mount.SetTransform(Matrix.CreateScale(mountScale));
            _mountVertexPositionResolver = new MeshAnimationHelper(mountMesh, Matrix.CreateScale(mountScale));
        }
        void FitMeshToSkeleton()
        {
            AnimationClip animationClip = new AnimationClip();

            animationClip.DynamicFrames.Add(new AnimationClip.KeyFrame());

            for (int i = 0; i < _currentSkeleton.BoneCount; i++)
            {
                //animationClip.DynamicFrames[0].Rotation.Add(Quaternion.Identity);
                //animationClip.DynamicFrames[0].Position.Add(Vector3.Zero);

                animationClip.DynamicFrames[0].Rotation.Add(_currentSkeleton.Rotation[i]);
                animationClip.DynamicFrames[0].Position.Add(_currentSkeleton.Translation[i]);

                animationClip.RotationMappings.Add(new Filetypes.RigidModel.AnimationFile.AnimationBoneMapping(i));
                animationClip.TranslationMappings.Add(new Filetypes.RigidModel.AnimationFile.AnimationBoneMapping(i));
            }

            for (int i = 0; i < _currentSkeleton.BoneCount; i++)
            {
                var mappedIndex = _mapping.FirstOrDefault(x => x.OriginalValue == i);
                if (mappedIndex != null)
                {
                    var parentBoneId      = _currentSkeleton.GetParentBone(i);
                    var parentBoneMapping = _mapping.FirstOrDefault(x => x.OriginalValue == parentBoneId);
                    animationClip.DynamicFrames[0].Position[i] = _targetSkeleton.Translation[mappedIndex.NewValue];
                    animationClip.DynamicFrames[0].Rotation[i] = _targetSkeleton.Rotation[mappedIndex.NewValue];
                }
            }

            _currentSkeleton.RebuildSkeletonMatrix();

            MeshAnimationHelper meshAnimationHelper = new MeshAnimationHelper(_meshOwner, Matrix.Identity);
            var animationFrame = AnimationSampler.Sample(0, 0, _currentSkeleton, animationClip);

            _currentSkeleton.SetAnimationFrame(animationFrame);

            int vertexCount = _meshOwner.Geometry.VertexCount();

            for (int i = 0; i < vertexCount; i++)
            {
                var vertTransform = meshAnimationHelper.GetVertexTransform(animationFrame, i);
                _meshOwner.Geometry.TransformVertex(i, (vertTransform));
            }

            _meshOwner.Geometry.RebuildVertexBuffer();
        }