не возьмусь сказать, что конкретно косячит в вашем примере, но явно что-то с сохранением узлов в массиве точек (nodes который), он вообще в этом раскладе избыточный (у меня был приплетен ради выпендрежа с твином)
вот "отшкуренный' от лишних деталей вариант, может поможет разобраться
Код AS3:
package
{
import com.bit101.components.*;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class PlasticDeform extends Sprite
{
private var divX:int = 30;
private var divY:int = 40;
private var W:Number = 300;
private var H:Number = 400;
private var indices:Vector.<int>;
private var uvData:Vector.<Number>;
private var verticies:Vector.<Number>;
[Embed(source="sample.jpg")]
private var sample_jpg:Class;
private var texture:BitmapData=Bitmap(new sample_jpg()).bitmapData;
private var gridCheckBox:CheckBox;
private var undoBut:PushButton;
private var mX:Number;
private var mY:Number;
private var canvas:Sprite = new Sprite();
private var undoList:Array = [];
public function PlasticDeform():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
addChild(canvas);
gridCheckBox = new CheckBox(this, 20, 420, "grid", draw);
undoBut = new PushButton(this, 160, 420, "undo", undoBut_click);
initGrid();
draw();
canvas.addEventListener(MouseEvent.MOUSE_DOWN, canvas_mouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
private function canvas_mouseDown(e:MouseEvent):void
{
mX = mouseX;
mY = mouseY;
canvas.addEventListener(MouseEvent.MOUSE_MOVE, canvas_mouseMove);
undoList.push(verticies.concat());
}
private function canvas_mouseMove(e:MouseEvent):void
{
for (var k:int = 0; k < verticies.length; k += 2)
{
var tX:Number = verticies[k];
var tY:Number = verticies[k + 1];
var fX:Number = (mX - tX < 0) ? ((W - tX) / (W - mX)) : (tX / mX);
var fY:Number = (mY - tY < 0) ? ((H - tY) / (H - mY)) : (tY / mY);
var f:Number = fX * fY;
f *= f;
verticies[k] += (mouseX - mX) * f;
verticies[k + 1] += (mouseY - mY) * f;
}
draw();
mX = mouseX;
mY = mouseY;
}
private function stage_mouseUp(e:MouseEvent):void
{
canvas.removeEventListener(MouseEvent.MOUSE_MOVE, canvas_mouseMove);
}
private function undoBut_click(e:Event = null):void
{
if (undoList.length)
{
verticies = undoList.pop();
draw();
}
}
private function draw(e:Event = null):void
{
canvas.graphics.clear();
if (gridCheckBox.selected)
{
canvas.graphics.lineStyle(0, 0x80FF80, 0.35);
}
canvas.graphics.beginBitmapFill(texture, null, false, true);
canvas.graphics.drawTriangles(verticies, indices, uvData);
canvas.graphics.endFill();
}
private function initGrid():void
{
uvData = new Vector.<Number>();
verticies = new Vector.<Number>();
indices = new Vector.<int>();
var k:int = 0;
for (var i:int = 0; i <= divY; i++)
{
for (var j:int = 0; j <= divX; j++)
{
verticies.push(W * j / divX, H * i / divY);
uvData.push(j / divX, i / divY);
if (i < divY && j < divX)
{
indices.push(k, k + 1, k + divX + 1, k + 1, k + divX + 2, k + divX + 1);
}
k++;
}
}
}
}
}