private void ExportAnimData(AnimationState animationState, int frame, string dir) { _sampleAnimation.Stop(); List <AnimData.FrameData> frameList = new List <AnimData.FrameData>(); float time = 0.0f; bool isEnd = false; do { if (time >= animationState.length) { time = animationState.length; isEnd = true; } AnimData.FrameData frameData = GetFrameData(animationState, time); frameList.Add(frameData); time += 1.0f / frame; if (isEnd) { break; } } while (true); AnimData animData = ScriptableObject.CreateInstance <AnimData>(); animData.frameDatas = frameList.ToArray(); animData.name = animationState.name; animData.animLen = animationState.length; animData.frame = frame; string path = dir + "/" + animationState.name + ".asset"; AssetDatabase.CreateAsset(animData, path); }
private AnimData.FrameData GetFrameData(AnimationState animationState, float time) { animationState.enabled = true; animationState.weight = 1.0f; animationState.time = time; _sampleAnimation.Sample(); AnimData.FrameData frameData = new AnimData.FrameData(); frameData.time = time; List <Matrix4x4> matrix4X4s = new List <Matrix4x4>(); foreach (Transform bone in _bones) { matrix4X4s.Add(bone.localToWorldMatrix); } frameData.matrix4X4s = matrix4X4s.ToArray(); return(frameData); }
void ApplyFrame(int f) { _frame = f; AnimData.FrameData frameData = _animData.frameDatas[_frame]; for (int i = 0; i < _srcPoints.Count; ++i) { Vector3 point = _srcPoints[i]; BoneWeight weight = _mesh.boneWeights[i]; Matrix4x4 tempMat0 = frameData.matrix4X4s[weight.boneIndex0] * _bindPoses[weight.boneIndex0]; Matrix4x4 tempMat1 = frameData.matrix4X4s[weight.boneIndex1] * _bindPoses[weight.boneIndex1]; Matrix4x4 tempMat2 = frameData.matrix4X4s[weight.boneIndex2] * _bindPoses[weight.boneIndex2]; Matrix4x4 tempMat3 = frameData.matrix4X4s[weight.boneIndex3] * _bindPoses[weight.boneIndex3]; Vector3 temp = tempMat0.MultiplyPoint(point) * weight.weight0 + tempMat1.MultiplyPoint(point) * weight.weight1 + tempMat2.MultiplyPoint(point) * weight.weight2 + tempMat3.MultiplyPoint(point) * weight.weight3; _newPoints[i] = temp; } _mesh.SetVertices(_newPoints); }