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(); }