-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
1

[Pawn] Остановка на конечной точке, или остановка поворота при достижении заданного угла

03.04.2018, 06:32. Показов 1907. Ответов 16
Метки pawn (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
У меня такой вопрос, реализация, по возможности более просто, остановка на конечной точке, или остановка поворота, при достижении заданного угла.

Я делаю просто сравнением. Например поворот башни танка у меня идет до тех пор, пока текущий угол положения башни не достигнет начального или заданного угла(все эначения для сравнения я округляю), то-же и с движением.
Но всё это работает ненадежно, так как при большой задержке таймера (например 0.2 сек), и большой скорости персонажа(NPC), значение может просто "проскочить" мимо заданного, и тогда круг по новой(или движение дальше).

Сколько похожих тем в инете смотрел, всё в основном про сам процесс поворота или перемещения, в вот как быть с остановкой(точным и простым определением этого момента останова)
Интересно у кого какие есть мысли по этому поводу. Подскажите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2018, 06:32
Ответы с готовыми решениями:

Остановка таймера при достижении определенного времени
вообщем реализовываю таймер и столкнулся с проблемсом мне нужно что бы в if как только таймер...

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

Зависание и/или остановка работы
Доброго времени суток, коллеги! Не знаю, как сформулировать проблему, так что извините за...

Заморозка или остановка по адресу памяти
В общем к примеру есть адрес F5EBE7F8 Мне нужно его "заморозить" - отключить. Как это сделать?

16
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
04.04.2018, 03:05 2
tonline_kms65, Правила

4.7 Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты получены.

Я знаю как бы я это делал, но телепатию я пока не выкачал, не могу сказать что там у вас творится.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
07.04.2018, 07:44  [ТС] 3
Прошу прощения за долгий ответ.

Значит в чём конкретно мне нужна помощь:



На видео я показал два момента, первый - наведение на цель, второй - возврат башни в начальную позицию.
Видно что наведение происходит резко, но думаю это нормально, а вот возврат башни в начальное положение меня не устраивает. Хотелось бы делать это плавно.

У меня есть несколько вариантов поворота башни. Повернуть нужно до относительных координат {0.0, 0.0, 0.0}
Приращение к углам положения башни, самый простейший вариант.

сильно упрощенный вариант, для более понятного восприятия (это в цикле, естесственно).
Python
1
2
3
angles[0] = 0.0;           блокирую движения по этому углу 
if (angles[1] != 0.0) angles[1] += 1.0;         прибавляю к углу yaw (право-лево) пока не равно нулю.   
angles[2] = 0.0;            блокирую движения по этому углу
Но в этом варианте есть проблема с точкой остановки. Т.е. поворот может просто проскочить точку для остановки и крутить дальше.


Я в инете, везде вижу практически один вариант поворота, с помощью синусов и косинусов.
Попробовал так сделать:

Получаю текущий угол dot (скалярным произведением) между вектором направления башни относительно {0.0, 0.0, 0.0}
Python
1
2
3
angles[0] = 0.0;                                // по этой координате движения "зажимаю" (движения нет)
angles[1] = angles[0] * Sine(dot) + angles[1] * Cosine(dot);       // вот сама формула поворота с синусами и косинусами, то что я не могу понять как это работает.
angles[2] = 0.0;                                // по этой координате движения "зажимаю" (движения нет)
В общем хотелось бы понять, как сделать плавный поворот какого-либо объекта относительно его центра {0.0, 0.0, 0.0} по одному из его углов(в данном случае yaw).
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
07.04.2018, 08:18 4
tonline_kms65, вообще стоит там втулить П-регулятор. т.е зависимость скорости поворота от оставшегося угла на который нужно довернуться. Ну естественно с пороговым значением угла с которого включается регулирование.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
07.04.2018, 08:58  [ТС] 5
Fulcrum_013,

Спасибо конечно, только сама суть вопроса так и осталась. Как определить этот самый "оставшийся угол доворота" (это тоже самое "точка остановки").

Я поэтому и хочу понять как работает поворот с помощью синусов и косинусов.
Заданный угол поворота у меня есть, он получается после стрельбы (скалярное произведение т.д. и т.п. угол между вектором направления к противнику и вектором направления тела Дрона, всегда для башни будет {0.0,0.0,0.0}), значения он него в радианах (можно перевести в градусы конечно, но смысла пока не вижу), нужно просто плавно повернуть на этот самый угол в обратную сторону, т.е. просто плавно вернуть в начальное положение. Пока не пойму как эта кухня работает, я так и буду топтаться на месте.

Возможно там и синусы-косинусы не нужны, есть другие варианты. Но мне нужно понять как работает именно такой поворот с помощью синусов.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
07.04.2018, 10:14 6
tonline_kms65, Вообще то лучше плавно подвести к заданной точке. т.е. чем ближе к точке тем медленнее крутится. Так все реальные роботы работают.

Добавлено через 1 минуту
tonline_kms65, Да кстати с каких делов там 3 угла появились? Скалярное произведение дает один угол который лежит в плоскости векторов.

Добавлено через 23 минуты
tonline_kms65,берешь нормализованные проекции векторов на плоскость вращения башни. Вот там уже при помощи косого произведения находишь синус угла и вращаешь в противоположную сторону, на величину пропорциональную модулю оного синуса. Ну и так же по каждой из координат. Их как понимаю в данном случае 2. При этом точку игрока и танка можно менять как угодно и т.п. башня будет ходить за целью с какой стороны цель не оказалась бы, при этом чем меньше отклонение тем меньше скорость.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
07.04.2018, 11:48  [ТС] 7
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да кстати с каких делов там 3 угла появились? Скалярное произведение дает один угол который лежит в плоскости векторов.
Даже не знаю что сказать. А где видно что у меня Dot из 3 углов?
Естественно что угол один, направление то одно. Не пугай меня, я уже начал думать что я гоню.

Вот это бы поподробнее. Явно это оно и есть, но я не могу пока сообразить. Может быть в коде воспроизведешь. Или ссылку на урок.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
берешь нормализованные проекции векторов на плоскость вращения башни. Вот там уже при помощи косого произведения находишь синус угла и вращаешь в противоположную сторону, на величину пропорциональную модулю оного синуса. Ну и так же по каждой из координат. Их как понимаю в данном случае 2. При этом точку игрока и танка можно менять как угодно и т.п. башня будет ходить за целью с какой стороны цель не оказалась бы, при этом чем меньше отклонение тем меньше скорость.
Что такое косое произведение? Проекции каких векторов?
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
07.04.2018, 11:57 8
tonline_kms65, Косое это z-координата векторного произведения 2D векторов. У векторного произведения 2d векторов x и y =0. т.е. x1*y2-x2*y1. а поскольку остальные координаты вектора равны нулю то это и есть его модуль. он же по совместительству синус угла между векторами. Ну а синус от косинуса отличается поворотом на 90 градусов. т.е. знак будет зависеть не от того острый угол или тупой, а от того вправо он или влево.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
07.04.2018, 12:12  [ТС] 9
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Косое это z-координата векторного произведения 2D векторов. У векторного произведения 2d векторов x и y =0. т.е. x1*y2-x2*y1. а поскольку остальные координаты вектора равны нулю то это и есть его модуль. он же по совместительству синус угла между векторами. Ну а синус от косинуса отличается поворотом на 90 градусов. т.е. знак будет зависеть не от того острый угол или тупой, а от того вправо он или влево.
Ок. Спасибо. Буду думать. Если сам додумаюсь то это будет для меня просто огромный прогресс. Пока же я не понял ничего.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
берешь нормализованные проекции векторов на плоскость вращения башни
Проекции каких векторов? У меня есть текущий вектор направления башни (получаю из углов этой башни), есть текущий вектор родителя т.е. корпуса дрона.
Башня Дрона является аттачем (дочерней по отношению к телу дрона) поэтому для аттача начальные углы родителя всегда будут = 0.0. Есть оставшийся после стрельбы угол (dot). Я могу cross получить + или - (в какую сторону крутить, определение малого круга).
Вот что из этого я могу использовать и как?
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
07.04.2018, 13:40 10
tonline_kms65, Всегда есть 2 вектора - куда смотрит ствол сейчас и куда он должен смотреть по заданию. их надо плавно совместить. Все. А какое задание задавать это уже вопрос автопилота. т.е он должен указать точку прицеливания связанную с каким нить вражиной или точку парковки и т.д.

Добавлено через 21 минуту
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Я могу cross получить + или - (в какую сторону крутить, определение малого круга).
А этого собственно говоря и достаточно. по двум углам только независимо вращать пропорционально отклонению от вектора на точку задания да и все. Да кстати там этот + и - можно вообще скалярными произведениями получать если есть матрица позиционирования ствола. При этом работать будет даже для ствола у которого канал не проходит через оси вращения башни и привода вертикального наведения. т.е. ЛСК ствола это 3 оси - z смотрит по каналу x параллелен плоскости вращения башни y их произведение. четвертая строка - коры самого ствола. вычитаем коры ствола из точки прицеливания. то что получилось (delta) скалярно умножаем на ось x. В результате имеем знак куда вращать по азимуту. умножаем delta на y. Имеем знак куда вращать по углу возвышения. В случае если по азимуту 0 что возможно и в случае когда смотрим в направлении строго обратном заданию умножаем delta на z и в результате получаем туда мы смотрим или не туда.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
08.04.2018, 01:44  [ТС] 11
В Pawn какая матрица. Это же Pawn.
В принципе очень даже неплохой язык, быстрый, шустрый, но есть у него вот такое НО. Не объектно-ориентированный язык.

Столкнулся с такой странностью, если код написать так:

Python
1
2
3
4
5
if(yaw != 0.0){
float yaw2; 
yaw2 -= yaw/180.0;                  // эта строка не отрабатывается
town_angles[1] = yaw2; 
} else town_angles[1] = 0.0;
если этот же код переписать так:

Python
1
2
if(yaw != 0.0) town_angles[1]  -= yaw/180.0; 
else town_angles[1] = 0.0;
то тогда код отрабатывается, не пойму где ошибка?
Вообще уже тупею, аж крыша едет.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
08.04.2018, 05:54 12
tonline_kms65, матрица это массив 4x4. перемножать и т.д. ее можно и функциями. а на углах эйлера далеко не уедешь.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
08.04.2018, 09:06  [ТС] 13
К сожалению вопрос так и остался открытым.
0
Фрилансер
3704 / 2076 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
08.04.2018, 13:30 14
В первом куске кода yaw2 не инициализирован, как Вы ему декремент делаете?
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
08.04.2018, 13:51  [ТС] 15
Цитата Сообщение от Black Fregat Посмотреть сообщение
В первом куске кода yaw2 не инициализирован, как Вы ему декремент делаете?
Не обращай внимания. Это уже от перегрева.

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
float yaw2;
Я понял ошибку, я её объявляю локально, внутри цикла, она постоянно обнуляется.
Всё-равно не работает, я уже давно по другому делаю.



Вообще, если серьёзно, вопрос про точку остановки. Вот он то остаётся открытым.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
08.04.2018, 15:44 16
tonline_kms65, ну если в углах то все точно так же в принципе. считаешь углы по плоскостям между вектором канала ствола и вектором на цель. Дальше двигаешь в сторону противоположную разнице пропорционально углу.
0
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 215
08.04.2018, 17:44  [ТС] 17
Всё. Готово.

Работает отлично, без малейшей оибки. То что и хотел.
Принцип работы кода.
После стрельбы у меня в глобале остаются углы yaw и pitch. в которых шла стрельба. После стрельбы функция возврата башни и станины пулемета принимает эти глобал. переменные, делю их на 180, или если в радианах то PI(полкруга)(т.к. глобальные переменные я нормализовал до 180) * на скорость поворота (сделал кваром) и просто уменьшаю значения этих переменных, а уже эти значения присваиваю углам. Когда = 0.0 return;
Не нужен ни кросс ни дот. Это все я получил еще при стрельбе. В зависимости от знака переменных вращаю башню(то-же касаемо станины с пулеметом).

Все гениальное просто.

Добавлено через 5 минут
0
08.04.2018, 17:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2018, 17:44
Помогаю со студенческими работами здесь

Остановка или закрытие потока BackgroundWorker
и снова потоки. Есть поток, работающий через backgroundworker собственно есть 2 кнопки 1)...

Как сделать, чтобы при достижении левого верхнего угла игра заканчивалась?
procedure TForm1.FormCreate(Sender: TObject); const c: array of TColor = (clMaroon, $0079BFFF);...

Сервисы или службы в delphi. Инсталл, деинсталл, запуск, остановка
Написал программку для инсталляции и пуска, остановки и деинсталляции Сервиса. Всё работает, но...

Остановка слайдера при нажатии
Здравствуйте! Нужен слайдер, который автоматически листает слайды и при нажатии на слайд...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru