Форум 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=204394)

iters 28.10.2013 23:49

цеетр тяжеститела в box2d
 
Здарвсвуйте, у меня есть сложная невыпуклая фигура, я разбив её на 2 половины,описываю каждую половину в box2d.Тело получается, но с сильно смещенным центром тяжести в право, из-за этого получается очень много
косяков. Вот пример кода

Код AS3:

bodyDef = new b2BodyDef();
 
                        var val1:Number = 98 / meters + Math.cos(nAngle/180*Math.PI) * (71/meters);
                        var val2:Number = 348/meters - Math.sin(nAngle/180*Math.PI)*(71/meters);
 
 
                        bodyDef.position.Set(val1, val2) ;
                        bodyDef.type = b2Body.b2_staticBody ;
                        bodyShapePoligon = new b2PolygonShape() ;
                        bodyShapePoligon.SetAsArray([b2Vec2.Make( -26 / meters, 26 / meters), b2Vec2.Make( 8 / meters, -27 / meters),
                        b2Vec2.Make( 15 / meters, -19 / meters), b2Vec2.Make( 14 / meters, -6 / meters),b2Vec2.Make( 9 / meters, 5 / meters),b2Vec2.Make( -4 / meters, 20 / meters),b2Vec2.Make( -18 / meters, 26 / meters),b2Vec2.Make( -23 / meters, 27 / meters)], 8) ;
                        fixture = new b2FixtureDef() ;
                        fixture.shape = bodyShapePoligon;
                        fixture.friction = 0.9;
                        fixture.density = 10;
                        fixture.restitution = 0.5;
                        body = _world.CreateBody(bodyDef);
                        body.CreateFixture(fixture) ;
 
                        bodyShapePoligon = new b2PolygonShape() ;           
                        bodyShapePoligon.SetAsArray([b2Vec2.Make( -28 / meters, 25 / meters), b2Vec2.Make( -31 / meters, 22 / meters),
                        b2Vec2.Make( -34 / meters, 14 / meters), b2Vec2.Make( -33 / meters, 6 / meters),b2Vec2.Make( -28 / meters, -10 / meters),b2Vec2.Make( -14 / meters, -22 / meters),b2Vec2.Make( 1 / meters, -29 / meters),b2Vec2.Make( 3 / meters, -29 / meters)], 8) ;
                        fixture = new b2FixtureDef() ;
                        fixture.shape = bodyShapePoligon;
                        fixture.friction = 0.9;
                        fixture.density = 5;
                        fixture.restitution = 0.5;
                    body.CreateFixture(fixture) ;
 
                        body.ApplyImpulse(new b2Vec2(Math.cos(-nAngle/180*Math.PI)*distance*20, Math.sin(-nAngle/180*Math.PI+9*Math.PI/20)*distance*20),
                        new b2Vec2(body.GetWorldCenter().x , body.GetWorldCenter().y));


nldr 29.10.2013 02:47

Вот вам быстрый трикс.
Делаете еще один кусок (форму можно описать примитивом, кругом например) с большим density (density других кусков можно подогнать поэксперементировав, если вам надо фиксированную массу иметь), только чтобы он не вылазил за рамки других кусков (т.е. не создавал не нужных коллизий).
Позиционируете его в теле, там где надо центр тяжести и вуаля!

iters 29.10.2013 15:40

спасибо, интересно попробывать,
я пытался через setMassDate , но как ни странно центр тяжести не отклонялся


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

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