Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 09.05.2009, 20:16   #1
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Как определить пересечение пути юнита с определенным объектом?

Вопрос к тем, кто сталкивался с подобной проблемой (скорее всего к тем, кто делал стратегии).
Посылаю юнит в какую-то точку на карте. Кратчайший путь по умолчанию по прямой, но необходимо определить, будет ли пересечение этого пути с любым зданием на карте. Пытаюсь использовать LinеPick, проблема в том, что данная функция выдает только первый объект на пути, а это может быть и не здание, другой юнит, а вот за этим юнитом то самое здание и прячется. Пытался сделать пошагово, то есть если найден юнит, то далее ищем от него уже и т.д., но есть другая проблема у LinеPick - возващает иногда сам объект, от которого проверяешь путь. То есть он сам себе преграда.
Как вариант постараться решить задачу с помощью геометрии, но тут не силен. Может есть у кого подсказки, алгоритмы и т.д., могущие помочь в решении задачи?
(Offline)
 
Ответить с цитированием
Старый 09.05.2009, 20:54   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

...необходимо определить, будет ли пересечение этого пути с любым зданием на карте. Пытаюсь использовать LinеPick...
...ээ.. более логическое (не путать с "логичное") представление мира спасёт отца русского игростроения, имхо.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 09.05.2009, 23:05   #3
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений
(для 2,706 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

Легко.
Перед проверкой лайнпиком выставляй у всех объектов кроме зданий и уровня EntityPickMode равным 0. А после проверки возвращай им их типы пика назад. Пример с юнитами:

For u.Unit=Each Unit
EntityPickMode u\mesh,0
Next

If LinePick ... Then ...

For u.Unit=Each Unit
EntityPickMode u\mesh,2 (пик по полигонам)
Next
(Offline)
 
Ответить с цитированием
Старый 09.05.2009, 23:12   #4
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

В стратегиях используется поиск пути, а не пики
__________________
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 00:18   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

именно это я и имел в виду. Пики занимают промежутончое состояние между физическим миром (который в игре, разумеется тоже представлен мат.моделями) и чистой логикой, оперирующей абстрактными объектами и алгоритмами дискретной математики.
Поставленная же задача, относится к логике юнитов.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 07:05   #6
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Как определить пересечение пути юнита с определенным объектом?

2 Amatsu
Это было понятно с самого начала, но это называется "решить проблему через ж@пу" Пока у меня рука не поднимется реализовать подобное, это крайний случай.
2 tormoz & impersonalis
Про поиск пути в курсе, но у меня стратегия не обычная, карта практически пуста, и населена только движущимися объектами (если видели demo Woodcutters поймете), поэтому в 99% юнит просто идет прямо. В данном случае пока загружать игру логикой поиска пути не вижу смысла, делаю через waypoint-ы зданий, осталось только понять, встретится здание на пути или нет (так на мой взгляд гораздо проще в данной ситуации, чем создавать логическую карту местности и искать на ней путь с помощью какого-нибудь громоздкого алгоритма, с которым еще разобраться надо). Может это возможно решить геометрически, с помощью написанной процедуры поиска пересечения линии и квадрата (здания), но подобными процедурами не обладаю, и геометрию уже напрочь забыл. Или все таки решить как-нибудь через LinePick, но там я как уже написал невозможно создать рекурсивную функцию, потому что LinePick при поиске от координат юнита иногда на этом же юните и зацикливается

Последний раз редактировалось stone_evil, 10.05.2009 в 07:12.
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 07:50   #7
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений
(для 2,706 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

Почему это через ж@пу? Проверенно, работает, не тормозит. Странно... Если хочешь извращаться, делай рекурсивно или как ты там хочешь

p.s. а вообще юзай вместо лайнпика рейкасты физикса, если ты так заботишься о производительности =)
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 08:23   #8
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Как определить пересечение пути юнита с определенным объектом?

2 Amatsu
Понятно, что это работает и все такое. Просто это через ж@пу, потому что EntityPickMode предназначена для того, чтобы определить один раз тип пика объекту и все, а не с его помощью искать LinePick-ом какой-то объект, постоянно убирая и назначая EntityPickMode
А до физикса я не дорос, да и времени расти нету
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 21:40   #9
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений
(для 2,706 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

EntityPickMode вообще по идее просто выставляет флаг объекту, каким макаром его потом пикать и пикать ли вообще. Это коллизию лучше не переназначать, иначе во время смены в главном цикле объекты начинает колбасить и у них пропадает местами коллизия вообще. Но дело твое.
(Offline)
 
Ответить с цитированием
Старый 10.05.2009, 22:45   #10
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

Между прочим, Amatsu прав.

Такая вещь
 
For u.Unit=Each Unit
EntityPickMode u\mesh,0
Next
вообще часто используется. Я, например, в редакторе карт использовал - когда выделяешь объект должно все пикаться, а когда ставишь куда-то, то только терраин. И вовсе это не
через ж@пу
(Offline)
 
Ответить с цитированием
Старый 11.05.2009, 15:57   #11
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Как определить пересечение пути юнита с определенным объектом?

Ну про ж@пу я так понимаю у каждого свое сугубо личное представление, думаю, не стоит на ней заострять внимание.
А вот наши разговоры по поводу EntityPickMode навели меня на мысль. В итоге вместо постоянного снятия всех пиков совсех объектов я в рекурсии снимаю только с необходимого и проверяю дальше. Мне кажется, это уже оригинально, и совсем не ж@па
Function PositionWayPoint(point,waypoint,px#,pz#,x#,z#,radius#)
 flag = 0
 break = LinePick(x,0,z,px-x,0,pz-z,radius)
 If break Then
  objType = GetEntityType(break)
  If objType=TypeBuild Then
      flag = 1
  Else
   EntityPickMode break,0
   flag = PositionWayPoint(point,waypoint,px,pz,xx,zz,radius)
   EntityPickMode break,2
  EndIf
 EndIf 
 Return flag
End Function
Но все равно, если кто знает еще какой-нибудь способ типа геометрического, просьба поделиться.
(Offline)
 
Ответить с цитированием
Старый 11.05.2009, 16:22   #12
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Ответ: Как определить пересечение пути юнита с определенным объектом?

Так-то ничего страшного в снятии пикмода нет, даже если у тебя... сотни юнитов.
Если чисто геометрически, я делаю пик под землей )) , там нет юнитов, а здания можно и под землю немного опустить. Так вообще можно сделать несколько как бы уровней пиков, тупо по высоте, надеюсь автор поймет о чем речь )
(Offline)
 
