Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Проблема с box2d (http://www.flasher.ru/forum/showthread.php?t=150546)

Elidan 13.02.2011 22:35

Проблема с 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;
                        }
                }
        }
 
}


Alex Lexcuk 13.02.2011 23:00

Фигуры должны быть выпуклые.

Elidan 13.02.2011 23:08

Т.е фигуру которая у меня на изображении я должен собрать из нескольких простых выпуклых фигур и соединить их, тогда будет нормально работать?

КорДум 13.02.2011 23:09

Верно.

iNils 14.02.2011 12:11

Название темы не раскрывает сути вопроса.


Часовой пояс GMT +4, время: 13:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.