Форум

Обработка столкновений твёрдых тел

03 мая 2015 20:33 #2248
И снова здравствуйте! У меня вот вопрос…

Как мне определить с каким объектом произошло столкновение?
Где произошло столкновение?
На данный момент напридумывал такое:
    var sensor_col = m_ctl.create_collision_impulse_sensor(pula_new);
    var sensors = [sensor_col];
    
    var logic_func = function(s) {
        if (s[0] > 0)
            return 1;
        else
            return 0;
    }

    function trigger_pula(obj, id, pulse) {
        console.log({obj:obj,id:id,pulse:pulse});
    }

    m_ctl.create_sensor_manifold(pula_new, "COLLISION", m_ctl.CT_TRIGGER, sensors,
        logic_func, trigger_pula);

Консоль пишет obj:объект, который столкнулся, id:"COLLISION", pulse: 1 или -1.
Cила столкновения s является нулевым элементом метода logic_func
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
03 мая 2015 21:09 #2249

Как мне определить с каким объектом произошло столкновение?
Если мне не изменяет память, я это реализовал, повесив манифолд не на объект, который сталкивается, а на обект, с которым мой обект (в данном случае я так понимаю пуля) должен столкнуться. В этом случае в колбэке мы будем иметь ссылку на "обект-препятствие", а сенсор сработает у пули. То есть
m_ctl.create_sensor_manifold({Тут тот в кого стреляем}, "COLLISION", m_ctl.CT_TRIGGER, sensors,
        logic_func, trigger_pula);


ну и как следствие, мы можем получить координаты объектов в момент столкновения простым transform.get_translation(). Так же, если не ошибаюсь, я как-то в колбэк передавал 4 параметром объект, у которого можно спросить "а где?". И заморочка у меня была тож с collision'ами. Только вот не помню как я это делал. Пошарю по проектам, если найду скину.
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
04 мая 2015 08:32 #2251
-Vampire-, у меня была идея сделать таким образом. Но тут количество обработчиков с увеличением числа игроков и выпущенных ими пуль будет быстро расти. Что, боюсь, очень сильно скажется на производительности. И самое главное… Я не смогу определить, какой игрок выпустил пулю, так как не получу объект пули, в котором лежит айдишник игрока, создавшего её

Есть вариант слушать 2 события. От пули и от игрока. И если они происходят почти одновременно, регистрировать попадание игроком в игрока. (Но мне кажется это костыль… При физ движке, который работает в потоке ).

Зарисовал масштаб трагедии (чего то svg форум не принял…)

Плюс у меня, возможно, будет много динамических объектов, расставленных на сцене, которые могут нанести урон игроку, нужно отличать их от статических стен.
Координаты столкновений нужны, так как взаимодействующие тела могут быть большого размера, и хочется визуализировать это место (например добавить искры)
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
05 мая 2015 12:37 #2265
Добрый день.

Посмотрите на этот туториал.
После раздела Падение камней - сенсоры, по-моему, описано почти всё, что вам нужно. Если что-то неочевидно - спрашивайте. Возможно, заодно подправим и этот урок
Разработчик Blend4Web
05 мая 2015 14:43 #2270
Кирилл, а вы можете стукнуть ко мне в вк? Я в вк

Вы сейчас делаете то, что я собирался делать чуть попозже. Может мы сможем как-то скооперироваться? Не хотелось бы потерять контакты. Мой проект коммерческий и если бы вы согласились войти в команду и принять в нём участие, мне кажется мы смогли бы сделать крутую штуку
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
11 мая 2015 19:36 #2351
Посмотрите на этот туториал.
Посмотрел и напридумывал следующие:
    var _player_id = 82939;
    var _impulse;

    var obrabotchik = function(s) {
        _impulse = s[0];
        return s[1];
    }

    function sobitie(obj, id, pulse, param) {
        var collision_pt = m_ctl.get_sensor_payload(obj, id, 1);

        console.log({obj:obj, id:id, pulse:pulse, param:param, collision_pt:collision_pt, impulse:_impulse});
    }

    var sensor_impulse = m_ctl.create_collision_impulse_sensor(pula_new);
    var sensor_collision = m_ctl.create_collision_sensor(pula_new, 'PLAYER', true);
    m_ctl.create_sensor_manifold(pula_new, "TEST1", m_ctl.CT_SHOT, [sensor_impulse, sensor_collision],
        obrabotchik, sobitie, _player_id);
Где pula_new это только что созданная и помещённая на сцену пуля, которая слушает столкновения.

Понял как определить координаты столкновения это collision_pt. Знаю куда передавать id игрока, создавшего пулю, у меня это param, импульс тела это impulse.
А вот способ определения объекта, с которым произошло столкновение мне не подходит. Потому что:
  • у меня не фиксированное количество объектов (игроков) с которым нужно определить столкновение,
  • объекты(игроки) могут появиться на сцене после создания пули, и при контакте пули с этим новым игроком, событие не отловить(только если, не пересоздавать все слушатели)
У меня сейчас в мыслях напридумывать кучу костылей с массивами. Но хочу услышать ваш совет
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
12 мая 2015 15:07 #2358
На самом деле, в нашем API сейчас действительно не хватает некоторых моментов для удобной реализации вашей задачи. В следующих релизах добавим возможность получать объект соударения напрямую в обработчике столкновения.

Сейчас же ничего другого, кроме как размножать сенсорные множества не остается. То есть, каждый появившийся игрок должен генерировать свой уникальный ID, для соударения с которым снаряд будет регистрировать свой обработчик.

Но вообще говоря, это не самая лучшая идея делать все просчеты с помощью соударений. Пули будут очень маленькими и обязательно будут моменты, когда из-за дискретности расчетов на физике, они будут пролетать сквозь игроков. Я бы смотрел в сторону raycast сенсоров в вашем случае. (Хоть на них пока есть те же проблемы, что описаны в предыдущих абзацах)
Разработчик Blend4Web
12 мая 2015 16:09 #2361
Но вообще говоря, это не самая лучшая идея делать все просчеты с помощью соударений
Я это понимаю, поэтому в будущем буду проводить расчёты на сервере (учитывая задержки игроков и др. факторы соединения), строя виртуальную картину происходящего на сервере.

Сейчас делаю, просто что бы работало . Пули пока что имеют не очень большую скорость, что допускает погрешность.
Спасибо за ответ! Очень приятно что разработка вашего фреймворка поддаётся гибкости и вы идёте на встречу разработчикам
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
13 июня 2015 00:35 #2731
В следующей версии движка будет полностью переработанный "рейкастинг" и вычисление соударений. Так что все проблемы этого топика должны разрешиться. Ожидайте первые тестовые сборки через неделю.
Команда Blend4Web
https://twitter.com/AlexKowel
09 января 2016 16:56 #6374
В итоге, в коллбек приходит объект?
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.