public override void FadeOut() { var result = this.bonePose.result; result.rotation = DrangonTransform.NormalizeRadian(result.rotation); result.skew = DrangonTransform.NormalizeRadian(result.skew); }
private void _ComputeA() { var ikGlobal = this._target.global; var global = this._root.global; var globalTransformMatrix = this._root.globalTransformMatrix; var radian = (float)Math.Atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); if (global.scaleX < 0.0f) { radian += (float)Math.PI; } global.rotation += DrangonTransform.NormalizeRadian(radian - global.rotation) * this._weight; global.ToMatrix(globalTransformMatrix); }
protected override void _OnArriveAtFrame() { base._OnArriveAtFrame(); if (this._timelineData != null) { var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 2; var frameFloatArray = this._dragonBonesData.frameFloatArray; var current = this.bonePose.current; var delta = this.bonePose.delta; current.rotation = frameFloatArray[valueOffset++]; current.skew = frameFloatArray[valueOffset++]; if (this._tweenState == TweenState.Always) { if (this._frameIndex == this._frameCount - 1) { valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; delta.rotation = DrangonTransform.NormalizeRadian(frameFloatArray[valueOffset++] - current.rotation); } else { delta.rotation = frameFloatArray[valueOffset++] - current.rotation; } delta.skew = frameFloatArray[valueOffset++] - current.skew; } else { delta.rotation = 0.0f; delta.skew = 0.0f; } } else { // Pose. var current = this.bonePose.current; var delta = this.bonePose.delta; current.rotation = 0.0f; current.skew = 0.0f; delta.rotation = 0.0f; delta.skew = 0.0f; } }
private void _ComputeB() { var boneLength = this._bone.boneData.length; var parent = this._root as Bone; var ikGlobal = this._target.global; var parentGlobal = parent.global; var global = this._bone.global; var globalTransformMatrix = this._bone.globalTransformMatrix; var x = globalTransformMatrix.a * boneLength; var y = globalTransformMatrix.b * boneLength; var lLL = x * x + y * y; var lL = (float)Math.Sqrt(lLL); var dX = global.x - parentGlobal.x; var dY = global.y - parentGlobal.y; var lPP = dX * dX + dY * dY; var lP = (float)Math.Sqrt(lPP); var rawRadian = global.rotation; var rawParentRadian = parentGlobal.rotation; var rawRadianA = (float)Math.Atan2(dY, dX); dX = ikGlobal.x - parentGlobal.x; dY = ikGlobal.y - parentGlobal.y; var lTT = dX * dX + dY * dY; var lT = (float)Math.Sqrt(lTT); var radianA = 0.0f; if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { radianA = (float)Math.Atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); if (lL + lP <= lT) { } else if (lP < lL) { radianA += (float)Math.PI; } } else { var h = (lPP - lLL + lTT) / (2.0f * lTT); var r = (float)Math.Sqrt(lPP - h * h * lTT) / lT; var hX = parentGlobal.x + (dX * h); var hY = parentGlobal.y + (dY * h); var rX = -dY * r; var rY = dX * r; var isPPR = false; var parentParent = parent.parent; if (parentParent != null) { var parentParentMatrix = parentParent.globalTransformMatrix; isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0f; } if (isPPR != this._bendPositive) { global.x = hX - rX; global.y = hY - rY; } else { global.x = hX + rX; global.y = hY + rY; } radianA = (float)Math.Atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); } var dR = DrangonTransform.NormalizeRadian(radianA - rawRadianA); parentGlobal.rotation = rawParentRadian + dR * this._weight; parentGlobal.ToMatrix(parent.globalTransformMatrix); // var currentRadianA = rawRadianA + dR * this._weight; global.x = parentGlobal.x + (float)Math.Cos(currentRadianA) * lP; global.y = parentGlobal.y + (float)Math.Sin(currentRadianA) * lP; // var radianB = (float)Math.Atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); if (global.scaleX < 0.0f) { radianB += (float)Math.PI; } global.rotation = parentGlobal.rotation + rawRadian - rawParentRadian + DrangonTransform.NormalizeRadian(radianB - dR - rawRadian) * this._weight; global.ToMatrix(globalTransformMatrix); }