Симуляция земных физических законов
|
|
serg-kkz | Дата: Среда, 14.09.2016, 13:26 | Сообщение # 1 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Вот собственно задача, есть большая высота над поверхностью земли в несколько километров. С этой высоты падает игрок или объект, далее все просто по формуле:
(Код из задачи)
Код # Расчет ускорения self.player.setZ(self.player, -((9.81*(task.time**2))/2)*globalClock.getDt())
Однако использование globalClock.getDt() искажает земной закон. Как это можно обойти?
Есть еще знаменитая проблема с проскоком из за большой скорости мимо объекта, но это уже второй вопрос.
ООП -
|
|
| |
ninth | Дата: Четверг, 15.09.2016, 00:15 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| 1. У тебя используется формула пройденного пути, а нужна тебе в данном случае формула мгновенной скорости, т.е. просто (9.81*task.time)
2. Для этого обычно из текущей позиции делается рейкаст в предполагаемую новую позицию и смотрится - пересёк ли луч препятствие.
з.ы. при падении с большой высоты для условий "земной физики" скорость через какое-то время стабилизируется, т.к. ускорение свободного падения в конечном итоге уравновесится сопротивлением воздуха. К примеру падающий человек достигает скорости всего лишь 200-300 км/ч
|
|
| |
serg-kkz | Дата: Четверг, 15.09.2016, 01:20 | Сообщение # 3 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| ninth, тут дело в другом из за разного время рендера кадра, а это время нужно каждый раз перемножать на величину передвижения для одинакового расстояния при разном ФПС, а она разная - вот в чем гвоздь в земной закон . Хотя после прочтения инфы на эту тему, формула пройденного пути будет как никак кстати. Просто такие вещи привязываются к времени для точности. Поэтому нужно перса двигать каждый кадр по формуле время * скорость = расстояние. Но тут есть камень в виде дерганья. Хотя я так понял такой подход используется везде так как является самым приемленным.
По поводу второго вопроса, очевидно что все таки придется использовать луч длинный. А я хотел схитрожопить взяв сегмент. Так как пока он не касается препятствия значит в воздухе и зря не детектится ландшафт, Общий выход от проскакивая использовать линии для пуль, и продолговатые коллидеры для объектов у которых скорость высокая. Тут прямая зависимость чем выше скорость тем более вытянут коллидер. Конечно в итого еще сложнее потом свести все это дело, вылезает потребность запоминать предыдущие положение и т.п.
Что касаемо сопротивления воздуха то работает такая формула.
Код m = 80 # m = масса падающего тела. g = 9.8 # g = ускорение свободного падения. p = 1.184 # ρ = плотность вохдуха. A = 1 # A= площадь проекции тела. C = 0.7 # C = коэффициент лобового сопротивления. print 'km/h:',(sqrt((2*m*g)/(p*A*C))*3600)/1000
Добавлено:
Чтоб формула корректно работала нужно точнее высчитать площадь проекции тела. Здесь метр.
ООП -
Сообщение отредактировал serg-kkz - Четверг, 15.09.2016, 11:29 |
|
| |
ninth | Дата: Четверг, 15.09.2016, 08:37 | Сообщение # 4 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Так я тебе о чём говорю - у тебя в принципе неправильная формула стоит, потому что ты используешь формулу пройденного расстояния как скорость. Если использовать эту формулу (пройденого расстояния), то дельтатайм тебе не нужен, а выглядетьоно должно так self.player.setZ(start_Z - ((9.81*(task.time**2))/2) ) где start_Z - высота откуда началось падение, т.е. стартовая позиция. Но такой вариант имхо хуже чем с дельтатаймом.
Для того чтобы избежать дёрганья надо поиграть с приоритетами задач
Ты вполне можешь использовать отрезок, ты ведь знаешь текущую скорость -> можешь корректировать необходимую длину отрезка.
|
|
| |
serg-kkz | Дата: Четверг, 15.09.2016, 11:27 | Сообщение # 5 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Да так оно и есть неправильно применил формулу, спасибо за разъяснения, ото раздул проблему из ничего я.
Про отрезок в идеале нужно использовать бесконечный луч, так как упасть можно неожиданно(на летящий самолет ). Да и при ходьбе все равно декектится тоже самое. Так какая разница летит перс или идет. Выигрыш мизерный, большие проблемы взамен.
Цитата ninth ( ) Для того чтобы избежать дёрганья надо поиграть с приоритетами задач Дык это бесполезно, так как ты визуально видишь смену положения, зависит от время рендера кадра.Чем меньше разброс по времени тем ровней.
ООП -
|
|
| |
serg-kkz | Дата: Четверг, 15.09.2016, 15:04 | Сообщение # 6 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Как ни странно я нашел еще проблему ;)
Теперь хотелось бы рассчитать скорость относительно самого себя для чистоты.
Я беру запоминаю позицию в начале падения, потом вычитаю новую позицию, получаю расстояние в метрах, делю на task.time, т.е. время. И получаю Х.З.
Хотя по земным законам все сходиться. Проверял на других сайтах.
Хотя все сходиться если все это дело умножить на два, хмм.
ООП -
Сообщение отредактировал serg-kkz - Четверг, 15.09.2016, 15:12 |
|
| |
ninth | Дата: Четверг, 15.09.2016, 15:38 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| дистанция, делённая на время - это скорость для равномерного движения, если же ты движешься с ускорением, то эта формула работать не будет. Текущая скорость = начальная скорость + время * ускорение
|
|
| |
serg-kkz | Дата: Четверг, 15.09.2016, 16:09 | Сообщение # 8 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Блин а как рассчитать относительно перемещения. Тоесть с помочь координат. А если еще точнее сказать, сделать что то вроде спидометра.
ООП -
Сообщение отредактировал serg-kkz - Четверг, 15.09.2016, 16:19 |
|
| |
serg-kkz | Дата: Суббота, 17.09.2016, 01:05 | Сообщение # 9 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Спидометр можно сделать по другому, проверил работает отлично.
(начальная позиция - новая позиция) /globalClock.getDt() = V
ООП -
|
|
| |
ninth | Дата: Суббота, 17.09.2016, 18:39 | Сообщение # 10 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Случаем не игру про вингсьют делаешь? )
|
|
| |
serg-kkz | Дата: Суббота, 17.09.2016, 19:26 | Сообщение # 11 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Цитата ninth ( ) Случаем не игру про вингсьют делаешь? ) Да нет, решил написать вменяемый класс управления игроком, под FPS. И тут понеслось, класс уже не пишу, пишу всякие модули типо просчета гравитации. Но как оказалось не хватает глобального модуля игрового времени, с возможностью его масштабировать и т.д, т.п. Это задача не так простая, нужно запоминать что когда и сколько падало. Вот теперь пишу модуль времени, в уме держу спидометр, более сложный для расчета всех трансформаций. На горизонте маячит модуль окружающей среды, для расчета температуры для разных высот. И все это добро по вылазило от используемых формул. Думаю будет заложен правильный фундамент для FPS.
ООП -
|
|
| |
ninth | Дата: Понедельник, 19.09.2016, 08:15 | Сообщение # 12 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Ясн, хотя сомневаюсь, что обычный игрок заметит разницу температур ) Обычному игроку подавай графику, сюжет и экшн )
|
|
| |
serg-kkz | Дата: Понедельник, 19.09.2016, 09:31 | Сообщение # 13 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Игрок то не заметит, но при необходимости будет на что опереться в расчетах. Если например писать типа симулятора войны, как арма например. То тут пригодиться и расчет падения для парашютных прыжков. И данные температуры будут кстати.
ООП -
|
|
| |