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

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

07.05.2017, 01:34. Показов 4675. Ответов 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
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
16.06.2017, 13:33
Студворк — интернет-сервис помощи студентам
tonline_kms65, вот я и говорю - перед скалярным произведением надо векторы нормализировать, и только тогда получится косинус. Либо же делить полученное произведение на длины обоих векторов, тогда тоже получится косинус...
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
16.06.2017, 15:46  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
tonline_kms65, вот я и говорю - перед скалярным произведением надо векторы нормализировать, и только тогда получится косинус. Либо же делить полученное произведение на длины обоих векторов, тогда тоже получится косинус...
Нормализовал векторы, потом сделал их скалярное произведение.
Полученный результат:

Кликните здесь для просмотра всего текста
Угол 0.216513/Противник Norm
Угол 0.999645/Противник Norm
Угол 0.999795/Противник Norm
Угол 0.999866/Противник Norm
Угол 0.999884/Противник Norm
Угол 0.999610/Противник Norm


Как это можно использовать? Не могу врубиться.
Визуально - результат такой же как без нормализации.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
16.06.2017, 15:54
(косинус 0 градусов 1.0, косинус 15 градусов 0.965, косинус 45 градусов - 0.707)
Значит Угол 0.216513/Противник Norm находится вне угла 90 градусов, а находится в угле (arccos(0.216513)*2) = 154 градуса. А из остальных, самый дальний - 0.999610 - находится в угле (arccos(0.99961)*2) = 3.2 градуса.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
16.06.2017, 16:16  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Значит Угол 0.216513/Противник Norm находится вне угла 90 градусов, а находится в угле (arccos(0.216513)*2) = 154 градуса. А из остальных, самый дальний - 0.999610 - находится в угле (arccos(0.99961)*2) = 3.2 градуса.
Обалдеть.
Если я правильно понял, получается, я должен полученный результат (например 0.216513) переводить сразу в градусы (arccos(0.216513)*2), и уже эти градусы сравнивать с тем углом, который я задал (например я задал угол 60 градусов)?
То есть получаю arccos(0.216513)*2) = 154 градуса, => 154>60 Если конечно я правильно понял.


Пойду осмысливать. По моему что то начинаю понимать.

Добавлено через 6 минут
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
0.216513)*2
Здесь умножение на 2 для того что бы угол был полный?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
16.06.2017, 16:28
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Здесь умножение на 2 для того что бы угол был полный?
Угол между направлением "вперёд" и направлением на цель. А ты спрашивал "угол обзора" (т.е. угол конуса, который "видит" ракета), который в 2 раза больше.

Добавлено через 1 минуту
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
и уже эти градусы сравнивать с тем углом, который я задал
проще заданный тобой угол пересчитать в косинус и сравнивать. Т.к. задаёшь угол ты один раз, а пересчитывать из косинуса угол нужно 100500 раз, а это очень медленно...
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
16.06.2017, 16:46  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Угол между направлением "вперёд" и направлением на цель. А ты спрашивал "угол обзора" (т.е. угол конуса, который "видит" ракета), который в 2 раза больше..
С этим понятно.

Цитата Сообщение от TRam_ Посмотреть сообщение
Добавлено через 1 минуту
проще заданный тобой угол пересчитать в косинус и сравнивать. Т.к. задаёшь угол ты один раз, а пересчитывать из косинуса угол нужно 100500 раз, а это очень медленно...
А вот здесь не совсем понятно. Почему 100500 раз? И почему в косинус? Вроде арккосинус. Или это одно и то же?
Я попробую на практике.
У меня функция ArcCosine(dot_enemy)*2 возвращает значение в радианах, что это значит?

Кликните здесь для просмотра всего текста
ArcCosine Function

Returns the arccosine of the input value.

float ArcCosine(float angle)
Parameters

float angle
Input value.

Return Value
acos(value) in radians.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
16.06.2017, 16:49
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
что это значит?
это значит чтоб получить градусы, нужно поделить на число pi и умножить на 180

Добавлено через 1 минуту
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Почему 100500 раз? И почему в косинус? Вроде арккосинус. Или это одно и то же?
Можно сравнивать арккросинус скалярного произвдения с заданным уголом, а можно сравнивать само скалярное произведение с косинусом заданного угла.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
16.06.2017, 18:02  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
это значит чтоб получить градусы, нужно поделить на число pi и умножить на 180

