"Честный" полёт стрелы в box2d

Замечал, что во многих играх с физикой и стрелами полёт стрелы смоделирован не очень хорошо.
Расскажу самый простой способ делать реалистичные стрелы в боксе, вроде таких:



(пост рассчитан в основном на тех, кто не очень давно работает с движком)
сама стрела состоит из двух тел, соединённых джоинтом.


в функции update просто применяем к телу оперения следующую функцию:

speedCut(arrow.fletching_body,1,0);

//////

private function speedCut(b:b2Body,xk:Number,yk:Number):void {

                        var spd,spd2:b2Vec2;
                        spd = b.GetLinearVelocity();
                        spd2 = b.GetLocalVector(spd);

                        spd2.x = spd2.x * xk;
                        spd2.y = spd2.y * yk;

                        spd = b.GetWorldVector(spd2);
                        b.SetLinearVelocity(spd);

                }


она берёт локальную скорость тела, и умножает в ней икс и игрек на коэффициенты, если коэффициент х=1, а y=0, то тело будет двигаться только «вдоль себя», т.е. только в ту сторону, куда оно повернуто
(в общем то примерно так и действует оперение стрелы в реальной жизни :))

по просьбе vizgl вариант для одного тела(работает очень похоже, но не честно, и всякие навороты вроде ветра сделать для такого варианта сложно):

//обрезаем поперечную скорость
speedCut(arrow.arrow_body,1,0);
//координаты в теле, на которых должен быть "перед" стрелы: (одинаковы при любом повороте, можно задать вначале)
var nosePos:b2Vec2 = new b2Vec2( 10/worldScale, 0);
//прикладываем к этой точке в теле импульс вниз
arrow.arrow_body.ApplyImpulse(new b2Vec2(0,0.01),arrow.arrow_body.GetWorldPoint(nosePos));

Комментарии (17)

0
а если используя только 1 тело?
  • vizgl
  • vizgl
0
добавил в конец поста
0
У меня вопрос по другой теме :)

Движение шарика по кривой сделано с помощью Box2D?
  • Rosso
  • Rosso
0
Да, в примере всё боксовское, холмы честно стырены у феронато.
0
А можно поподробнее, у кого стырены?))
  • Rosso
  • Rosso
0
держи www.emanueleferonato.com/category/box2d/
0
Спасибо, почитаем )
0
Честный полет не очень-то нужен ;).
+1
Должен возразить.
Когда поиграл в этот прототипчик (в скайп-чате мелькнул), завис не в последнюю очередь именно на клево летающих стрелах! Особенно уместно это в игре, где прямой выстрел встречается реже «баллистического» — там-то вся эта красота и раскрывается.
0
Все понятно, я о том, что описанный способ реализации полета стрелы никак нельзя назвать физически честным.
0
чтоб было совсем честно, надо только сделать чтоб уменьшение поперечной скорости прямо зависело от продольной скорости, не?
0
Ну и добавить небольшую «аэродинамичность» самому стержню стрелы.
0
Чтобы совсем честно, надо учесть изменение размера по Лоренцу, ну и квантовые эффекты :-)
0
Чтоб совсем-совсем, надо каждую молекулу просчитывать)
0
Совсем честный полет очень сложный. Мне физики энтузиасты слали на почту формулы для стрел :D. Главное ведь не физичность, а чтобы играть было интересно.
0
> Главное ведь не физичность, а чтобы играть было интересно.

точна!
0
А формула полета должна подходить игре. Я в своих играх пробовал доворачивать стрелу, как в статье, но не работает :). Вернее работает, но играть неудобно.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.