Ответить с цитированием
Старый 11.05.2009, 17:21   #13
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Как определить пересечение пути юнита с определенным объектом?

2 Damp
Да, понимаю, я так пробовал уже, но это все таки не геометрическое решение, а подобное, ага.
(Offline)
 
Ответить с цитированием
Старый 11.05.2009, 17:47   #14
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений
(для 2,706 пользователей)
Ответ: Re: Как определить пересечение пути юнита с определенным объектом?

Сообщение от stone_evil Посмотреть сообщение
Ну про ж@пу я так понимаю у каждого свое сугубо личное представление, думаю, не стоит на ней заострять внимание.
А вот наши разговоры по поводу EntityPickMode навели меня на мысль. В итоге вместо постоянного снятия всех пиков совсех объектов я в рекурсии снимаю только с необходимого и проверяю дальше. Мне кажется, это уже оригинально, и совсем не ж@па
Function PositionWayPoint(point,waypoint,px#,pz#,x#,z#,radius#)
 flag = 0
 break = LinePick(x,0,z,px-x,0,pz-z,radius)
 If break Then
  objType = GetEntityType(break)
  If objType=TypeBuild Then
      flag = 1
  Else
   EntityPickMode break,0
   flag = PositionWayPoint(point,waypoint,px,pz,xx,zz,radius)
   EntityPickMode break,2
  EndIf
 EndIf 
 Return flag
End Function
Но все равно, если кто знает еще какой-нибудь способ типа геометрического, просьба поделиться.
Оригинально, согласен. Но имхо лишний linepick тормозит гораздо больше чем снятие пикмода у 100 юнитов на экране. А если у тебя допустим 10 юнитов перед камерой в ряд стоят? Будешь 10 раз за один проход юзайть LinePick? Удачи
(Offline)
 
Ответить с цитированием
Старый 11.05.2009, 18:24   #15
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Как определить пересечение пути юнита с определенным объектом?

2 Amatsu
Не, ну тут вопрос риторический, конечно, пока кто-нибудь замеров не сделает, нельзя сказать, насколько LinePick больше или меньше занимает времени, чем пробег по всем объектам 2 раза (а этих объектов опять таки может быть и 10 и 100). Только имей ввиду, что 10 объектов на пути LinePick могут встретиться за игру 1-2 раза всего, могут вообще не встретиться. А вот по сотням объектов в вашем случае придется бегать каждый раз постоянно, следовательно, это постоянный нагруз на игру. Я вот из такой логики исхожу.
Плюс по идее LinePick не должен напрягать ресурсы - там по сути в логике функции должна браться прямая, и в цикле по объектам проверяться принадлежность объектов этой прямой. В итоге тот же пробег по объектам, только всего один раз. Но это чистая теория, конечно.

Последний раз редактировалось stone_evil, 11.05.2009 в 18:33.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение объектов AndruXa 3D-программирование 15 24.12.2007 06:29
Пересечение отрезка с вертикальным отрезком ABTOMAT Математика 0 19.12.2007 23:57
Пересечение отрезка с масивом отрезков SBJoker Математика 6 13.12.2007 14:15
Пересечение лини и окружности. HolyDel Полезные функции 2 11.02.2007 15:33
Пересечение HolyDel Математика 3 04.01.2007 04:21


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com