Форум программистов, компьютерный форум, киберфорум
Программирование мультимедиа
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224

Как ограничить угол (зону) видимости для ракеты, видом только вперед?

07.05.2017, 01:34. Показов 4487. Ответов 47
Метки pawn (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. У меня вопрос. Наверно больше из векторной алгебры.

Суть вопроса такая:
Создана ENT(сущность Дрон), вооруженная самонаводящимися ракетами. После запуска ракет, ракета начинает поиск ближайшего, видимого противника.
Сам поиск противника построен по такой схеме - после запуска ракеты циклом нахожу все ENT(с нужным класснеймом, у меня "player"), неважно видимые или скрытые за препятствиями. Т.е. все противники найдены. Теперь трассировкой нахожу ближайшего видимого(не скрытого за препятствием) противника, начальная точка есть (ракета), конечная (противник) тоже есть. Если до момента попадания в противника, его кто то "грохнул" - ракета продолжает движение прямо, пока не будет найден следующий противник (или пока не истечет время жизни этой ракеты).
Вроде всё хорошо, все нормально. Есть одно НО. Противник может появиться не только спереди, он может появиться сзади, слева или справа, более угла 180 градусов (т.е. уже сзади). Естественно ракета резко меняет направление, и если она не успела улететь подальше от самого Дрона, то она просто ударяется в этого Дрона (своего родителя) и взрывается. Естественно наносит ущерб Дрону, да и ракета теряется впустую. На видео такие ошибки видны.


Теперь и сам вопрос - как ограничить угол (зону) видимости для ракеты, видом только вперед, ограничить углом, например, 180 градусов? Что бы все противники которые за"спиной" ракеты игнорировались. У кого какие мысли есть отпишитесь пожалуйста. Возможно сам алгоритм поиска противников у меня неверный.
Код не нужен - нужны мысли. Или более подробное описание мат. формул. Как они работают. Тангенсы, котангенсы и т.д.

Добавлено через 6 минут
https://youtu.be/pR5mCMDrfWg

Добавлено через 14 часов 27 минут
На "хабре" есть перевод статей касающийся как раз этого. https://habrahabr.ru/post/131931/
Я не всё могу понять, математика точно не моё. Вектора понятно, но вот эти синусы, косинусы, тангенсы котангенсы и т.д. не могу сообразить. Хоть в школу иди. Если кто сможет объяснить, отпишитесь.

Добавлено через 28 минут
Мой код (в виде функции) сейчас выглядит так:

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
any DetermineAngleRocket(float rocket_pos[3], float rocket_angle[3], float enemyes_pos[3]){
 
float rocket_angle_n[3]; 
float rocket_to_enemy[3], rocket_to_enemy_n[3];
float angle;
 
 
NormalizeVector(rocket_angle, rocket_angle_n);             //Нормализую вектор угла ракеты (взгляда)
SubtractVectors(enemyes_pos, rocket_pos, rocket_to_enemy); //Вычитаю вектора
NormalizeVector(rocket_to_enemy, rocket_to_enemy_n);       //Нормализую вектор направления от ракеты к цели
 
//Рассчитываю сам угол
angle = GetVectorDotProduct(rocket_angle_n, rocket_to_enemy_n);           // скалярное произведение двух векторов
angle = ArcCosine(angle);                                                 // арккосинус
angle = RadToDeg(angle);                                                  // радианы в градусы
return angle;
}

Всё это вроде, даже, как-то работает.
Меня не устраивает это "вроде", как оно работает. А самое главное, не устраивает то, что я не понимаю как это всё работает. Кто понимает - объясните пожалуйста.

Добавлено через 22 минуты
Язык программы "SourcePawn" (разновидность "Pawn"), по стилю очень похож на "с++", но это не об'екто-ориентированный язык как "с".
Скриптовый.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2017, 01:34
Ответы с готовыми решениями:

Как дернуть скрипт, только когда определенный блок войдет в зону видимости?
Всем приветы! Подскажите пожалуйста, как такое реализовать? Есть некий блок с "id=drop-block". Блок изналально находится вне...

Переход камеры за персонажем когда покидает зону видимости
Здравствуйте, подскажите как сделать переключения камеры за персонажем, у меня есть персонаж и 4 стороны куда он может пойти, верх, низ,...

Как ограничить угол наклона камеры в unity?
Здравствуйте. Подскажите, пожалуйста, как в данном скрипте ограничить угол наклона камеры объекта cam? Надо, чтобы когда персонаж смотрел...

47
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
23.05.2017, 04:35  [ТС]
Ребятки, ну так что? Никто не может помочь?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.05.2017, 14:55
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Теперь и сам вопрос - как ограничить угол (зону) видимости для ракеты, видом только вперед
хранить вектор скорости ракеты и производить его скалярное произведение с вектором от ракеты к цели. Если скалярное произведение меньше 0, значит цель вне 180 градусов (сзади)
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
28.05.2017, 16:39  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
хранить вектор скорости ракеты и производить его скалярное произведение с вектором от ракеты к цели. Если скалярное произведение меньше 0, значит цель вне 180 градусов (сзади)
Мне здесь habrahabr.ru/ не все понятно.

Что такое вектор скорости ракеты - этот вектор полученный из расстояния от ракеты до цели. Этот вектор, по идее, может меняться.
Т.е. вектор скорости получаю как раз из вектора от ракеты до цели. Или я что то не так понимаю? Честно, не пойму зачем вектор скорости.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.05.2017, 16:53
tonline_kms65, тебе нужно запоминать старый (т.е. за предыдущий шаг) вектор перемещения ракеты, и его и умножать. Собственно это это и будет вектор скорости (правда домноженный на интервал времени между пересчётами)

Добавлено через 2 минуты
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Мне здесь habrahabr.ru/ не все понятно.
https://ru.wikipedia.org/wiki/... оизведение

В школе это проходят, классе в 9ом...
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
30.05.2017, 12:18  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
тебе нужно запоминать старый (т.е. за предыдущий шаг) вектор перемещения ракеты, и его и умножать. Собственно это это и будет вектор скорости (правда домноженный на интервал времени между пересчётами)
Опять не пойму, зачем такой головняк. У меня есть угол положения ракеты (по её центральной кости) на текущий момент (с интервалом установленном в updater, например 10 раз в секунду), из этого угла я могу получить вектор направления.

Я ведь могу сделать скалярное произведение из угла положения на вектор направления(от ракеты до цели)?
Не могу врубиться. Или это будет неверно?

Не пиши пожалуйста мне это
Цитата Сообщение от TRam_ Посмотреть сообщение
В школе это проходят, классе в 9ом..
я это и сам знаю. С таким успехом можно залезть назад, откуда вылез, и начать жизнь заново. Я же не об этом спрашиваю.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.05.2017, 12:22
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Я ведь могу сделать скалярное произведение из угла положения на вектор направления(от ракеты до цели)?
можешь.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
30.05.2017, 12:33  [ТС]
Понял еще одну свою ошибку. Если целей больше 1, то ракета начинает как бы "метаться" между ними. Может быть еще из-за этого плохо отрабатывает?
Попробую изменить код - если видимый противник обнаружен то переменная (bool = true, и так будет до тех пор пока противник жив, или находится в зоне прямой видимости ракеты. И пока переменная = правда, остальные цели игнорируются.

Добавлено через 44 секунды
Цитата Сообщение от TRam_ Посмотреть сообщение
можешь.
А это будет верно?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.05.2017, 12:37
tonline_kms65, из угла (точнее 3х углов, раз речь идёт о 3-мерном пространстве, или 4х, если в расчётах используются кватерионы) всегда можно получить единичный вектор направления. С ним и производить скалярное произведение.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
30.05.2017, 13:21  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
из угла (точнее 3х углов, раз речь идёт о 3-мерном пространстве, или 4х, если в расчётах используются кватерионы) всегда можно получить единичный вектор направления. С ним и производить скалярное произведение.
floaf angle[3]; угол 3 координаты (не кватернион естественно), из этого угла получаю вектор-направление.

Ок, попробую. Становится интереснее.

Добавлено через 23 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
из угла (точнее 3х углов, раз речь идёт о 3-мерном пространстве, или 4х, если в расчётах используются кватерионы) всегда можно получить единичный вектор направления. С ним и производить скалярное произведение.
А перед расчетом нормализовать векторы нужно?
Думаю нет. Что то не то.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.05.2017, 13:26
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
А перед расчетом нормализовать векторы нужно?
если тебе не требуется знать величину косинуса угла между векторами, а только то, больше этот косинус нуля, или меньше, то не нужно.
1
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
30.05.2017, 14:11  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
если тебе не требуется знать величину косинуса угла между векторами, а только то, больше этот косинус нуля, или меньше, то не нужно.
Ок. Спасибо.
Я сейчас пока с этим разберусь, что бы понять, потом дальше пойду.
Знать угол между векторами нужно будет 100%, что бы потом, значение угла видимости можно было уже задавать.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
05.06.2017, 11:12  [ТС]
Время наконец то появилось. Работа задрала.
Попробовал понять визуально, как работает это самое "скалярное произведение векторов", немного понял. Это получается как бы наложение одного вектора (траектория от ракеты до цели) на текущее направление вектор(угол). Если полученный угол меньше нуля - противник не виден, если больше нуля он в зоне видимости. Даже не могу это описать. Главное то, что я понял. Еще поэксперементирую, интересно становится.
Видео сделал для наглядности. Луч показывает направление на текущую цель, значение угла вывожу в чат.

0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
15.06.2017, 07:04  [ТС]
Всё, разобрался я с определением "спереди-сзади". Работает отлично. Спасибо TRam_.
Остались некоторые вопросы, но я думаю решу их в ходе понимания следующего моего вопроса.

Сейчас остается понять, как сделать возможность задавать самому угол видимости, т.е. уже не "спереди-сзади", а уже именно в заданном мною угле. Грубо говоря, не 180 градусов, а к примеру 30 градусов, или 90.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
15.06.2017, 11:30
Делать скалярное произведение для нормированных векторов и отсекать уже по минимальному значению косинуса между векторами (которому и будет равно скалярное произведение), т.е. половины заданного тобой "угла обнаружения" (косинус 0 градусов 1.0, косинус 15 градусов 0.965, косинус 45 градусов - 0.707)
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
15.06.2017, 13:01  [ТС]
Вот здесь то и кроется подвох. Я нииичего из сказанного не понял.

Вот как мне это представилось.
Перед самим скалярным произведением я векторы нормализую? И делаю скалярное произведение уже нормализованных векторов? Что это даст? 1*1 в принципе что изменится?
Что такое "отсекаю"? Наверно, для ясности, здесь бы примерчик кода, на любом языке. Если не сложно. Иначе ничего не пойму.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
15.06.2017, 15:02
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
И делаю скалярное произведение уже нормализованных векторов? Что это даст?
Это даст косинус угла между этими векторами. Потому что https://ru.wikipedia.org/wiki/... 0.B8.D0.B5 , у нормализованных векторов длины 1, 1*1 = 1, 1 * косинус = косинус.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
16.06.2017, 11:02  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Это даст косинус угла между этими векторами. Потому что https://ru.wikipedia.org/wiki/... 0.B8.D0.B5 , у нормализованных векторов длины 1, 1*1 = 1, 1 * косинус = косинус.
Вот какой у меня код:
Кликните здесь для просмотра всего текста
Это в цикле
MakeVectorFromPoints(rocket_pos, enemy_pos, AddVec); // создаю вектор AddVec от позиции ракеты rocket_pos до цели (противника) enemy_pos
dot_enemy = GetVectorDotProduct(AddVec, vecang); // скалярное произведение векторов AddVec на вектор угола положения Ракеты vecang

if(dot_enemy > 0.0){ // если угол больше нуля (противник впереди)
/*Функция определения скрыт противник за стенами или нет*/
TR_TraceHullFilter(rocket_pos, enemy_pos, tunnel_min, tunnel_max, MASK_SOLID_BRUSHONLY, DontHitOwnerOrNade, rocket);
if(TR_GetEntityIndex() == i){
EnemyDistance = GetVectorDistance(rocket_pos, enemy_pos);
if (EnemyDistance < ClosestDistance){
ClosestEnemy = i; // найденный противник
PrintToChatAll("Угол %f/Противник %N", dot_enemy, i) // вывод инфо. в консоль (и чат);


Результат получаю такой. Это и есть значение угла? Могу я по нему "отсекать"?
Кликните здесь для просмотра всего текста
Угол 700.316772/Противник Fred
Угол 636.357788/Противник Fred
Угол 572.367248/Противник Fred
Угол 509.015502/Противник Fred
Угол 446.044250/Противник Fred
Угол 383.299957/Противник Fred
Угол 320.706604/Противник Fred
Угол 258.216064/Противник Fred
Угол 195.859024/Противник Fred
Угол 133.790039/Противник Fred
Угол 72.534301/Противник Fred
Попадание


Например значение Угол 636.357788/Противник Fred - это что может означать? Угол 636.357788?
Может быть это не угол а длинна вектора?
Вот это мне не понятно.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
16.06.2017, 11:35
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
dot_enemy = GetVectorDotProduct(AddVec, vecang);
не вижу нормализации AddVec и vecang перед этим действием.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
16.06.2017, 13:17  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
не вижу нормализации AddVec и vecang перед этим действием.
Я и не нормализовал векторы. Это еще первая версия" вперед-назад". Само скалярное произведение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2017, 13:17
Помогаю со студенческими работами здесь

Ограничить область видимости переменной static
Все говорят что ключевое слово статик, относяшиеся к глобальной переменной, перекрывает область видимости до единицы трансляции. Однако...

Ограничить область видимости переменной SASS внутри конкретного класса
Доброе время суток! Пытаюсь сделать темы, и возник вопрос, как ограничить действие переменной внутри конкретного класса. есть код: ...

Как ограничить доступ к внешним устройствам и не только
Руководство компании поставило задачу по информационной безопасности компании: ограничить доступ сотрудников к USB портам, Wi Fi и...

Как ограничить ввод только цифр и 1 точки
Здравствуйте, я не могу понять как сделать ограничение на ввод. Нужно чтоб человек смог вводить только числа и одну точку. есть много...

Как ограничить доступ к внешним устройствам и не только
Руководство компании поставило задачу по информационной безопасности компании: ограничить доступ сотрудников к USB портам, Wi Fi и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru