Физическое моделирование
At physics simulation, physics calculations are in the multi-threaded mode — some operations are performed in parallel.При моделировании физических процессов вычисления выполняются в многопоточном режиме — некоторые операции выполняются параллельно.
Physics performance profiler enables real-time tracking of simulation performance.Профилировщик физической производительности позволяет отслеживать производительность моделирования в режиме реального времени.
Rate of Physics SimulationЧастота обновления физики#
UNIGINE physics module performs all its calculations. There are few things to point out about physics. Все необходимые вычисления выполняются физическим модулем UNIGINE. Есть несколько вещей, на которые стоит обратить внимание.
-
It is simulated with its own fixed FPS, which does not depend on the rendering framerate. (The Engine FPS can also be synchronized with the physics one).Моделирование выполняется с собственной фиксированной частотой, которая не зависит от частоты кадров рендеринга (частоту обновления движка также можно синхронизировать с физикой).
If physics takes more than the assigned budget, further calculations are delayed. These calculations shall be performed during the subsequent rendering frames, making physics simulation look like in a "slow-motion" mode. The default budget is 50ms, but it can be increased, as necessary.Если физические расчеты занимают больше, чем назначенный бюджет, дальнейшие расчеты задерживаются. Эти расчеты должны выполняться во время последующих кадров рендеринга, что делает моделирование физики похожим на "замедленную съемку". Бюджет по умолчанию равен 50 мс, но при необходимости его можно увеличить. -
During each tick, a number of calculation iterations can be performed. This includes the full cycle of physics simulation:Во время каждого кадра может выполняться несколько итераций расчета. Сюда входит полный цикл физического моделирования:
- updatePhysics() from the world logic is called.Вызывается updatePhysics() из логики мира.
- Collision detection is performed.Выполняется обнаружение столкновений.
- Joints are solved.Решаются сочленения (joints).
- Collision response is performed.Выполняется реакция на столкновение.
There is no point in setting the number of iterations too high. UNIGINE checks whether the next iteration can be performed within physics budget limit, and if not, it is delayed and moved to the next rendering frame.Нет смысла устанавливать слишком большое количество итераций. UNIGINE проверяет, может ли следующая итерация быть выполнена в рамках текущего бюджета физики, а если нет, то она задерживается и происходит переход к следующему кадру рендеринга.
Physics Update ModesРежимы обновления физики#
There are two update modes available for physics simulation (each of them has its advantages and use cases):Для моделирования физики доступно два режима обновления (каждый из них имеет свои преимущества и варианты использования):
- Before Rendering — physics update (along with the spatial tree update and user callbacks) is executed in the Main thread just before rendering is performed (render). The number of physics ticks executed before the rendering frame here is defined by the physics and the Engine framerates. This mode is the most clear and straightforward (everything is executed safely in a strictly determined order) with no frame lag (results of physics calculations are applied in the current frame). But, on the other hand, this mode is the slowest as there are no asynchronous parallel calculations (everything's in the Main thread). Use this mode in case the time lag is unacceptabe for your application (you need all physics calculations to be applied in the current frame) and you want maximum simplicity and strictly determined order of execution for user code (physicsUpdate and physics callbacks). Before Rendering — обновление физики (вместе с обновлением пространственного дерева и пользовательскими колбэками) выполняется в основном потоке непосредственно перед выполнением рендеринга (render). Количество кадров физики, выполняемых перед кадром рендеринга, определяется частотой кадров движка и частотой обновления физики. Этот режим самый понятный и простой (все выполняется безопасно в строго определенном порядке) без задержки кадров (результаты физических расчетов применяются в текущем кадре). Но, с другой стороны, этот режим самый медленный, так как нет асинхронных параллельных вычислений (все в главном потоке). Используйте этот режим, если временная задержка неприемлема для вашего приложения (вам нужно, чтобы все физические расчеты применялись в текущем кадре) и вы хотите максимальной простоты и строго определенного порядка выполнения пользовательского кода (physicsUpdate и обратные вызовы физики).
- Async Rendering — physics update is performed asynchronously to rendering. In case of several physics ticks per one rendering frame (when the Engine framerate is lower, or catching up is performed), only the first one is executed in parallel, then the physics module waits for the completion of the rendering process, returns to the Main thread and executes the rest of the physics ticks. There is a frame lag (results of physics calculations are applied in the next frame) and there is some ambiguity regarding the time, when user code (physicsUpdate and physics callbacks) is to be executed in case of several physics ticks per one rendering frame (some part is executed before rendering while the other just after it). This mode is the fastest one and is used by default.Async Rendering — обновление физики выполняется асинхронно с рендерингом. В случае нескольких кадров физики на один кадр рендеринга (когда частота кадров движка ниже или осуществляется сокращение отставания), параллельно выполняется только первый, затем модуль физики дожидается завершения процесса рендеринга, возвращается в основной поток и выполняет остальные кадры физики. Присутствует задержка кадра (результаты физических расчетов применяются в следующем кадре) и некоторая неясность относительно времени, когда должен выполняться пользовательский код (physicsUpdate и обратные вызовы физики) в случае нескольких кадров физики на один кадр рендеринга (какая-то часть выполняется до рендеринга, а другая сразу после него). Этот режим является самым быстрым и используется по умолчанию.
The modes are toggled in Global Physics Settings in UnigineEditor.Режимы переключаются в глобальных настройках физики в UnigineEditor.
Catching UpСокращение отставания#
As the Engine has a variable framerate while the physics framerate is fixed, execution of physics calculations always adapts to the current situation.Поскольку движок имеет переменную частоту кадров, а частота кадров физики фиксирована, выполнение физических расчетов всегда адаптируется к текущей ситуации.
In case the Engine framerate drops below the physics framerate (which is a very rare case), some of the physics frames have no enough time for execution and become missed. The physics module keeps such missed frames in memory for a certain period (called Missed Frame Lifetime) and tries to execute them when the situation gets better (Engine FPS grows) or when the CPU is idle while waiting for GPU to complete rendering (if there is enough time). This is called catching up and helps avoiding "slow-motion" effect that occurs when physics frames are dropped off. In case of insufficient hardware capabilities missed frames are removed from the buffer as their lifetime expires and become lost forever.В случае, если частота кадров движка падает ниже частоты кадров физики (что бывает очень редко), некоторые кадры физики не успевают выполниться и пропускаются. Физический модуль хранит такие пропущенные кадры в памяти в течение определенного периода времени (называемого Missed Frame Lifetime) и пытается выполнить их, когда ситуация улучшается (рост FPS движка) или когда процессор простаивает во время ожидания завершения графическим процессором процесса рендеринга (если есть достаточно времени). Это называется сокращением отставания и помогает избежать эффекта «замедленного движения», который возникает, когда физические кадры пропадают. При недостаточных аппаратных возможностях пропущенные кадры удаляются из буфера по мере истечения срока их жизни и теряются навсегда.
Actual time of physics calcuations can go beyond the current budget as the ones performed while waiting for GPU are not taken into account. So the budget is not absolutely strict in this respect and can be exceeded if the CPU is idle.Фактическое время физических расчетов может выходить за пределы текущего бюджета поскольку те, которые выполняются во время ожидания GPU, не учитываются. Таким образом, бюджет в этом отношении не является абсолютно строгим и может быть превышен, если ЦП простаивает.
Deterministic ModeДетерминированный режим#
Deterministic mode ensures that all contacts are solved in the predefined order and visualization of physics in the world is repetitive (on one computer). When this mode is enabled the Engine performs additional sorting of bodies, shapes and joints inside islands after building them.Детерминированный режим гарантирует, что все контакты решаются в заданном порядке, а визуализация физики в мире повторяема (на одном компьютере). Когда этот режим включен, движок выполняет дополнительную сортировку тел, форм (shapes) и сочленений (joints) внутри островов после их построения.
Deterministic mode is unavailable in case there are missed frames — it is simply impossible. Moreover, there may be differences between visualization of physics on different hardware (e.g., AMD and Intel).Детерминированный режим недоступен в случае пропуска кадров — это просто невозможно. Более того, могут быть различия между визуализацией физики на разном железе (например, AMD и Intel).
Determinism is guaranteed if there are no missed frames, the same Engine version is used, and the CPUs perform SSE operations similarly.Детерминизм гарантируется, если нет пропущенных кадров, используется одна и та же версия движка, а процессоры одинаково выполняют операции SSE.
Please note that deterministic mode does not come for free, it may eat up to 10-20% of the frame rate, and it also depends on the scene a lot.Обратите внимание, что детерминированный режим может повлиять на производительность — он может съедать до 10-20% частоты кадров, а также сильно зависит от сцены.
The mode can be enabled in Global Physics Settings in UnigineEditor.Режим можно включить в глобальных настройках физики в UnigineEditor.
Stages of Physics SimulationЭтапы физического моделирования#
Simulation of physics goes through a number of stages when it is updated each iteration. They are as follows.В процессе моделирования физики на каждой итерации выполняется ряд этапов:
- Physics updateОбновление физики
- Сollision detectionОбнаружение коллизий
- SimulationМоделирование
- Synchronization of physicsСинхронизация физики
In the performance profiler, the total time of physics simulation is displayed by the Physics counter.В профилировщике производительности, общее время моделирования физики отображается счетчиком Physics.
1. Physics UpdateОбновление физики#
- Before anything else, a spatial tree is updated, this is performed in the Main thread regardless of the current update mode. After we have the up-to-date data regarding how all objects with physical bodies are positioned, it would be safe to transform them or calculate collisions.В первую очередь обновляется пространственное дерево, это выполняется в главном потоке вне зависимости от текущего режима обновления. После того, как у нас будут актуальные данные о том, как расположены все объекты с физическими телами, можно будет безопасно преобразовать их или рассчитать столкновения.
- C++ API Plugin updatePhysics() is called, if this function is implemented for the plugin.Вызывается updatePhysics() плагинов C++, если эта функция реализована для плагина.
- Physics module calls the updatePhysics() of the world logic. Here you can call all functions that handle physics simulation and interactions (and not only that, see the details on updatePhysics() usage).Физический модуль вызывает updatePhysics() из world logic. Здесь вы можете вызвать все функции, которые обрабатывают физическое моделирование и взаимодействия (и не только это, см. подробности об использовании updatePhysics()).
2. Collision DetectionОбнаружение столкновений#
After the script-based changes have been made (bodies with their shapes and joints were transformed according to game logic, physics-based callbacks were set, etc.), physics can be simulated.После того, как были выполнены изменения, реализованные в пользовательской логике (тела с их формами (shapes), а также сочленения (joints) были преобразованы в соответствии с игровой логикой, были установлены обратные вызовы физики и т.д.), можно приступать к моделированию физики.
-
All objects that have physical bodies are found within the Physical distance. They will be simulated during the current physics tick. Make sure that the physical distance in your UNIGINE-based application is not too small, because physical interactions beyond this limit are not simulated, so objects become frozen. However, even if at least one body belonging to an island is found within the physical distance, the whole island shall be simulated.Находятся все объекты, имеющие физические тела в пределах дистанции моделирования физики. Они будут обработаны в течение текущего кадра физики. Убедитесь, что дистанция моделирования в вашем UNIGINE-приложении не слишком мала, потому что физические взаимодействия за пределами этой области не моделируются, а объекты застывают. Однако, если хотя бы одно тело, принадлежащее острову находится в пределах области моделирования, то будет обработан весь остров.
You can force to update nodes that are outside the Physical distance using addUpdateNode() function.Вы можете принудительно обновить ноды, которые находятся за пределами области моделирования физики, используя функцию addUpdateNode(). -
All collisions (shape-shape and shape-surface) along with contact points are found for all colliding bodies among the ones found at the previous step (i.e., intersecting or have the distance between them less than the value of penetration tolerance). Contact points are represented by their coordinates, normals, depth of shapes penetration, relative velocity (between two bodies), relative friction and restitution. So, here we collect all the data that is required to resolve collisions later.Находятся все столкновения (формы с формой и формы с поверхностью ) вместе с точками контакта для всех сталкивающихся тел из числа найденных на предыдущем шаге (т.е. пересекающихся или имеющих расстояние между ними меньше значения Penetration Tolerance). Точки контакта представлены их координатами, нормалями, глубиной проникновения коллизионных форм, относительной скоростью (между двумя телами), относительным трением и коэффициентом восстановления. Итак, здесь мы собираем все данные, которые потребуются для последующего решения коллизий.
If a body is frozen and no contacts are found that would push it out of its frozen state with strong enough impulse, such body is not simulated in the current tick.Если тело застыло и не обнаружено никаких контактов, которые вывели бы его из этого состояния достаточно сильным импульсом, такое тело в текущем кадре не моделируется. - Islands are built using the contacts obtained at the previos step.Острова строятся с использованием контактов, полученных на предыдущем шаге.
- Bodies, shapes and joints are sorted inside islands. By that, we ensure that contacts are solved in the predefined order and visualization of physics in the world is repetitive (on one computer).Тела, формы (shapes) и сочленения (joints) сортируются внутри островов. Тем самым мы гарантируем, что контакты решаются в заданном порядке, а визуализация физики в мире повторяется (на одном компьютере).
In the performance profiler you can find:В профилировщике производительности отображаются следующие данные:
- The total time of collision detection is displayed by the PCollision counter.Общее время обнаружения столкновения отображается счетчиком PCollision.
- The number of contacts is displayed by the PContacts counter.Количество контактов отображается счетчиком PContacts.
- The number of islands is shown by the PIslands counter.Количество островов показывает счетчик PIslands.
- The number of bodies is shown by the PBodies counter.Количество тел показывает счетчик PBodies.
- The total number of joints is shown by the PJoints counter.Общее количество сочленений показывает счетчик PJoints.
Continuous Collision DetectionНепрерывное обнаружение столкновений#
If a sphere or a capsule participates in the contact with any other shape or surface, continuous collision detection (CCD) is performed. UNIGINE takes velocities of the body, radius of its shape and calculates what contacts this body will have (during the current physics tick), assuming it continues its current trajectory. So, unlike the simple collision detection, contacts are analyzed not discretely, once per physics tick, but rather found for the whole frame.Если сфера или капсула участвуют в контакте с любой другой формой или поверхностью, выполняется непрерывное обнаружение столкновения (CCD). UNIGINE берет скорости тела, радиус его формы и вычисляет, какие контакты будут у этого тела (во время текущего физического кадра), предполагая, что оно продолжит свою текущую траекторию. Таким образом, в отличие от простого обнаружения столкновений, контакты анализируются не дискретно, один раз за кадр физики, а находятся для всего кадра.
3. SimulationМоделирование#
When a collision has been detected, collision response is calculated, so that the colliding bodies would gain new velocities.При обнаружении столкновения рассчитывается реакция на столкновение, чтобы сталкивающиеся тела получали новые скорости.
- Here bodies are prepared to participate in collisions: contacts found for them are cached together with contacts from the previous frame — to ensure that they interact with each other properly. Здесь тела готовятся к участию в столкновениях: найденные для них контакты кэшируются вместе с контактами из предыдущего кадра — для обеспечения их корректного взаимодействия друг с другом.
- Collision response for each body is calculated. Based on the gathered contact points data, the Engine computes the impulse each body gets after collision. Contact points are solved in a pseudo-random order to achieve simulation stability and reproducibility.Рассчитывается реакция на столкновение для каждого тела. Основываясь на собранных данных о точках контактов, движок вычисляет импульс, который получает каждое тело после столкновения. Точки контакта решаются в псевдослучайном порядке для достижения стабильности и воспроизводимости моделирования.
-
When contact responses are calculated, joints constraining relative motion of bodies are solved. Joints are solved in the pseudo-random order just like contact points.При расчете реакции на контакты учитываются сочленения (joints) сдерживающие относительное движение тел. Сочленения решаются в псевдослучайном порядке, так же как точки контакта.
Within one physics iteration, joints can be solved several times. The high number of joint iterations increase the precision of calculations, as well as computational load.В рамках одной физической итерации сочленения могут быть решены несколько раз. Большое количество итераций увеличивает точность вычислений, а также вычислительную нагрузку.In the performance profiler, the total time of both collision response and joint solving stages is displayed by the PResponse counter.В профилировщике производительности, общее время реакции на столкновения и решение ограничений, накладываемых сочленениями, показывает счетчик PResponse.
-
The results of contact and joint solving are accumulated and, finally, are applied to bodies. The coordinates of the bodies change according to their new linear and angular velocities.Результаты расчета контактов и сочленений аккумулируются и, наконец, применяются к телам. Координаты тел изменяются в соответствии с их новыми линейной и угловой скоростями.
In the performance profiler, the time of this stage is displayed by the PIntegrate counter.В профилировщике производительности, время этого этапа отображается счетчиком PIntegrate.
In the performance profiler, the total time of simulation stage is displayed by the PSimulation counter.В профилировщике производительности, общее время этапа моделирования отображается счетчиком PSimulation.
4. Synchronization of PhysicsСинхронизация#
Synchronization is the final stage of physics simulation. During the swap() in the UNIGINE main loop, physics module calls its internal updatePhysics() function. Bodies set their calculated transformations to objects. In the next frame, objects will be rendered in their new physics-based positions.Синхронизация является заключительным этапом моделирования физики. Во время swap() в основном цикле UNIGINE физический модуль вызывает свою внутреннюю функцию updatePhysics(). Тела задают свои расчетные преобразования объектам. В следующем кадре объекты будут визуализированы в их новых положениях, основанных на расчетах физики.
If visualizer options are enabled, shapes, joints or contacts of non-frozen bodies will be rendered.При включении соответствующих параметров визуализатора будут визуализированы формы (shapes), сочленения (joints) или контакты (contacts) незастывших тел.
Multi-Threaded Physics SimulationМногопоточное моделирование физики#
Multi-threaded simulation of physics is run when the Async Rendering update mode is selected and there are two or more physics threads.Многопоточное моделирование физики выполняется при выборе режима обновления Async Rendering и наличии двух или более потоков физики.
- updatePhysics() from the world script is always performed in the main physics thread.updatePhysics() из мирового скрипта (World Script) всегда выполняется в основном потоке физики.
-
After that, the Engine takes advantage of multiple CPUs during the collision detection and simulation stage.После этого движок использует преимущества нескольких процессоров на этапах обнаружения столкновений и моделирования.
- Contacts for all physical bodies within the physical distance are found along with all necessary information.Находятся контакты для всех физических тел в пределах дистанции моделирования физики вместе со всей необходимой информацией.
- Islands are created based on the data on object collisions.На основе данных о столкновениях объектов создаются острова.
- As islands have been created, they can be safely handled in separate threads, because they are isolated.После создания островов, их можно безопасно обрабатывать в отдельных потоках, поскольку они изолированы.
- Then threaded islands are synchronized in the main physics thread to exchange data about the current contacts and ones from the previous frames. It will ensure proper physical behavior of bodies.Затем потоки обработки островов синхронизируются в основном физическом потоке для обмена данными о текущих контактах и контактах из предыдущих кадров. Это обеспечит правильное физическое поведение тел.
- From there on, collision response and joints solving are again calculated per island in separate threads.После этого в отдельных потоках снова рассчитывается реакция на столкновение и выполняется решение сочленений для каждого острова.
-
Before physics is synchronized with the world, the engine waits for all threads to finish their calculations. When thread synchronization happens (during the swap stage of the UNIGINE main loop), all assigned physics callbacks are executed in the main thread (the order is as follows: bodies, joints, and triggers), and then physics is applied to nodes.Прежде чем физика синхронизируется с миром, движок ждет, пока все потоки закончат свои вычисления. Когда происходит синхронизация потоков (на этапе swap() основного цикла UNIGINE), все назначенные обратные вызовы физики выполняются в основном потоке (в следующем порядке: тела, сочленения и триггеры), а затем физика применяется к нодам.
Physics callbacks (mainly used for creation, destruction or modification of other objects) are called in the main thread, as this is the only place where such operations can be performed safely.Обратные вызовы физики (в основном используемые для создания, уничтожения или изменения других объектов) вызываются в основном потоке, так как это единственное место, где такие операции могут выполняться безопасно.