Я бы посоветовал юзать Вам вот
этот инструмент , а так же прикладываю вам классы, для генерации тел используя png или альфа канал ( очень полезная штука )
BitmapDataIso.as

Код AS3:
package net.alexscript.source.nape
{
import nape.geom.AABB;
import nape.geom.IsoFunction;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
public class BitmapDataIso implements IsoFunction
{
public var bitmap:BitmapData;
public var alphaThreshold:Number;
public var bounds:AABB;
public function BitmapDataIso(bitmap:BitmapData, alphaThreshold:Number = 0x80):void
{
this.bitmap = bitmap;
this.alphaThreshold = alphaThreshold;
bounds = new AABB(0, 0, bitmap.width, bitmap.height);
}
public function graphic():DisplayObject
{
return new Bitmap(bitmap);
}
public function iso(x:Number, y:Number):Number
{
// Take 4 nearest pixels to interpolate linearly.
// This gives us a smooth iso-function for which
// we can use a lower quality in MarchingSquares for
// the root finding.
var ix:int = int(x); var iy:int = int(y);
//clamp in-case of numerical inaccuracies
//if(ix<0 data-blogger-escaped-if="if" data-blogger-escaped-ix="ix" data-blogger-escaped-iy="0;">=bitmap.width) ix = bitmap.width-1;
if(iy>=bitmap.height) iy = bitmap.height-1;
// iso-function values at each pixel centre.
var a11:Number = alphaThreshold - (bitmap.getPixel32(ix,iy)>>>24);
var a12:Number = alphaThreshold - (bitmap.getPixel32(ix+1,iy)>>>24);
var a21:Number = alphaThreshold - (bitmap.getPixel32(ix,iy+1)>>>24);
var a22:Number = alphaThreshold - (bitmap.getPixel32(ix+1,iy+1)>>>24);
// Bilinear interpolation for sample point (x,y)
var fx:Number = x - ix; var fy:Number = y - iy;
return a11*(1-fx)*(1-fy) + a12*fx*(1-fy) + a21*(1-fx)*fy + a22*fx*fy;
}
}
}
DisplayObjectIso.as

Код AS3:
package net.alexscript.source.nape
{
import flash.display.DisplayObject;
import nape.geom.AABB;
import nape.geom.IsoFunction;
public class DisplayObjectIso implements IsoFunction
{
public var displayObject:DisplayObject;
public var bounds:AABB;
public function DisplayObjectIso(displayObject:DisplayObject):void
{
this.displayObject = displayObject;
this.bounds = AABB.fromRect(displayObject.getBounds(displayObject));
}
public function iso(x:Number, y:Number):Number
{
// Best we can really do with a generic DisplayObject
// is to return a binary value {-1, 1} depending on
// if the sample point is in or out side.
return (displayObject.hitTestPoint(x, y, true) ? -1.0 : 1.0);
}
}
}
IsoBody.as

Код AS3:
package net.alexscript.source.nape
{
import nape.dynamics.InteractionFilter;
import nape.geom.AABB;
import nape.geom.GeomPoly;
import nape.geom.GeomPolyList;
import nape.geom.IsoFunction;
import nape.geom.MarchingSquares;
import nape.geom.Vec2;
import nape.phys.Body;
import nape.phys.Material;
import nape.shape.Polygon;
public class IsoBody
{
private static var _m:Material = new Material(.2,1,1,.2);
public static function get m():Material
{
return _m;
}
public static function material(m:Material):Class {
_m = m;
return IsoBody;
}
public static function run(iso:IsoFunction, mass:Number, bounds:AABB, granularity:Vec2 = null, quality:int = 2, simplification:Number = 1.5,filter:InteractionFilter = null):Body
{
var body:Body = new Body();
if (granularity == null) granularity = Vec2.weak(8, 8);
var polys:GeomPolyList = MarchingSquares.run(iso, bounds, granularity, quality);
for (var i:int = 0; i < polys.length; i++)
{
var p:GeomPoly = polys.at(i);
var qolys:GeomPolyList = p.simplify(simplification).convexDecomposition(true);
for (var j:int = 0; j < qolys.length; j++)
{
var q:GeomPoly = qolys.at(j);
//new Material(elast, dynaf, stat, dens );
//new Material( 0,1,2,1);
body.shapes.add(new Polygon(q,IsoBody.m,filter));
// Recycle GeomPoly and its vertices
q.dispose();
}
// Recycle list nodes
qolys.clear();
// Recycle GeomPoly and its vertices
p.dispose();
}
// Recycle list nodes
polys.clear();
body.mass = mass;
// Align body with its centre of mass.
// Keeping track of our required graphic offset.
var pivot:Vec2 = body.localCOM.mul(-1);
body.translateShapes(pivot);
//trace( pivot );
body.userData.graphicOffset = pivot;
return body;
}
}
}
Юзается так

Код AS3:
// создаем образ из битмапы
var _iso:BitmapDataIso = new BitmapDataIso(bitmapdata, 0x0);
//устанавливаем дефолтный материал
IsoBody.material( new Material());
// получаем тело
var body:Body = IsoBody.run(_iso, mass/*вес_тела*/, _iso.bounds/*границы*/,null/*зернистость*/,2/*качество*/,1.5/*сглаживание_упрощение*/,filter/*фильтр_колизий*/);
Добавлено через 3 минуты

Код AS3:
body.userData.graphicOffset
тело будет иметь информацию, для корректного сдвига графики