[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Общие вопросы » Симуляция земных физических законов (Проблемы с особенностями рендера)
Симуляция земных физических законов
serg-kkzДата: Среда, 14.09.2016, 13:26 | Сообщение # 1
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Вот собственно задача, есть большая высота над поверхностью земли в несколько километров. С этой высоты падает игрок или объект, далее все просто по формуле:

(Код из задачи)

Код
# Расчет ускорения
self.player.setZ(self.player, -((9.81*(task.time**2))/2)*globalClock.getDt())


Однако использование globalClock.getDt() искажает земной закон. Как это можно обойти?

Есть еще знаменитая проблема с проскоком из за большой скорости мимо объекта, но это уже второй вопрос.


ООП  -  
 
ninthДата: Четверг, 15.09.2016, 00:15 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
1. У тебя используется формула пройденного пути, а нужна тебе в данном случае формула мгновенной скорости, т.е. просто (9.81*task.time)

2. Для этого обычно из текущей позиции делается рейкаст в предполагаемую новую позицию и смотрится - пересёк ли луч препятствие.

з.ы. при падении с большой высоты для условий "земной физики" скорость через какое-то время стабилизируется, т.к. ускорение свободного падения в конечном итоге уравновесится сопротивлением воздуха. К примеру падающий человек достигает скорости всего лишь 200-300 км/ч
 
serg-kkzДата: Четверг, 15.09.2016, 01:20 | Сообщение # 3
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: 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
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Так я тебе о чём говорю - у тебя в принципе неправильная формула стоит, потому что ты используешь формулу пройденного расстояния как скорость. Если использовать эту формулу (пройденого расстояния), то дельтатайм тебе не нужен, а выглядетьоно должно так self.player.setZ(start_Z - ((9.81*(task.time**2))/2) ) где start_Z - высота откуда началось падение, т.е. стартовая позиция. Но такой вариант имхо хуже чем с дельтатаймом.

Для того чтобы избежать дёрганья надо поиграть с приоритетами задач

Ты вполне можешь использовать отрезок, ты ведь знаешь текущую скорость -> можешь корректировать необходимую длину отрезка.
 
serg-kkzДата: Четверг, 15.09.2016, 11:27 | Сообщение # 5
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Да так оно и есть неправильно применил формулу, спасибо за разъяснения, ото раздул проблему из ничего я.

Про отрезок в идеале нужно использовать бесконечный луч, так как упасть можно неожиданно(на летящий самолет smile ). Да и при ходьбе все равно декектится тоже самое. Так какая разница летит перс или идет. Выигрыш мизерный, большие проблемы взамен.

Цитата ninth ()
Для того чтобы избежать дёрганья надо поиграть с приоритетами задач

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


ООП  -  
 
serg-kkzДата: Четверг, 15.09.2016, 15:04 | Сообщение # 6
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Как ни странно я нашел еще проблему ;)

Теперь хотелось бы рассчитать скорость относительно самого себя для чистоты.

Я беру запоминаю позицию в начале падения, потом вычитаю новую позицию, получаю расстояние в метрах, делю на task.time, т.е. время. И получаю Х.З.

Хотя по земным законам все сходиться. Проверял на других сайтах.

Хотя все сходиться если все это дело умножить на два, хмм.


ООП  -  

Сообщение отредактировал serg-kkz - Четверг, 15.09.2016, 15:12
 
ninthДата: Четверг, 15.09.2016, 15:38 | Сообщение # 7
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
дистанция, делённая на время - это скорость для равномерного движения, если же ты движешься с ускорением, то эта формула работать не будет. Текущая скорость = начальная скорость + время * ускорение
 
serg-kkzДата: Четверг, 15.09.2016, 16:09 | Сообщение # 8
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Блин а как рассчитать относительно перемещения. Тоесть с помочь координат.
А если еще точнее сказать, сделать что то вроде спидометра.


ООП  -  

Сообщение отредактировал serg-kkz - Четверг, 15.09.2016, 16:19
 
serg-kkzДата: Суббота, 17.09.2016, 01:05 | Сообщение # 9
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Спидометр можно сделать по другому, проверил работает отлично.

(начальная позиция - новая позиция) /globalClock.getDt() = V


ООП  -  
 
ninthДата: Суббота, 17.09.2016, 18:39 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Случаем не игру про вингсьют делаешь? )
 
serg-kkzДата: Суббота, 17.09.2016, 19:26 | Сообщение # 11
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Цитата ninth ()
Случаем не игру про вингсьют делаешь? )

Да нет, решил написать вменяемый класс управления игроком, под FPS. И тут понеслось, класс уже не пишу, пишу всякие модули типо просчета гравитации. Но как оказалось не хватает глобального модуля игрового времени, с возможностью его масштабировать и т.д, т.п. Это задача не так простая, нужно запоминать что когда и сколько падало. Вот теперь пишу модуль времени, в уме держу спидометр, более сложный для расчета всех трансформаций. На горизонте маячит модуль окружающей среды, для расчета температуры для разных высот. И все это добро по вылазило от используемых формул. Думаю будет заложен правильный фундамент для FPS.


ООП  -  
 
ninthДата: Понедельник, 19.09.2016, 08:15 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Ясн, хотя сомневаюсь, что обычный игрок заметит разницу температур ) Обычному игроку подавай графику, сюжет и экшн )
 
serg-kkzДата: Понедельник, 19.09.2016, 09:31 | Сообщение # 13
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Игрок то не заметит, но при необходимости будет на что опереться в расчетах. Если например писать типа симулятора войны, как арма например. То тут пригодиться и расчет падения для парашютных прыжков. И данные температуры будут кстати.

ООП  -  
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Симуляция земных физических законов (Проблемы с особенностями рендера)
Страница 1 из 11
Поиск: