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

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

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

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

Ответ
 
Опции темы
Старый 10.01.2011, 05:16   #1
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Метод попадания пуль

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

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

В каждую пулю вставляем припаренченую к ним камеру
Local TempPivot=CreatePivot()

If EntityDistance(Пуля,Игрок)<5 -Ето условие только для того чтоб лишний раз не юзать CameraPick(), и значение может быть не 5 а любое зависящее примерно от размера игрока, чтоб его пуля случайно не пролетела.
Hit=CameraPick(Камера та что в пуле, центр екрана)-Переверяем есть ли перед нами игрок?
If Hit<>0 PositionEntity TempPivot,PickedX#(),PickedY#(),PickedZ#(),1-Если он есть, ставим в точку попадания пивот, для вычислений.
If EntityDistance(TempPivot,Пуля)<Cкорость пули Then Пуля попала в цель   -Если расстояние до игрока достаточное, убираем игроку хелсы.
EndIf
EndIf

FreeEntity TempPivot
Будет ли ето слишком тормозить систему, если у меня способных стрелять будет максимум 4 игрока?

п.с. Надеюсь я пояснил доступно, если кто нипонял могу нарисовать...
(Offline)
 
Ответить с цитированием
Старый 10.01.2011, 06:04   #2
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Метод попадания пуль

В WarTech был такой метод. у снаряда есть текущая позиция и позиция на прошлом кадре. Получается отрезок, который прошел снаряд, далее находится пересечение етого отрезка и bounding сферы противника. если пересечение есть - значит попали.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (10.01.2011)
Старый 10.01.2011, 06:49   #3
Venom2
 
Сообщений: n/a
Ответ: Метод попадания пуль

Сообщение от Halk-DS Посмотреть сообщение
Главний вопрос, кто может поделится своим опытом и рассказать о самом приемлимом методе, по какому вычисляется попала ли пуля в нужную нам цель?
CameraPick для первого лица, LinePick для других. Если нужна баллистика, то обычная проверка на столкновение - EntityCollided

Сообщение от Halk-DS Посмотреть сообщение
метод колизии пули с игроком в некоторых случаях просто безнадежен ибо пуля просто может протлитеть сквозь персонажа и даже его незаметить.
Нет, коллизия всегда сработает независимо от размера и скорости пули, там уже применяется метод описаный HolyDel выше.
Для подтверждения:
Graphics3D(800, 600, 32, 2)
SetBuffer(BackBuffer())

; игрок [0.5, 1.85, 0.5] метра
Local Player% = CreateCube()
ScaleEntity(Player, 0.5, 1.85, 0.5)
EntityType(Player, 1)

; пуля 2 см радиус, отдалена от игрока на 10 метров
Local Bullet% = CreateSphere(3)
ScaleEntity(Bullet, 0.002, 0.002, 0.002)
PositionEntity(Bullet, -10.0, 0.0, 0.0)
EntityRadius(Bullet, 0.002, 0.002)
EntityType(Bullet, 2)

Local Camera% = CreateCamera()
PositionEntity(Camera, 0.0, 0.0, -10.0)

Collisions(2, 1, 2, 1)

Repeat
	
	If EntityCollided(Bullet, 1) Then
		EntityColor(Player, 255, 0, 0)
	Else
		; скорость движения на игрока 1000 м\с (60 - кадров в сек)
		TranslateEntity(Bullet, 1000.0 / 60, 0, 0)
	End If
	
	UpdateWorld()
	RenderWorld()
	Flip()
Until KeyDown(1)
End
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (10.01.2011)
Старый 10.01.2011, 07:18   #4
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Метод попадания пуль

Спасибо за ответы, в моем случае колизий в игре небудет вообще. У меня массив с клетками проходимости.
п.с. Думаю буду юзать LinePick
(Offline)
 
Ответить с цитированием
Старый 10.01.2011, 13:15   #5
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Метод попадания пуль

Товарищи! Что ж вы!
Просто помним координаты в предыдущем кадре, и с текущем.
По ним строим уравнение прямой:
Ax+By+Cz+D=0 (в Википедии можно найти уравнения для нахождения коэффициентов).
Потом подставляем координаты игрока в соответствующие места:

Dist#=A*EntityX(E)+B*ENtityy(E)+C*EntityZ(E)+D

Теперь мы имеем расстояние от игрока до прямой, осталось вычислить, принадлежит ли прозиция игрока к отрезку. Как сделать пока не думал, но знаю что несложно
Миниатюры
Нажмите на изображение для увеличения
Название: cann.jpg
Просмотров: 865
Размер:	8.2 Кб
ID:	12342  
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Reizel за это полезное сообщение:
Hulk-DS (10.01.2011), moka (11.01.2011)
Старый 10.01.2011, 15:39   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Метод попадания пуль

http://mathworld.wolfram.com/Circle-...ersection.html
http://local.wasp.uwa.edu.au/~pbourk...ry/sphereline/
И реализация на c++
bool IntersectCircleLine(const Vec2&center,float radius,const Vec2&p1,const Vec2&p2)
{
  
float x01=p1.x-center.x;
  
float y01=p1.y-center.y;
  
float x02=p2.x-center.x;
  
float y02=p2.y-center.y;

  
float dx=x02-x01;
  
float dy=y02-y01;

  
float a=dx*dx+dy*dy;
  
float b=2.0f*(x01*dx+y01*dy);
  
float c=x01*x01+y01*y01-radius*radius;

  if(-
b<0)return (c<0);
  if(-
b<(2.0f*a))return (4.0f*a*c-b*b<0);
  return (
a+b+c<0);

Перевести думаю не трудно.

Upd. Хмм... А у меня тут оказывается в закромах лежит такой алгоритм:
Function LineToCirclelx1#, ly1#, lx2#, ly2#, cx#, cy#, r#)

dx# = lx2 - lx1
dy# = ly2 - ly1
ld# = Sqr((dx*dx) + (dy*dy))
lux# = dx / ld
luy# = dy / ld
lnx# = luy
lny# = -lux
dx1# = cx - (lx1 - lux*r)
dy1# = cy - (ly1 - luy*r)
d# = Sqr((dx1*dx1) + (dy1*dy1))
dx1 dx1 d
dy1 
dy1d
dx2
# = cx - (lx2 + lux * r)
dy2# = cy - (ly2 + luy*r)
Sqr((dx2*dx2) + (dy2*dy2))
dx2 dx2  d
dy2 
dy2 d
dot1
# = (dx1 * lux) + (dy1 * luy)
dot2# = (dx2 * lux) + (dy2 * luy)
px#=lx1-cx
py#=ly1-cy
distsq# = Abs((dx * py - px * dy)  / ld )

;Следуещее можно разкоментарить и выводить точку пересечения в глобалы
;LineColX# = cx - lnx * sqr(distsq) 
;LineColY# = cy - lny * sqr(distsq)


Return (( dot1>=And dot2<=0) Or (dot1<=And dot2>=0)) And (distsq <= r)


End Function 
Грубо перевёл с блицмакса, но оно работает.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
Hulk-DS (10.01.2011), impersonalis (10.01.2011)
Старый 11.01.2011, 02:33   #7
Venom2
 
Сообщений: n/a
Ответ: Метод попадания пуль

Павел
Randomize
LinePick\EntityPick делает практически тоже самое, только еще использует Space Partition алгоритм (незнаю какой именно) вместо перебора всех юнитов, который будет в вашем случае. Ваш К.О.
ЗЫ
3\5 квадратных корней для Ray-Sphere intersection (да еще вдобавок только 2д) это сильно, да )
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (11.01.2011)
Старый 11.01.2011, 02:42   #8
EvilChaotic
Мастер
 
Аватар для EvilChaotic
 
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений
(для 3,006 пользователей)
Ответ: Метод попадания пуль