Добавлено через 1 минуту
Можно сравнивать арккросинус скалярного произвдения с заданным уголом, а можно сравнивать само скалярное произведение с косинусом заданного угла.
Тогда для меня будет проще сравнивать само скалярное произведение с косинусом заданного угла. При инициализации переменных, я свой заданный угол один раз перевожу в косинус Cosine(specified_angle) и значение скалярного произведения нормализованных векторов (dot_enemy) сравниваю с Cosine(specified_angle).
Так будет проще?

Добавлено через 10 минут
Перевел заданный угол 90 градусов в косинус
результат:
Кликните здесь для просмотра всего текста
Угол 0.996952/Противник Albert/ Косинус 0.901283
Угол 0.999986/Противник Albert/ Косинус 0.901283
Угол 0.999984/Противник Albert/ Косинус 0.901283
Угол 0.999983/Противник Albert/ Косинус 0.901283
Угол 0.999981/Противник Albert/ Косинус 0.901283
Угол 0.999979/Противник Albert/ Косинус 0.901283
Угол 0.999977/Противник Albert/ Косинус 0.901283
Угол 0.999974/Противник Albert/ Косинус 0.901283
Угол 0.999970/Противник Albert/ Косинус 0.901283
Угол 0.999966/Противник Albert/ Косинус 0.901283
Угол 0.999961/Противник Albert/ Косинус 0.901283
Угол 0.999954/Противник Albert/ Косинус 0.901283
Угол 0.999946/Противник Albert/ Косинус 0.901283
Угол 0.999936/Противник Albert/ Косинус 0.901283
Угол 0.999921/Противник Albert/ Косинус 0.901283
Угол 0.999902/Противник Albert/ Косинус 0.901283
Угол 0.999875/Противник Albert/ Косинус 0.901283
Угол 0.999833/Противник Albert/ Косинус 0.901283
Угол 0.999768/Противник Albert/ Косинус 0.901283
Угол 0.999655/Противник Albert/ Косинус 0.901283
Угол 0.999436/Противник Albert/ Косинус 0.901283


Эти значения можно уже сравнивать? Хотя навряд ли. Как их сравнивать. Нужно переводить.
Это нужно (ArcCosine(dot_enemy)*2)/pi*180
Не. На сегодня хватит.


https://youtu.be/k6ZOzQeZA44

Добавлено через 18 минут
Нашел что нужно.
dot_enemy = RadToDeg(ArcCosine(dot_enemy));
// RadToDeg переводит радианы в градусы
//ArcCosine возвращает значение в радианах
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.06.2017, 09:54
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
*2)/pi*180
Мучайте радианы, так расчет быстрей и меньше.
http://ru.onlinemschool.com/ma... ctor/angl/

Есть моменты где ракета летит по ломанной а это очень странно…
Почему не взять один из алгоритмов от реальных ракет пусть и упрощенно? Погуглите “Куркоткин Самонаведение ракет” вроде были 4 базовых алгоритма наведения простым языком.
Алгоритм наведения ракеты на цель методом пропорциональное наведение

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Противник может появиться не только спереди, он может появиться сзади, слева или справа, более угла 180 градусов
Если угол между векторами (хвост ракеты – боеголовка ракеты)и (хвост ракеты - бот )больше Pi/2 то цели нет.

Как насчет ракете сделать плавный набор скорости от min до max?
Тогда все параметры ракеты это функции от ее текущей скорости.
1)Максимальный текущий угол захвата цели это функция от скорости ракеты.
Чем больше скорость тем меньше угол захвата(реальная ракета не может мгновенно изменить курс).
2) Максимальный текущий угол поворота ракеты к цели это функция от скорости ракеты. Чем выше скорость ракеты тем меньше ее маневренность.

Дрон также не имеет хотя бы имитации инерции.
Реалистичней сделать ему плавное изменение скорости полета.
Во время зависания добавить шум к координатам его положения это типа ветер...

Ракете реалистичней добавить не мгновенный пуск а сначала отстрел ракеты без включения движка, через 0.5 сек запуск двигателя и плавный разгон ракеты +звуки всего этого.
Первые 25 сек очень хорошо видно это:
https://www.youtube.com/watch?v=PaJT1dr7ZFc
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
25.06.2017, 16:17  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Мучайте радианы, так расчет быстрей и меньше.
http://ru.onlinemschool.com/ma... ctor/angl/
Мой код на сейчас:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
MakeVectorFromPoints(rocket_pos, enemy_pos, AddVec);                            // делаю вектор от ракеты до цели
NormalizeVector(AddVec, nrm_add_vec);                                                    // нормализую вектор от ракеты до цели
NormalizeVector(vecang, nrm_vec_angle);                                                  // нормализую вектор угол ракеты(полученный из её текущего угла)
        /*получаем градус угла от направления ракеты до противника*/
dot_enemy = GetVectorDotProduct(nrm_add_vec, nrm_vec_angle);                      // скалярное произведение векторов (получаю радианы)
dot_enemy = RadToDeg(ArcCosine(dot_enemy));                                       // радианы в градусы

Я пока не совсем понимаю что такое радианы. Скоро разберусь. А так то конечно быстрее, одной функцией уже меньше.
И не пойму что такое модули векторов
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Есть моменты где ракета летит по ломанной а это очень странно…
Почему не взять один из алгоритмов от реальных ракет пусть и упрощенно? Погуглите “Куркоткин Самонаведение ракет” вроде были 4 базовых алгоритма наведения простым языком.
Алгоритм наведения ракеты на цель методом пропорциональное наведение
Посмотрю обязательно, интересно.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Если угол между векторами (хвост ракеты – боеголовка ракеты)и (хвост ракеты - бот )больше Pi/2 то цели нет.
Как насчет ракете сделать плавный набор скорости от min до max?
Тогда все параметры ракеты это функции от ее текущей скорости.
1)Максимальный текущий угол захвата цели это функция от скорости ракеты.
Чем больше скорость тем меньше угол захвата(реальная ракета не может мгновенно изменить курс).
2) Максимальный текущий угол поворота ракеты к цели это функция от скорости ракеты. Чем выше скорость ракеты тем меньше ее маневренность.
Я угол получаю по кости(bone) самой 3D модели ракеты, потом из этого угла получаю вектор.
Насчет плавности (эластичности) - займусь обязательно, как только математику освою. Пока я её не совсем понимаю, сказать больше совсем не понимаю. А это сильно сдерживает. Код у меня есть, снижение скорости при повороте (при обнаружении противника).

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Дрон также не имеет хотя бы имитации инерции.
Реалистичней сделать ему плавное изменение скорости полета.
Во время зависания добавить шум к координатам его положения это типа ветер...
Насчет инерции не знаю, навряд ли буду делать, хотя заинтересовало. Карты маленькие просто.
Шум двигателей есть, само аудио. С этим нужно поработать. У меня продолжительность звука почти 10 сек. При зацикливании не могу поймать этот период. Звук Дрона еле нашел. Я по обработке звука не очень, поэтому пока, как то руки не доходят.
Можно зациклить в самом звуковом скрипте, добавить точку(cue points), так вроде и проще, но бывает при разрушении ENT сама сущность уничтожается, а звук остается, есть такой косяк в этом движке.
Нужно уменьшить продолжительность звука, и подогнать зад к переду, как бы "затайлить", что бы проигрывался звук без перепадов.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Ракете реалистичней добавить не мгновенный пуск а сначала отстрел ракеты без включения движка, через 0.5 сек запуск двигателя и плавный разгон ракеты +звуки всего этого.
Первые 25 сек очень хорошо видно это:
https://www.youtube.com/watch?v=PaJT1dr7ZFc
Это я давно сделал, таймером задержку дал. Даже звук на отстрел и запуск ракеты разный. Таймер нужно подогнать, пока не до этого. Сама 3D модель ракеты имеет физические свойства, поэтому при отстреле ведет себя так как положено. Потом уже, после запуска, полет управляется программным кодом.

Огромное спасибо за предложения и замечания.
Как-то у меня странно получилось, что все это проще сделать, чем понять математику. Но, я думаю скоро разберусь с математикой, тогда на многое руки развяжутся.

Понял что такое "Модуль вектора", это просто длина вектора.
Интересный кстати сайт, можно свои функции написать с его помощью. Они есть готовые конечно в библиотеках, но как работают -непонятно, а здесь все ясно.

Понял что такое радианы:
1 радиан = 57 градусов 17 минут 45 секунд.
1 радиан=360°/2π
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.06.2017, 20:16
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
// нормализую вектор от ракеты до цели
На сайте с примером нет нормализаций векторов.
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
// радианы в градусы
Забывайте помалу градусы, это больше для школы. В программировании рулят радианы.

Может трассеры для пулемета? При стрельбе наверно нужно трясти дрон\отдача иначе это будет летающий снайпер.

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Звук Дрона еле нашел.
Может проще взять звуки дронов с ютуба которые сотнями летают с камерами?
Наверно еще удобней синтезировать звук винтов+изменение звука от разгона винтов(торможение и разгон) с нуля в спец проге не знаю как это делают...это уже будет проф уровень, зато очень удобно и можно сделать весьма реалистично.
В гугле “синтез звука дрона” дает такое:
https://habrahabr.ru/post/194670/
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
как бы "затайлить",
Качественно наверно только синтезировать с нуля.


Наверно алгоритмы наведения будут актуальны только если скорость ракеты сопоставима со скоростью цели. Если не будет функций изменяющих маневренность ракеты от скорости то наверно и не будет шанса у цели уйти от атаки ракеты \уменьшить урон от нее..наче дрон будет просто потрошить всю команду противника.
Кстати напоминает мод Cs 1.6 amx_apache.

В гугле “cs source drone”
https://www.youtube.com/watch?v=gl7c24sd7CE
Вот тут и звук обычного дрона с ютуба.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
26.06.2017, 05:35  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
На сайте с примером нет нормализаций векторов.
Забывайте помалу градусы, это больше для школы. В программировании рулят радианы.
Может трассеры для пулемета? При стрельбе наверно нужно трясти дрон\отдача иначе это будет летающий снайпер.
Я уже понял что радианами легче, только пока не пойму как их лучше сравнивать. Примерчик бы сравнения.
Насчет отдачи и трассеров, это целая эпопея, я уже перепробовал все варианты. Остановился на варианте с анимированной тестурой пули. Но и там не все гладко. Это я в своём плагине Mashine_Gun мучался. Пока плюнул-оставил всё как есть.
Совет очень неплохой, можно иммитацию отдачи сделать небольшой тряской камеры. Сделаю. Анимация на выстрел пулемета у меня сделана. Aim и damage(конечная точка и ущерб) на пулемет у меня рендомный, так что попасть в противника не так то просто.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Наверно алгоритмы наведения будут актуальны только если скорость ракеты сопоставима со скоростью цели. Если не будет функций изменяющих маневренность ракеты от скорости то наверно и не будет шанса у цели уйти от атаки ракеты \уменьшить урон от нее..наче дрон будет просто потрошить всю команду противника.
Кстати напоминает мод Cs 1.6 amx_apache.
Полностью согласен, вот только одно НО. Математика. Вот здесь то она и нужна. Руки связанны.
Увернуться от ракеты сейчас пока можно, спрятаться за стеной, ракета теряет цель и летит дальше. Но естественно это не то пальто.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
В гугле “cs source drone”
https://www.youtube.com/watch?v=gl7c24sd7CE
Вот тут и звук обычного дрона с ютуба.
Я как будто в детство вернулся, это моя практически самая первая версия этого же плагина, только с участием другой 3D модели дрона. Я уже даже и забыл про это. Там у меня еще косяк был, не догадался вес добавить на центральную кость модели. Его при ударе обо что нибудь крутить начинало. Давно это было. Ностальгия даже. Есть у меня кстати этот звук, остался. Но я решил делать изменение звука с помощью pitch. Я думаю это самое простое. Так сказать украшение. Пока есть задачи намного сложнее. МАТЕМАТИКА.


