Движение "лицом вперед"22.10.2024, 16:38. Показов 6743. Ответов 97
Метки нет (Все метки)
Добрый день
Есть 3D сцена, в процессе симуляции объекты движутся под действием приложенных сил. Объект может иметь опцию типа "face forward" которая заставляет его по(д)ворачиваться по направлению движения, т.е. - объект движется со скоростью v, известен вектор face. При необходимости поворачиваем объект так чтобы эти направления совпадали. При плавных изменениях вектора скорости все хорошо. И тут мелкая неприятность: а если объект был неподвижен (или почти неподвижен)? Очевидно разворот должен занять некоторое время, и как он должен происходить? Объект сначала делает "поворот на месте" и только потом движется? Или начинает двигаться лицом вперед и по ходу дела поворачивается? И просто "задать время поворота" наверно не очень хорошо, оно будет никак не связано со скоростью. Как бы Вы управляли объектом? Если нужны доп опции - то какие (чем меньше тем лучше). Или все должно делаться автоматычно? Спасибо
0
|
|
| 22.10.2024, 16:38 | |
|
Ответы с готовыми решениями:
97
Движение вперёд
Движение объекта вперед/назад по таймеру |
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 29.10.2024, 09:50 | |
|
Очень интересная задача, но все мы, по-моему, запутались. Давайте придумаем физическую систему, в которой возникает наша проблема. Есть два объекта, один имеет длину и движется в плоскости, поворачиваясь так, что его ось направлена по направлению движения. Движение его произвольно, то есть известно положение и две компоненты скорости. Сразу вопрос: его движение зависит от поведения второго объекта? Если ответ "да", то как? Пусть "нет". Второй объект тоже имеет длину и старается повернуться чтобы быть параллельным первому. Сразу вопрос о измерении углов. Можно измерять угол по положению этих объектов, тогда задача упрощается, если же по отличию их положений в некоторой системе координат, то возникает сложность, связанная и тем, что угловая разница может накапливать обороты или обороты сбрасываются. Последний вопрос о управлении вращением второго тела. Имеется ли инерция вращения. В этом случае уравнение второго порядка, при отсутствии инерции - первого.
Если движение первого тела учитывает движение второго, то это напоминает "воздушный бой".
0
|
|
|
818 / 577 / 75
Регистрация: 20.09.2014
Сообщений: 3,767
|
||
| 29.10.2024, 10:20 | ||
|
2. Фаза перемещения: Как только реальная скорость Speed достигает желаемого лимита, то разница во втором уравнении становится ближе к нулю и уже отпадает необходимость ограничивать силу. На ограничении только первое уравнение, а значит объект движется с постоянной максимальной скоростью. 3. Фаза торможения: при приближении к конечной точке разница (TargetCoord - Coord) перестает быть большой и теперь уже TargetSpeed перестает быть на максималке и падает до нуля. В этом случае второе уравнение переходит на противоположный лимит нежели в фазе разгона и соответственно TargetForce упирается в лимит со знаком минус. Происходит торможение с максимальным моментом. Фокус! Добавлено через 2 минуты Такой регулятор способен работать в реальном времени с изменяющимися силами, лимитами, целевыми координатами, массами и при действии помех, например, посторонними силами (трением и прочими воздействиями).
0
|
||
|
Модератор
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
|
||
| 29.10.2024, 17:12 | ||
|
0
|
||
| 29.10.2024, 17:56 [ТС] | |||
|
Заметим что ничего принципиально нового в задаче нет: результат достигается приложением анимированного вектора силы. Требуется исполнить это "на автомате", т.е. наш объект умеет "маневрировать" и поворачиваться вдоль направления скорости. И вместо мутных и гнусных "дифуров" (что никогда ничем добрым не кончаются), не попробовать ли "подсмотреть" как это происходит в реальной жизни. Вот напр автобус делает поворот (или полный круг). Водитель поворачивает руль. С помощью мышечной силы, гидравлики и.т.п. (не знаю, не автолюбитель) поворачиваются ведущие колеса. В итоге автобус едет по дуге. Хорошо заметно что во время поворота вектор скорости не совпадает с направлением "вперед". И что, невозможно добиться того же в симуляции? Та ну, не верю Добавлено через 15 минут Все равно для поворота нужны ось и угол, откуда их взять? Про "перемещаться" не понял
0
|
|||
|
Модератор
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
|
|||
| 30.10.2024, 10:04 | |||
|
0
|
|||
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 30.10.2024, 13:36 | |
|
Очень трудно перейти к чужой постановке задачи и, особенно к чужим обозначениям.
Попытаюсь построить задачу на своем языке по тем описаниям, что были в теме. Физическая картина: движется некоторый не точечный объект, характеризующийся скоростью движения, положением в двухмерном пространстве и положением оси своего корпуса относительно вектора скорости. Другой объект, также не точечный, стремиться занять свое положение так, чтобы оси обеих объектов совпадали. Движения первого объекта заданы и определяются зависимости компонент его скорости от времени. Его направленность совпадает с вектором его скорости. Для дальнейшего достаточно уметь определять зависимость направления его оси от времени. О втором объекте надо знать его конструкцию, определяющую закономерности его движения. Наблюдается ли инерционность? В общем случае для управления его вращением требуется уравнение второго порядка для описания угла межу его осью и некоторым опорным направлением. Здесь возникает принципиальный вопрос. Если опорным направлением может быть выбрано направление оси первого объекта, то задача значительно упрощается. Примем это. Основное уравнение для угла положения второго будет: I*diff(alpha2,t,t)= F(D) Здесь alpha1, alpha2- углы, характеризующие направления осей объектов, t - время, I - инерционность вращения, F - прикладываемый момент силы и D=alpha2-alpha1 - отклонение, которое надо стремиться обнулить. Вид F выбирается из различных соображений, и этот выбор определяет свойства системы, теперь ее можно назвать, системы наведения. Простейший вид F=k*( alpha2-alpha1). Следующее, что надо задать это начальные условия. После этого можно строить решение. Простейшее: t=0; alpha2=alpha1; Первый объект мгновенно поворачивается на угол alpha. Решение: alpha2= alpha1*(1-exp(-sqrt(k)*t)) Сложное: характеризующее трудности связанные с цикличностью углов (а+360=а) alpha1=a*t равномерное вращение; t=0; alpha2=alpha1; k/I - очень мало. Из-за медленного вращения второго объекта разность D достигает значения 180 градусов и меняет знак. Далее каждый может представить, что происходит. Даже если инерционности вращения нет и уравнение заменяется на diff(alpha2,t)= F(D), влияние цикличности сохраняется.
0
|
|
| 30.10.2024, 19:11 [ТС] | |||
|
- почему "в двухмерном пространстве" если стартовый пост говорит о 3D сцене? - откуда "второй объект" ???? Я о нем никак не упоминал и даже не думал. Что "спровоцировало" Вас на этот абсолютно посторонний объект ? - в общем случае направление "вперед" face не совпадает с вектором скорости v (по крайней мере в какой-то момент времени). Задача их совместить Ваше дальнейшее изложение - ну кое-что ясно, другое нет. Тут хорошо бы побеседовать, и многое бы быстро прояснилось. Но на форуме это довольно утомительный обмен постами, поэтому сначала давайте разберем вещи попроще Пока хватит, иначе пост будет слишком длинным
0
|
|||
|
Модератор
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
|
||
| 31.10.2024, 10:34 | ||
|
0
|
||
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 31.10.2024, 10:41 | |
|
Два объекта. Один устанавливает угол, второй стремиться занять требуемое положение.
Впечатление, что часть обсуждающих тему, торопятся что-то делать, не нарисовав для себя суть задачи. Может быть поможет еще пример задачи, изоморфной той, которую я разглядел в нашем обсуждении. Надо сесть на ходу на движущийся поезд старого типа с подножками и поручнями у каждого вагона. Чтобы мягко сесть в идущий поезд, надо двигаться с его скоростью, находясь рядом с дверью одного из вагонов. Решение: исходные данные - скорость поезда V, ваша скорость в момент t=0 V2=0, далее вы равномерно ускоряетесь a - ускорение, до максимально возможной для вас скорости Vm. Если Vm<V поезд ушел без вас. Тогда: положение подножки, на которую вы встанете x=-x0+V*t. Здесь x0 расстояние от исходной точки начала вашего движения до положения подножки. Ваше текущее положение x2=a*t**2/2. Находим время посадки и ускорение, с которым надо двигаться из условий x=x2 и V=a*t. Формулы не привожу. Мне кажется, что теперь , действительно, достаточно обсуждений. При конкретной постановке задачи того типа могут быть решены.
0
|
|
| 31.10.2024, 16:18 [ТС] | |||
|
- чайник движется "лицом вперед" со скоростью v. Прилагается сила F = -v * k, под действием которой чайник должен развернуться и направиться вдоль вектора силы, т.е. в противоположном направлении. Что мы должны делать на интервале симуляции dt ? Напрашивается приложить силу (того же модуля) ортогонально вектору v, в плоскости векторов v и F. Новый вектор скорости будет ближе к требуемому F. Через какое-то число шагов достигнем "полного" поворота. Чем больше сила - тем быстрее поворот (выглядит верно). Прикладывать силу в каком-то другом (не ортогональном) направлении непринципиально. Все равно часть ее уйдет на поворот, другая - на ускорение/торможение. Выглядит разумно, во всяком случае утверждениям выше о тяге и.т.п. не противоречит. Но немного "копнем" - результат (принципиально) зависит от шага симуляции dt, а такого быть не должно - что будет если вектор скорости v нулевой или достаточно мал по сравнению с силой F? Объект (причем "стоячий") мгновенно развернется на 90? Неприемлемо. Давайте залатаем эту дырку ограничив поворот? (подробности пока опустим) - модуль суммы векторов (на каждом шаге) растет, скорость будет неуклонно увеличиваться. Давайте и скорость ограничим? Ну не знаю, может это даже верно, но .. опять заплатка ![]() - направление "лицом" face не упоминается здесь вообще, считаем что, мол, если вектор скорости меняется плавно, то дело в шляпе - просто доворачиваем объект на нужный угол. По меньшей мере, это не всегда верно, см пример с автобусом выше - какие опции для юзера? Конечно все автоматом/пулеметом лучше всего, но достаточен ли ф-ционал? И это только так, навскидку. Простота таких задачек обманчива, ну вот хотя бы пример в этом посте
0
|
|||
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 31.10.2024, 17:30 | |
|
Ирония и юмор всегда полезны. Особенно в моем положении. Я, кажется, свел первичный вопрос и некоторые высказывания к некой замкнутой задаче, но никого это не заинтересовало. Большинство пишет о задаче, сути которой я выделить из дискуссии не могу. Но дискуссия позволила мне увидеть интересную задачу!
0
|
|
| 01.11.2024, 17:11 [ТС] | |
|
Не идет из головы пример с автобусом. Вижу всякий раз когда езжу на ж/д, автобус объезжает клумбу делая разворот на 180. Вот поворот, я внутри и смотрю "вперед" через лобовое стекло. Хорошо заметно что скорость направлена "вбок" куда он поворачивает. Ну ясно, автобус движется по кривой, скорость направлена по касательной к этой кривой. Да, но это совсем не направление "лицом"! И разница, наверно, тот угол под которым повернуты ведущие колеса.
Я почему-то думал что "лицом вперед" - тупенько подворачивать под вектор скорости. А оказывается это не всегда так, напр при повороте. Тогда как считать? В общем, растерялся солдат..
0
|
|
|
Модератор
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
|
|||
| 01.11.2024, 23:01 | |||
|
Сначала нужно написать движок, который будет состоять из: - состояние: Позиция = список пар (Фигура, Расположение) - функции изменения состояния: Позиция СделатьХод(Позиция поз, Ход ход); где Ход = пара (Расположение, Расположение) Затем для удобства желательно написать визуализацию для состояния (Позиции), добавив возможность вводить ходы (Ход) с клавиатуры. И только после этого можно приступать к написанию ИИ для выбора хода. Задачу с движущимся чайником можно писать аналогично. Сначала пишем движок, который будет состоять из: - состояние: Позиция = структура с полями Тяга двигателя, Угол отклонения двигателя, Координаты чайника, Направление оси чайника, Вектор скорости. - функция изменения состояния: Позиция СделатьХод(Позиция СделатьХод(Позиция поз, Ход ход); где Ход = пара (изменение тяги, изменение угла) Для реалистичности изменение тяги и угла за 1 такт ограничены dFmax и dAmax. Можно ограничить максимальную тягу, нужно ограничить максимальный угол. Можно для изменения тяги оставить всего 3 значения: dF, -dF, 0. Аналогично для изменения угла. Если у нас космический корабль, то сопротивления равны нулю. Если у нас моторная лодка, то есть большое поперечное сопротивление и небольшое продольное сопротивление. Затем для удобства желательно написать визуализацию для состояния (Позиции), добавив возможность вводить ходы с клавиатуры (например, нажатием на стрелки). А после этого можно приступать к написанию ИИ для выбора хода. Каждый ход (такт) мы изменяем тягу на dF и угол на dA. Движок вычисляет новые значения тяги и угла, которые будут действовать в течении текущего такта. По ним вычисляются скорость и координаты в конце текущего такта. Разворот будет выглядеть как буква S без нижнего хвостика влево. Добавлено через 2 минуты
0
|
|||
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 02.11.2024, 10:32 | |
|
По-моему, мы все, по крайней мере я, запутались. Может кто-нибудь представить механическую систему, которая как-то движется и в которой надо поворачивать с какой то целью какой-то элемент?
Я уже набил на этом обсуждению руку и готов решить любую задачу такого рода. Для разгрузки пример такой системы. Вращающийся с постоянной скоростью в горизонтальной плоскости обруч диаметром метра полтора. На обруче закреплена бутылка с молоком и соской по направлению к центру. Под обручем на полу или, вариант, вращающейся платформе голодный медвежонок. Детали и решение, если народ заинтересуется.
0
|
|
| 02.11.2024, 15:14 [ТС] | |||||
|
- машина стоит (скорость = 0) и "смотрит" на запад, а должна ехать на восток (так приложена сила F). Неподвижная машина не может вращаться на месте. Придется сначала ехать на запад (или почти на запад) и поворачивать по ходу движения. Это наводит на мысль что "угол dA" должен вычисляться на каждом шаге, а не задаваться опцией статически. - поворот (и/или его время) должен зависеть как от скорости объекта так и от величины прилагаемой силы. В общем сейчас думаю как считать dA Не по теме:
Утверждение: вектор face должен совпадать с направлением скорости объекта v Пример выше показывает что это может быть не так. Тогда как управлять вектором face?
0
|
|||||
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 02.11.2024, 19:45 | |
|
Разговор об автобусе, кажется первая попытка определить объект движения. Хотелось бы иметь замкнутое описание.
Хотя, некоторые детали уже есть. Автобус 4-х колесная система, действительно в повороте ось корпуса автобуса не совпадает с вектором его скорости. Понять проще, рассмотрев предельный случай: полицейский разворот. Ручник тормозит задние колеса и машина вращается вокруг центра задней пары колес. Хотелось бы понять, где здесь носик чайника. Капот смотрит в сторону от направления вращения.
0
|
|
| 03.11.2024, 16:38 [ТС] | ||
|
0
|
||
|
818 / 577 / 75
Регистрация: 20.09.2014
Сообщений: 3,767
|
|
| 03.11.2024, 18:38 | |
|
Ребята, господи, а ещё есть каракатица.... Она плавно движется задом наперёд... Господи, ей богу! Про неё можно талдычить бесконечно абстрактно и конкретно.
0
|
|
|
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
|
|
| 03.11.2024, 19:59 | |
|
Автобус не точка, а протяженное время, попробуйте нарисовать векторы скорости движения разных точек корпуса.
0
|
|
| 04.11.2024, 13:21 [ТС] | ||
|
Может такое объяснение. Движение твердого тела всегда может быть представлено суммой поступательного движения + вращения вокруг центра масс. То что видим из автобуса при его повороте - как раз вращение.
0
|
||
| 04.11.2024, 13:21 | |
|
Помогаю со студенческими работами здесь
40
Движение квадрата по горизонтальной прямой вперёд-назад Кнопка на движение вперед (Игра под Андроид) Движение по списку вперёд/назад, доступ к текущему элементу Графика, ООП: движение креста по синусоиде слева направо, вперед и назад Выдача кредита физическим лицом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|