Форум Flasher.ru

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

taluks 23.02.2013 15:44

линейное ускорение
 
Вложений: 1
создаю мир без гравитации, и создаю тело.
тело это будущая машина.
хочу сделать чтобы она двигалась с ускорением
Код AS3:

...body.CreateFixture2(polygonShape,1);...
body.ApplyForce(new b2Vec2(0.0,50),body.GetPosition());

но ускорения не заметно.
на до ли применять силы постепенно для ускорения?
как правильно сделать ускорение?
как сделать движение машины самостоятельным вместе с ускорением, т.е. просто проезжающие мимо например как тут (если перекрыть дорогу машине, она потом постепенно будет ускорятся и поедет...)

Asfel 25.02.2013 16:07

Нужно форс применять с каким то интервалом(типа двигатель работает)

taluks 25.02.2013 22:54

в чем разница такого эффекта, если ускорения не заметно, то ведь можно с интервалами и скорость линейную просто менять?

Bgg 25.02.2013 23:42

Цитата:

Сообщение от taluks (Сообщение 1122397)
в чем разница такого эффекта, если ускорения не заметно, то ведь можно с интервалами и скорость линейную просто менять?

It is very tempting to use the SetLinearVelocity function to explicitly set the velocity for a body to accomplish this, and indeed it does get the job done, but this approach has its drawbacks. While it often looks fine on the screen, setting the velocity directly means the body is not correctly participating in the physics simulation.

Asfel 25.02.2013 23:47

А разницы особо и нету все зависит от того что требуется. Важно как будет выглядеть конечный результат а не реализация

taluks 26.02.2013 02:19

Вложений: 1
взял я и написал по примеру как на с++ тут,
эффекта нет. что я делаю не так?
Код AS3:

package src.objects
{
        import flash.display.MovieClip;
        import Box2D.Dynamics.b2BodyDef;
        import Box2D.Dynamics.b2Body;
        import src.Game;
        import Box2D.Collision.Shapes.b2PolygonShape;
        import Box2D.Common.Math.b2Vec2;
        import flash.events.KeyboardEvent;
        import flash.events.Event;
 
        public class Car extends MovieClip
        {
                private var line:uint;
                private var body:b2Body;
                public function Car()
                {
                        this.addEventListener(Event.ADDED_TO_STAGE,init);
                }
                private function init(e:Event):void
                {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,acceleration);
                }
                public function create():void
                {
                        var bodyDef:b2BodyDef= new b2BodyDef();
                        bodyDef.type = b2Body.b2_dynamicBody;
                        bodyDef.position = new b2Vec2(100 / Game.meters,100/ Game.meters);
                        bodyDef.fixedRotation = true;
 
                        bodyDef.userData = this;
 
                        bodyDef.allowSleep=false;
 
                        body = Model.model.world.CreateBody(bodyDef);
 
                        var polygonShape:b2PolygonShape= new b2PolygonShape();
                        polygonShape.SetAsBox(15/Game.meters,30/Game.meters);
 
                        body.CreateFixture2(polygonShape,1);
 
                }
                private function acceleration(e:KeyboardEvent):void
                {
                        var  desiredVel:Number =0;
                        var vel:b2Vec2=body.GetLinearVelocity();
 
                        switch(e.keyCode)
                        {
                                case 37:
                                desiredVel=-5;
                                break;
                                case 38:
                                break;
                                case 39:
                                desiredVel=5;
                                break;
                                case 40:
                                desiredVel=0;
                                break;
                        }
                        var velChange:Number=desiredVel-vel.x;
                        var force:Number=body.GetMass() * velChange / (1/stage.frameRate);
                        body.ApplyForce(new b2Vec2(force,0),body.GetWorldCenter());
                        trace(force);
 
                }
 
        }
 
}


Asfel 26.02.2013 20:01

Ну я так думаю что благодаря этой формуле оно набирает скорость а патом с ней и двигается). А вообще я так полагаю что тебе нужно импульс задавать постоянный. Но все же я бы задался вопросом нужен ли вообще бокс для симуляции разгона)

taluks 27.02.2013 02:32

"Импульс генерирует очень большие силы на короткий промежуток времени. То сть если вам нужно симулировать удар по мячу, то применение импульса к мячу будет правильным выбором."- не подходит.
мне нужно нетолько симулировать разгон, но еще и определять препятствия для чего я собираюсь использовать рейкастинг

-De- 27.02.2013 03:05

KeyboardEvent.KEY_DOWN шлётся достаточно редко, запросто намного реже апдейта мира может происходить. Попробуйте влепить ApplyForce туда, где апдейт мира происходит (чтоб просто увидеть, что оно работает), затем сделать флаг, нажато ли ускорение и применять силу не по KEY_DOWN. Плюс сила может быть слишком маленькая.

Asfel 27.02.2013 16:48

Цитата:

Сообщение от taluks (Сообщение 1122612)
"Импульс генерирует очень большие силы на короткий промежуток времени. То сть если вам нужно симулировать удар по мячу, то применение импульса к мячу будет правильным выбором."- не подходит.
мне нужно нетолько симулировать разгон, но еще и определять препятствия для чего я собираюсь использовать рейкастинг

Минус использования форса-импульса для движения объекта в том что сложно добится желаемого результата в итоге. Контролировать скорость и прочее. А самостоятельное изменение линейного ускорения дает возможность четко контролировать и процесс разгона и само движение далее и к тому же никак не мешает отслеживать столкнокения


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

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