Цитата Сообщение от Excalibur921 Посмотреть сообщение
Кстати напоминает мод Cs 1.6 amx_apache.
Когда то я писал плагины для 1,6. Даже мод намутил Mutant CS1.6.
Плагин amx_apache. я помню.
Там нельзя было управлять мышкой(вид) по моему. Только с клавы.
У меня управление одновременно и мышкой(вид и стрельба) и клавой и ускорением, короче так же как и игроком.

Вообще, все мои сегодняшние идеи пришли именно из cs1.6.

Добавлено через 44 минуты
Цитата Сообщение от Excalibur921 Посмотреть сообщение
На сайте с примером нет нормализаций векторов.
Нормализация мне уже давнооо не нужна.
Моя слабость на сегодня - это именно углы, градусы, синусы, косинусы и т.д. А то что по прямой - давно пройдено.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
29.06.2017, 02:20  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Забывайте помалу градусы, это больше для школы. В программировании рулят радианы.
Примерчик бы, как сравнить радианы.
У меня например задан угол обзора, я его при инициализации сразу перевожу в радианы, хочу сравнивать этот результат с тем, который получается в результате поиска целей ракетой. Сколько смотрю в инете - не могу пока сообразить.
Еще с работой напряженка, времени нет всерьёз заняться.

Добавлено через 22 минуты
У меня код такой:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
при инициализации сразу перевожу заданный градус в радианы, что бы больше его не касаться.
fAngleWiever = DegToRad(fAngleWiever);  //градусы в радианы.
 
дальше, уже в коде поиска:
 
dot_enemy = ArcCosine(dot_enemy);  //функция возвращает полученное значение в радианах.
.........
if(dot_enemy <= fAngleWiever){   //само  сравнение
.......
....
..
}


Так сравнивать будет верно? Или нужно как то по другому?

Добавлено через 17 минут
Проверил. В игре, визуально - не сравнивает. Не то значит.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
29.06.2017, 18:26
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
как сравнить радианы
В смысле? А как сравнивают два числа?

Не понимаете радианы тогда мучайте градусы. Главное сделать чтобы работало, потом подпилите на радианы или оставите так =).
Я считаю нужно делать всегда только так если вы уже не эксперт 80 лвл:
1)Сделайте чтобы вообще хоть что то работало
2)чтобы работало правильно
3)работало быстро (Оптимизация)

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Сколько смотрю в инете - не могу пока сообразить.
По идее наверно самый тяжелый расчет это трассировка видна ли цель ракете. Значит нужно минимизировать вызов этого дела.

Велик:
Пробегаем всех врагов в цикле. Если текущая цель видна боеголовке по углу зрения то записать координаты в Array0.
Отсортировать массив Array0 по возрастанию дальности до ракеты.
Читаем первый элемент в Array0 он же и ближайший к ракете и делаем ему трассировку.
Если цель видна ракете то установить как цель иначе читаем следующий элемент и повторяем трассировку.

Или проще:
Пробегаем всех врагов в цикле. Если текущая цель видна боеголовке по углу зрения то записать ее координаты в Array0.
Найти минимум MinTargetDist дальности до ракеты в Array0.
Делаем трассировку MinTargetDist.
Если цель видна ракете то установить как цель иначе записать на место где был MinTargetDist большое число и снова найти минимум.

Вообще алгоритмов сортировки туча я не шарю в них =).

Добавлено через 7 минут
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
В игре, визуально - не сравнивает. Не то значит.
Вы хоть представляете сколько мест где может быть косяк в реальном коде?
От багов мода до алгоритмических \математических ошибок в коде.
Смотрите все переменные. Попробуйте убрать урон ракете, остановить двух ботов, встать между ними и запускать. Смотреть как находит углы и что выбрано как цель.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
30.06.2017, 08:59  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
В смысле? А как сравнивают два числа?
Не понимаете радианы тогда мучайте градусы. Главное сделать чтобы работало, потом подпилите на радианы или оставите так =).
Так в том то и дело, пока были градусы - работало. Что то не так сделал, а что не пойму. Меня сейчас не интересуют градусы, мне нужно понять математику, здесь конкретно - радианы. А заниматься всякими костылями мне уже давно не хочется.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
По идее наверно самый тяжелый расчет это трассировка видна ли цель ракете. Значит нужно минимизировать вызов этого дела.
Вот это как раз самое простое. Давно сделано. Я в начале этой темы объяснял свой алгоритм поиска ракетой противников.
Меня сейчас интересует пример сравнения радиан. Как он выглядит. На любом языке.

