Проблема с box2d
Недавно начал разбираться с box2d и столкнулся с проблемой.
Проблема заключается в том, что созданные фигуры проваливаются друг в друга как на картинке ниже.
[IMG]http://i057.***********/1102/56/5ad83cd394a6.png[/IMG]
Ни как не пойму в чём же дело.
Вот исходники:
Код AS3:
package {
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.events.*;
import flash.display.Shape;
import flash.display.Sprite;
import Box2D.Collision.*;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.*;
import Box2D.Collision.Shapes.*;
public class main extends MovieClip{
var timeStep:Number = 1/60;
var iterations:Number = 100;
var world:b2World;
var dbgDraw:b2DebugDraw;
var debugSprite;
var f:figure;
public function main() {
//Мир
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2 = new b2Vec2 (0.0, 100.0);
var doSleep:Boolean = true;
world = new b2World(worldAABB, gravity, doSleep);
//Фигура
var figura:Shape = new Shape();
addChild(figura);
figura.graphics.beginFill(0x000000, 0.50);
figura.graphics.lineStyle(2, 0x000000);
f = new figure();
for(var i = 0; i < 8; i++){
figura.graphics.lineTo(f.X[i], f.Y[i]);
}
figura.graphics.lineTo(f.X[0], f.Y[0]);
figura.x = 100;
figura.y = 50;
figura.graphics.endFill();
var ground:Shape = new Shape();
addChild(ground);
ground.graphics.beginFill(0x000000, 0.50);
ground.graphics.lineStyle(1, 0x000000);
ground.graphics.lineTo(200, 0);
ground.graphics.lineTo(200, 100);
ground.graphics.lineTo(0, 100);
ground.graphics.lineTo(0, 0);
ground.x = 100;
ground.y = 300;
ground.graphics.endFill();
debugSprite = new Sprite();
addChild(debugSprite);
dbgDraw= new b2DebugDraw();
//Бокс
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(figura.x/30, figura.y/30);
bodyDef.userData = figura;
var body:b2Body = world.CreateBody(bodyDef);
var shapeDef:b2PolygonDef = new b2PolygonDef();
shapeDef.vertexCount = 8;
for(var i = 0; i < 8; i++){
shapeDef.vertices[i].Set(f.X[i]/30, f.Y[i]/30);
}
shapeDef.density = 0.00000001;
shapeDef.friction = 0.3;
shapeDef.restitution = 0.3;
body.CreateShape(shapeDef);
body.SetMassFromShapes();
//Земля
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(ground.x/30, ground.y/30);
bodyDef.userData = ground;
var body:b2Body = world.CreateBody(bodyDef);
var shapeDef:b2PolygonDef = new b2PolygonDef();
shapeDef.vertexCount = 4;
shapeDef.vertices[0].Set(200/30, 0);
shapeDef.vertices[1].Set(200/30, 100/30);
shapeDef.vertices[2].Set(0, 100/30);
shapeDef.vertices[3].Set(0, 0);
shapeDef.density = 0;
shapeDef.friction = 1;
shapeDef.restitution =0.2;
body.CreateShape(shapeDef);
body.SetMassFromShapes();
addEventListener(Event.ENTER_FRAME, updateWorld);
}
public function updateWorld(e:Event){
world.Step(timeStep, iterations);
dbgDraw.m_sprite = debugSprite;
dbgDraw.m_drawScale = 30.0;
dbgDraw.m_fillAlpha = 0.3;
dbgDraw.m_lineThickness = 1.0;
dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;
world.SetDebugDraw(dbgDraw);
for (var bodiesList = world.GetBodyList(); bodiesList; bodiesList = bodiesList.GetNext()){
// Извлекаем вектор позиции тела
var tVector = bodiesList.GetPosition();
// Присваиваем значения этого вектора, заранее умножив на коефициент перевода с метров в пиксели, нашему графическому отображению.
bodiesList.m_userData.x = tVector.x * 30;
bodiesList.m_userData.y = tVector.y * 30;
// Извлекаем угол (в радианах) множим на коефициент перевода в градусы и присваиваем нашему отображению
bodiesList.m_userData.rotation = bodiesList.GetAngle() * 180 / Math.PI;
}
}
}
}
|