Обработка столкновений твёрдых тел
03 мая 2015 20:33
И снова здравствуйте! У меня вот вопрос…
Как мне определить с каким объектом произошло столкновение?
Где произошло столкновение?
На данный момент напридумывал такое:
Консоль пишет obj:объект, который столкнулся, id:"COLLISION", pulse: 1 или -1.
Cила столкновения s является нулевым элементом метода logic_func
Как мне определить с каким объектом произошло столкновение?
Где произошло столкновение?
На данный момент напридумывал такое:
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/
http://naviris.ru/
03 мая 2015 21:09
Как мне определить с каким объектом произошло столкновение?Если мне не изменяет память, я это реализовал, повесив манифолд не на объект, который сталкивается, а на обект, с которым мой обект (в данном случае я так понимаю пуля) должен столкнуться. В этом случае в колбэке мы будем иметь ссылку на "обект-препятствие", а сенсор сработает у пули. То есть
m_ctl.create_sensor_manifold({Тут тот в кого стреляем}, "COLLISION", m_ctl.CT_TRIGGER, sensors,
logic_func, trigger_pula);
ну и как следствие, мы можем получить координаты объектов в момент столкновения простым transform.get_translation(). Так же, если не ошибаюсь, я как-то в колбэк передавал 4 параметром объект, у которого можно спросить "а где?". И заморочка у меня была тож с collision'ами. Только вот не помню как я это делал. Пошарю по проектам, если найду скину.
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
04 мая 2015 08:32
-Vampire-, у меня была идея сделать таким образом. Но тут количество обработчиков с увеличением числа игроков и выпущенных ими пуль будет быстро расти. Что, боюсь, очень сильно скажется на производительности. И самое главное… Я не смогу определить, какой игрок выпустил пулю, так как не получу объект пули, в котором лежит айдишник игрока, создавшего её
Есть вариант слушать 2 события. От пули и от игрока. И если они происходят почти одновременно, регистрировать попадание игроком в игрока. (Но мне кажется это костыль… При физ движке, который работает в потоке ).
Зарисовал масштаб трагедии (чего то svg форум не принял…)
Плюс у меня, возможно, будет много динамических объектов, расставленных на сцене, которые могут нанести урон игроку, нужно отличать их от статических стен.
Координаты столкновений нужны, так как взаимодействующие тела могут быть большого размера, и хочется визуализировать это место (например добавить искры)
Есть вариант слушать 2 события. От пули и от игрока. И если они происходят почти одновременно, регистрировать попадание игроком в игрока. (Но мне кажется это костыль… При физ движке, который работает в потоке ).
Зарисовал масштаб трагедии (чего то svg форум не принял…)
Плюс у меня, возможно, будет много динамических объектов, расставленных на сцене, которые могут нанести урон игроку, нужно отличать их от статических стен.
Координаты столкновений нужны, так как взаимодействующие тела могут быть большого размера, и хочется визуализировать это место (например добавить искры)
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
http://naviris.ru/
05 мая 2015 12:37
Добрый день.
Посмотрите на этот туториал.
После раздела Падение камней - сенсоры, по-моему, описано почти всё, что вам нужно. Если что-то неочевидно - спрашивайте. Возможно, заодно подправим и этот урок
Посмотрите на этот туториал.
После раздела Падение камней - сенсоры, по-моему, описано почти всё, что вам нужно. Если что-то неочевидно - спрашивайте. Возможно, заодно подправим и этот урок
05 мая 2015 14:43
Кирилл, а вы можете стукнуть ко мне в вк? Я в вк
Вы сейчас делаете то, что я собирался делать чуть попозже. Может мы сможем как-то скооперироваться? Не хотелось бы потерять контакты. Мой проект коммерческий и если бы вы согласились войти в команду и принять в нём участие, мне кажется мы смогли бы сделать крутую штуку
Вы сейчас делаете то, что я собирался делать чуть попозже. Может мы сможем как-то скооперироваться? Не хотелось бы потерять контакты. Мой проект коммерческий и если бы вы согласились войти в команду и принять в нём участие, мне кажется мы смогли бы сделать крутую штуку
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
11 мая 2015 19:36
Посмотрите на этот туториал.Посмотрел и напридумывал следующие:
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);
Понял как определить координаты столкновения это collision_pt. Знаю куда передавать id игрока, создавшего пулю, у меня это param, импульс тела это impulse.
А вот способ определения объекта, с которым произошло столкновение мне не подходит. Потому что:
- у меня не фиксированное количество объектов (игроков) с которым нужно определить столкновение,
- объекты(игроки) могут появиться на сцене после создания пули, и при контакте пули с этим новым игроком, событие не отловить(только если, не пересоздавать все слушатели)
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
http://naviris.ru/
12 мая 2015 15:07
На самом деле, в нашем API сейчас действительно не хватает некоторых моментов для удобной реализации вашей задачи. В следующих релизах добавим возможность получать объект соударения напрямую в обработчике столкновения.
Сейчас же ничего другого, кроме как размножать сенсорные множества не остается. То есть, каждый появившийся игрок должен генерировать свой уникальный ID, для соударения с которым снаряд будет регистрировать свой обработчик.
Но вообще говоря, это не самая лучшая идея делать все просчеты с помощью соударений. Пули будут очень маленькими и обязательно будут моменты, когда из-за дискретности расчетов на физике, они будут пролетать сквозь игроков. Я бы смотрел в сторону raycast сенсоров в вашем случае. (Хоть на них пока есть те же проблемы, что описаны в предыдущих абзацах)
Сейчас же ничего другого, кроме как размножать сенсорные множества не остается. То есть, каждый появившийся игрок должен генерировать свой уникальный ID, для соударения с которым снаряд будет регистрировать свой обработчик.
Но вообще говоря, это не самая лучшая идея делать все просчеты с помощью соударений. Пули будут очень маленькими и обязательно будут моменты, когда из-за дискретности расчетов на физике, они будут пролетать сквозь игроков. Я бы смотрел в сторону raycast сенсоров в вашем случае. (Хоть на них пока есть те же проблемы, что описаны в предыдущих абзацах)
12 мая 2015 16:09
Но вообще говоря, это не самая лучшая идея делать все просчеты с помощью соударенийЯ это понимаю, поэтому в будущем буду проводить расчёты на сервере (учитывая задержки игроков и др. факторы соединения), строя виртуальную картину происходящего на сервере.
Сейчас делаю, просто что бы работало . Пули пока что имеют не очень большую скорость, что допускает погрешность.
Спасибо за ответ! Очень приятно что разработка вашего фреймворка поддаётся гибкости и вы идёте на встречу разработчикам
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
http://naviris.ru/
13 июня 2015 00:35
В следующей версии движка будет полностью переработанный "рейкастинг" и вычисление соударений. Так что все проблемы этого топика должны разрешиться. Ожидайте первые тестовые сборки через неделю.
Команда Blend4Web
https://twitter.com/AlexKowel
https://twitter.com/AlexKowel