Добавлено через 21 минуту
Все, сообразил. Мой косяк. Почему то я был уверен что при обработке кваров (при инициализации глобал. переменных) заданные градусы преобразуются в радианы. Так был уверен в этом что даже не удосужился проверить. Сейчас проверил - получилось сравнивал градусы с радианами.
Переделал - сейчас всё ОК.

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
Задан 1.570796 Получен 0.779911
 Задан 1.570796 Получен 1.259488
 Задан 1.570796 Получен 0.015398
 Задан 1.570796 Получен 0.081973
 Задан 1.570796 Получен 0.792166
 Задан 1.570796 Получен 1.286753
 Задан 1.570796 Получен 0.027760
 Задан 1.570796 Получен 0.106634
 Задан 1.570796 Получен 0.792255
 Задан 1.570796 Получен 1.302836
 Задан 1.570796 Получен 0.055067
 Задан 1.570796 Получен 0.149463


Добавлено через 13 часов 11 минут
Получается всё просто - сравниваю радианы точно так же, как и простые числа.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.06.2017, 14:54
Формула движения точки по цилиндрической винтовой линии(спирали) в программный код
Хотите пускать ракеты по спирали?
Теперь если вкурите “кросс продукт двух векторов” и “матрица поворота вокруг произвольной оси в 3д” хотя что то подобное наверняка там есть в скрипте.
Тогда можно будет:
1)пускать ракеты по спирали к цели
2)добавлять шум к траектории ракеты
3)сделать другие алгоритмы наведения…но похоже смысла в них на практике нет
4) маневренность ракете как функцию от скорости это сделает траектории поворота плавными. Позволит ракетам не попадать… а надо ли?
В ПВО ракетах есть датчик приближения к цели, если дистанция меньше порога то взрыв.

Побегал с базукой в cs 1.6 amxx.
Наверно пашет так:
Через 1 сек старта ракета читает координаты всех целей например 10 раз в сек, ищет минимум расстояния и устанавливает эти координаты как цель.
Можно шмальнуть вверх карты\за угол и ракета находит цель.
Всего 3 режима
1)управление ракетой и вид с боеголовки. Можно облететь всю карту ракетой.
2)автонаведение
3)обычный выстрел
800 строк кода.

В HL1 ракеты наводились на точку лазера.
В HL1 есть оружие пришельцев типа желтые мухи.
Можно сделать наподобие много мелких ракет летят по траектории с шумом к одной цели или каждая выбирает свою.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
30.06.2017, 18:12  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Формула движения точки по цилиндрической винтовой линии(спирали) в программный код
Хотите пускать ракеты по спирали?
Теперь если вкурите “кросс продукт двух векторов” и “матрица поворота вокруг произвольной оси в 3д” хотя что то подобное наверняка там есть в скрипте.
Тогда можно будет:
1)пускать ракеты по спирали к цели
2)добавлять шум к траектории ракеты
3)сделать другие алгоритмы наведения…но похоже смысла в них на практике нет
4) маневренность ракете как функцию от скорости это сделает траектории поворота плавными. Позволит ракетам не попадать… а надо ли?
Признаться - была такая мысль, но пока движение по спирали мне нужно не для этого. Никак пока не могу добраться до этой темы, протестировать. Давно меня этот вопрос волнует.
Хотя как вариант интересно. Ракеты у меня с физическими свойствами, у них есть вес, жизнь, и т.д., т.е. можно, по идее, сбить их в воздухе. Как вариант защиты ракеты.
Произведение векторов, а что там вкуривать? Не так. Для чего, или вернее пример бы применения этого, может быть уже пора заняться этим.
Матрицу поворота (кватернион) использовать здесь пока никакой необходимости не вижу.


