+ * Some redundant information is lost by the world transform, such as -1,-1 scale versus 180 rotation. The computed local
+ * transform values may differ from the original values but are functionally the same. */
+ public function updateLocalTransform () : void {
+ var parent:Bone = this.parent;
+ if (parent == null) {
+ x = worldX;
+ y = worldY;
+ rotation = Math.atan2(c, a) * MathUtils.radDeg;
+ scaleX = Math.sqrt(a * a + c * c);
+ scaleY = Math.sqrt(b * b + d * d);
+ var det:Number = a * d - b * c;
+ shearX = 0;
+ shearY = Math.atan2(a * b + c * d, det) * MathUtils.radDeg;
+ return;
+ }
+ var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d;
+ var pid:Number = 1 / (pa * pd - pb * pc);
+ var dx:Number = worldX - parent.worldX, dy:Number = worldY - parent.worldY;
+ x = (dx * pd * pid - dy * pb * pid);
+ y = (dy * pa * pid - dx * pc * pid);
+ var ia:Number = pid * pd;
+ var id:Number = pid * pa;
+ var ib:Number = pid * pb;
+ var ic:Number = pid * pc;
+ var ra:Number = ia * a - ib * c;
+ var rb:Number = ia * b - ib * d;
+ var rc:Number = id * c - ic * a;
+ var rd:Number = id * d - ic * b;
+ shearX = 0;
+ scaleX = Math.sqrt(ra * ra + rc * rc);
+ if (scaleX > 0.0001) {
+ det = ra * rd - rb * rc;
+ scaleY = det / scaleX;
+ shearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
+ rotation = Math.atan2(rc, ra) * MathUtils.radDeg;
+ } else {
+ scaleX = 0;
+ scaleY = Math.sqrt(rb * rb + rd * rd);
+ shearY = 0;
+ rotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
+ }
+ appliedRotation = rotation;
+ }
public function worldToLocal (world:Vector.