Сообщение от Venom2 Посмотреть сообщение
Павел
Randomize
LinePick\EntityPick делает практически тоже самое, только еще использует Space Partition алгоритм (незнаю какой именно) вместо перебора всех юнитов, который будет в вашем случае. Ваш К.О.
Перебрать можно не все юниты, это зависит от того, как реализована эта система. Я бы предложил секторное разделение карты, получать для пули список объектов в определенной области и их перебрать. На карте может быть до сотни танков или чего там у вас, а в области например всего 5. И ты не забывай, что Pick не работает без PickMode на ентити, которым ты нагнешь свой двиг. Легче взять два отрезка, построить вектор и проверить на пересечение... Но это по сути тот же EntityDistance ..с еще большем вычислениями..
__________________

EvilChaotic About
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо EvilChaotic за это полезное сообщение:
Hulk-DS (11.01.2011), moka (11.01.2011)
Старый 11.01.2011, 02:47   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Метод попадания пуль

Ээээ EvilChaotic в ТЗ не было пункта " у нас уже есть супер-двиг с хитрыми оптимизациями и разибенеиями на группы по произвольному критерию за 0msec".
Уводишь несолкько задчау, имхо.
С точки зрения вопроса глобальной оптимизации - прав, но автор спрашивает не про это (возможно у него это и так реализовано), осталось дело за малым (разработка сверху-вниз).
Решение Venom2 подкупает ещё и тем, что даже EntityDistance пашет быстрее чем ручная реализация Т.Пифагора: втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.
Пост Randomize обязателен к изучению:
1) понимание механизма
2) подобные алгоритмы имеют множесто применений (маст рид!)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
HolyDel (11.01.2011), Hulk-DS (11.01.2011)
Старый 11.01.2011, 03:05   #10
Venom2
 
Сообщений: n/a
Ответ: Метод попадания пуль

Сообщение от EvilChaotic Посмотреть сообщение
Перебрать можно не все юниты, это зависит от того, как реализована эта система. Я бы предложил секторное разделение карты, получать для пули список объектов в определенной области и их перебрать. На карте может быть до сотни танков или чего там у вас, а в области например всего 5.
Да-да, ты вообще читал первый пост? Автор предложил камеры к пуле крепить (!) для определения попаданий, а ты ему про какое-то там хитрое деление карты :D
Сообщение от EvilChaotic Посмотреть сообщение
И ты не забывай, что Pick не работает без PickMode на ентити, которым ты нагнешь свой двиг.
С чего вдруг? Режим 1 в PickMode - проверка только по описывающей сфере, а это и есть ваш велосипед, только не на убогом блиц-бейсике, а встроеный в движок с соответствующими оптимизациями.
ЗЫ
Про лагоритм пересечения советую глянуть сюда , не стоит для игр применять математику "влоб", в большинстве случаев оригинальные алгоритмы слишком тяжелы для этого, поэтому стоит потратить немного времени на поиски соответствующих адаптаций
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (11.01.2011)
Старый 11.01.2011, 04:20   #11
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Метод попадания пуль

Народ, без секторных реализаций (у автора массив, он может выступать в роли хотя бы стандартного сравнения боунти бокса отрезка и объектов попадания, и то, это уже накладно.
При пулемёте, со скоростью стрельбы в 15 патронов в секунду. Если вокруг 10 объектов. Ладно один стреляет, а если двое - то уже "уопа".
Это получается на каждую пулю, будет просчёт, при этом жизнь пули примерно 50мс (например), то количество просчётов просто нарастает с каждым выстрелом.
При фиксированном цикле в 19мс (60ups), будет 60 обновлений, при этом жизнь пули примерно 3 цикла. Получается в итоге (15*1)*10*3=450, вычислений в секунду, от одного пулемётчика. А что если их 32, и они все стреляют в один момент? (15*32)*32*3=46080 вычислений в секунду! Этож полнейшая уопа.
Поэтому обязательные оптимизации в первую очередь разбиение глобального списка по секторам. (это не только к пулям относится).
Далее другие оптимизации, сокращения списков, для индор, это порталы.
Также для больших пространств, и большого количества объектов, нужно кластеровать сектора..

Короче говоря, пока у вас бегает кое как 10 мобов, и стрельба медленная, но как только что-то увеличивается, по геометрической прогрессии вырастает нагрузка вычислений.
Логика никогда не должна утеснять рендер, даже на слабых параметрах компьютера (это же не симулятор чястиц галактик с их звёздами и планетами, это простая игра).
Тем более, где сейчас встретишь игру, в которой требования к железу, будут выше на процессор, или ваш процессор вас "подведёт?" (в разумных ситуациях), нету такого.

Оптимизации нужны, но согласен, автор ещё не совсем готов к ним..
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Egor Rezenov (05.02.2011), Hulk-DS (11.01.2011), Randomize (11.01.2011), RBK (11.01.2011), Reks888 (11.01.2011)
Старый 11.01.2011, 05:56   #12
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Метод попадания пуль

Сообщение от impersonalis Посмотреть сообщение
Решение Venom2 подкупает ещё и тем, что даже EntityDistance пашет быстрее чем ручная реализация Т.Пифагора: втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.
золотые слова!
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
impersonalis (12.01.2011), Reizel (11.01.2011)
Старый 11.01.2011, 22:32   #13
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Метод попадания пуль

Сообщение от Venom2 Посмотреть сообщение
Да-да, ты вообще читал первый пост? Автор предложил камеры к пуле крепить (!) для определения попаданий.
Ну если ты внимательно прочитал первый пост то я нехотел вставлять камеры в пули, я выставил етот вариант на вашу критику. Я догадывался о глючности моего предположения...
А создал я етот топик, не потому что собираюсь камеры в пули пхать:
Главний вопрос, кто может поделится своим опытом и рассказать о самом приемлимом методе, по какому вычисляется попала ли пуля в нужную нам цель?
И еще добавлю, как только мне написали пост с командами ЕнтитиПик и ЛайнПик, начал бится головой об клавиатуру, ибо реально вылетели ети команды из головы, а я знал об тоб что они в моем случае уж куда лучше камер.(перерыв в программировании два года, поетому приходится счяс многое вспоминать)

Сообщение от Venom2 Посмотреть сообщение
а ты ему про какое-то там хитрое деление карты :D
Ну я конешно согласен что до некоторых людей в плане програмирования мне еще очень далеко, но если судить по твоей логике, вообще зачем я задал вопрос, если предполагать заранее, что я нифига непойму?(уж извини с твоего топика мне так показалось)

Ну и относительно темы пару слов
Насчет количества стреляемых я уже говорил:
у меня способных стрелять будет максимум 4 игрока
Если я дорасту хотя б до бета версии, буду думать о "Ботах". Потому что игра ета на 4-х за одной клавой. В любом случае их много не будет.

А насчет деления карты, я например так понимаю.
Есть карта 300х300(например). По ней ездят толпами танки. Нам нужно поделить всю карту на кубики типа 10х10(например) и призначить им свой ID. Выходит 30 кубиков с ID от 1 до 30. Мы берем всем танкам и пулям назначаем тот ID в кубике которого они находятся.
И так у нас получается группа пуль и танков с одинаковым ID какие мы и проверяем между собой на попадание не трогае все остальные танки с другими ID.
Надеюсь я правильно понимаю?
(Offline)
 
Ответить с цитированием
Старый 12.01.2011, 02:11   #14
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Метод попадания пуль

Потому что игра ета на 4-х за одной клавой. В любом случае их много не будет.
ого. Ты в курсе, что в сумме (на "буквенную" и "numlock" клавы) не более 6 клавиш для обычной клавы одновременно?
http://www.forum.boolean.name/showthread.php?t=13361
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (12.01.2011)
Старый 12.01.2011, 02:12   #15
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Метод попадания пуль

в Cortex Command играл? Мы в четвером резались за одной клавой...значит можно
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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