Цитата Сообщение от Excalibur921 Посмотреть сообщение
В ПВО ракетах есть датчик приближения к цели, если дистанция меньше порога то взрыв.
Датчик приближения к цели у меня естественно есть. Поражение (damage) у меня по такому принципу и работает.
У меня есть проблема определения брашей (стен карты). Пока всерьёз этим не занимался, но уже чувствую, проблемы с этим будут точно. Пока у меня ракета, при отсутствии противника, взрывается в конечной точке (датчик расстояния) или просто от удара о твердое препятствие (жизни 1 HP).
Можно конечно получать значение скорости, и при 0 (при остановке) взрывать, но это опять же расчеты, нагрузка на движек. Короче проблема определения брашей встанет очень остро. На данный момент, при попадании в любую сущность на карте (каждая сущность имеет свой ID) взрыв ракеты отрабатывается на отлично. А вот у брашей ID нет. Это не сущность, это наверно, больше мир. В общем, вопрос такой еще возникнет, 100%.

Насчет запуска нескольких ракет - запросто. У меня и так каждая ракета это самостоятельная ENT со своими свойствами, и с поиском противника.
Сейчас ракеты по одной, с задержкой - чтобы движек игры сильно не грузить расчетами.
Надо сказать спасибо товарищу _wS_ с сайта world-source.ru, сам долго голову ломал бы. Очень дельная подсказка была насчет таймера.

Добавлено через 9 минут
И кстати, у меня же здесь 2 вида ракет.
Маленьких 28 штук, задержка между выстрелами минимальная, и 8 больших ракет.
Большие ракеты я планирую сделать для уничтожения сущностей созданных моими плагинами (робот, пулемет, лазерная установка, маленький Дрон, и такой же боевой Дрон), а заодно и игроков команды противников, маленькие ракеты только для уничтожения игроков-противников.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.06.2017, 18:43
С кватернионами я так и не разобрался.
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Произведение векторов, а что там вкуривать? Не так. Для чего, или вернее пример
Ну вот же:
Цитата Сообщение от Excalibur921 Посмотреть сообщение
3)сделать другие алгоритмы наведения…но похоже смысла в них на практике нет
4) маневренность ракете как функцию от скорости это сделает траектории поворота плавными.
Хотя может можно и по другому. Если есть масса то движок считает все это по идее.
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Ракеты у меня с физическими свойствами, у них есть вес,
Тогда не устанавливать направление ракеты а действовать силой с направлением изменения курса на цель и постоянной амплитудой это уберет резкие повороты в траектории ракеты.

Робот слишком большой и мультяшный. Почему не взять из MechWarrior?
Размером с 1.5 роста человека...пусть бегает по карте )).
Написать ему алгоритм с нуля это как сделать бота для кс... наверно проще сменить скин боту на робота+оружие робота.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
30.06.2017, 23:24  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Робот слишком большой и мультяшный. Почему не взять из MechWarrior?
Если есть 3D модель - покажи. Может быть там просто статичная модель. С ней работы будет, только с анимацией, месяца на 2.

А этот робот у меня потому, что у него много готовых анимаций. Увеличить или уменьшить размер это не проблема. Проблемы в анимациях, Сама модель очень низкополигонная, анимации не ломает, и весят они копейки.
Я пробовал одно время 3D модели из "WoW", неплохие модельки, отличные анимации (причем масса), но при экспорте частенько модели "ломает", хоть несильно - но неприятно. Этим я занимался года 3 назад. Может быть, к этому времени, появился хороший импортер из WoW. Хотя навряд ли. А моделей в WoW(низкополигоных, с обалденными анимациями) валом.
Но это уже из области 3D моделирования. Тоже моё хобби, но пока на него нет времени. Программирование интереснее.

Вообще, программирование без умения моделировать, ничто. То что не получается сделать кодингом, можно сделать корректировкой 3D модели, и наоборот.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.07.2017, 00:16
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Если есть 3D модель - покажи
Поискать в старых игрушках, наверняка есть там и экспорт\импорт всех нужных анимаций например в milkshape3d или что то такое…

Разве нужно много анимаций? Например самых базовых.
Идет, стоит, стреляет, смерть.
Для разнообразия варианты каждой анимации.

Ваши моды доступны где то для скачивания? Например на форуме amxx когда искал плагины создавали тему и в ней плагин, исходник, ресурсы + описание что и как.
Так из 5 amxx плагинов был найден один рабочий базуки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2017, 00:16

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru