|
3D-программирование Вопросы, касающиеся программирования 3D мира |
10.01.2011, 05:16
|
#1
|
Разработчик
Регистрация: 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
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Метод попадания пуль
В WarTech был такой метод. у снаряда есть текущая позиция и позиция на прошлом кадре. Получается отрезок, который прошел снаряд, далее находится пересечение етого отрезка и bounding сферы противника. если пересечение есть - значит попали.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.01.2011, 06:49
|
#3
|
|
Ответ: Метод попадания пуль
Сообщение от 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
|
|
|
Сообщение было полезно следующим пользователям:
|
|
10.01.2011, 07:18
|
#4
|
Разработчик
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений (для 53 пользователей)
|
Ответ: Метод попадания пуль
Спасибо за ответы, в моем случае колизий в игре небудет вообще. У меня массив с клетками проходимости.
п.с. Думаю буду юзать LinePick
|
(Offline)
|
|
10.01.2011, 13:15
|
#5
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Метод попадания пуль
Товарищи! Что ж вы!
Просто помним координаты в предыдущем кадре, и с текущем.
По ним строим уравнение прямой:
Ax+By+Cz+D=0 (в Википедии можно найти уравнения для нахождения коэффициентов).
Потом подставляем координаты игрока в соответствующие места:
Dist#=A*EntityX(E)+B*ENtityy(E)+C*EntityZ(E)+D
Теперь мы имеем расстояние от игрока до прямой, осталось вычислить, принадлежит ли прозиция игрока к отрезку. Как сделать пока не думал, но знаю что несложно
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Reizel за это полезное сообщение:
|
|
10.01.2011, 15:39
|
#6
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Метод попадания пуль
http://mathworld.wolfram.com/Circle-...ersection.html
http://local.wasp.uwa.edu.au/~pbourk...ry/sphereline/
И реализация на c++
bool IntersectCircleLine(const Vec2¢er,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 LineToCircle( lx1#, 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 = dy1/ d dx2# = cx - (lx2 + lux * r) dy2# = cy - (ly2 + luy*r) d = 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>=0 And dot2<=0) Or (dot1<=0 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 за это полезное сообщение:
|
|
11.01.2011, 02:33
|
#7
|
|
Ответ: Метод попадания пуль
Павел
Randomize
LinePick\EntityPick делает практически тоже самое, только еще использует Space Partition алгоритм (незнаю какой именно) вместо перебора всех юнитов, который будет в вашем случае. Ваш К.О.
ЗЫ
3\5 квадратных корней для Ray-Sphere intersection (да еще вдобавок только 2д) это сильно, да )
|
|
|
Сообщение было полезно следующим пользователям:
|
|
11.01.2011, 02:42
|
#8
|
Мастер
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений (для 3,006 пользователей)
|
Ответ: Метод попадания пуль
Сообщение от Venom2
Павел
Randomize
LinePick\EntityPick делает практически тоже самое, только еще использует Space Partition алгоритм (незнаю какой именно) вместо перебора всех юнитов, который будет в вашем случае. Ваш К.О.
|
Перебрать можно не все юниты, это зависит от того, как реализована эта система. Я бы предложил секторное разделение карты, получать для пули список объектов в определенной области и их перебрать. На карте может быть до сотни танков или чего там у вас, а в области например всего 5. И ты не забывай, что Pick не работает без PickMode на ентити, которым ты нагнешь свой двиг. Легче взять два отрезка, построить вектор и проверить на пересечение... Но это по сути тот же EntityDistance ..с еще большем вычислениями..
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо EvilChaotic за это полезное сообщение:
|
|
11.01.2011, 02:47
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Метод попадания пуль
Ээээ EvilChaotic в ТЗ не было пункта " у нас уже есть супер-двиг с хитрыми оптимизациями и разибенеиями на группы по произвольному критерию за 0msec".
Уводишь несолкько задчау, имхо.
С точки зрения вопроса глобальной оптимизации - прав, но автор спрашивает не про это (возможно у него это и так реализовано), осталось дело за малым (разработка сверху-вниз).
Решение Venom2 подкупает ещё и тем, что даже EntityDistance пашет быстрее чем ручная реализация Т.Пифагора: втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.
Пост Randomize обязателен к изучению:
1) понимание механизма
2) подобные алгоритмы имеют множесто применений (маст рид!)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
11.01.2011, 03:05
|
#10
|
|
Ответ: Метод попадания пуль
Сообщение от EvilChaotic
Перебрать можно не все юниты, это зависит от того, как реализована эта система. Я бы предложил секторное разделение карты, получать для пули список объектов в определенной области и их перебрать. На карте может быть до сотни танков или чего там у вас, а в области например всего 5.
|
Да-да, ты вообще читал первый пост? Автор предложил камеры к пуле крепить (!) для определения попаданий, а ты ему про какое-то там хитрое деление карты :D
Сообщение от EvilChaotic
И ты не забывай, что Pick не работает без PickMode на ентити, которым ты нагнешь свой двиг.
|
С чего вдруг? Режим 1 в PickMode - проверка только по описывающей сфере, а это и есть ваш велосипед, только не на убогом блиц-бейсике, а встроеный в движок с соответствующими оптимизациями.
ЗЫ
Про лагоритм пересечения советую глянуть сюда , не стоит для игр применять математику "влоб", в большинстве случаев оригинальные алгоритмы слишком тяжелы для этого, поэтому стоит потратить немного времени на поиски соответствующих адаптаций
|
|
|
Сообщение было полезно следующим пользователям:
|
|
11.01.2011, 04:20
|
#11
|
.
Регистрация: 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 за это полезное сообщение:
|
|
11.01.2011, 05:56
|
#12
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Метод попадания пуль
Сообщение от impersonalis
Решение Venom2 подкупает ещё и тем, что даже EntityDistance пашет быстрее чем ручная реализация Т.Пифагора: втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.
|
золотые слова!
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
11.01.2011, 22:32
|
#13
|
Разработчик
Регистрация: 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
|
Зануда с интернетом
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.01.2011, 02:12
|
#15
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Метод попадания пуль
в Cortex Command играл? Мы в четвером резались за одной клавой...значит можно
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:11.
|