» » » iRacing: Путь к новым повреждениям
iRacing: Путь к новым повреждениям
3 284 3

iRacing: Путь к новым повреждениям

Модель повреждений автомобилей и физика объектов в iRacing давно числятся в списке первостепенных задач, требующих улучшения. Именно над этой задачей авторы iRacing работают на протяжении длительного времени.

Сегодня мы предлагаем вам перевод статьи The Road To New Damage – своего рода отчета о проделанной работе старшего инженера-программиста компании iRacing Ричарда Джоблинга, где он повествует о том, как разрабатывалась новая модель повреждений, чего уже удалось достичь и чего поклонникам iRacing ждать в обозримом будущем.

Начало


Меня зовут Ричард Джоблинг (Richard Jobling) и я занимаю должность старшего инженера-программиста (Senior Software Engineer) в iRacing. Вот уже долгое время моей главной задачей в iRacing была разработка нашей новой модели повреждений. Это был долгий путь и я хочу поделиться с вами некоторыми его деталями.

Когда мы впервые обсуждали улучшение модели повреждений в iRacing, мы сосредоточились на одной цели - добавить машинам части, которые могли бы отваливаться при столкновении. Я сразу же начал пополнять наш список задач новыми пунктами - например, улучшение частиц и звуков в дополнение к ломающимся деталям.

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

Однако, когда мы потратили больше времени, обсуждая приоритеты, стало ясно, что iRacing ценит аутентичность своей симуляции больше, чем другие игры. Это означает, что все системы должны работать сообща, чтобы быть физически точными. Когда мы обсуждаем новые функции, нам нужно определить все физические процессы, которые в них присутствуют.

В случае с повреждениями машин, недостаточно просто разбросать детали и спецэффекты при столкновении. Для iRacing мы хотим смоделировать как можно больше того, что происходит при ударе: изгибание, хруст, ломание, отделение и так далее.

Также, поскольку физика так важна для iRacing, мы хотели контролировать наш код, а не зависеть от сторонних компонентов. В существующих системах есть много упрощений, которые мы хотели бы доработать в будущем.

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

iRacing: Путь к новым повреждениям
на трассе в Лайм-Роке, чтобы получить немного реального опыта в скиппи



у меня были знания из первых рук того, что происходит с машиной при контакте со стеной - неудивительно, что Дейв назначил на проект именно меня!


Конусы


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

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

Проверка столкновений для машин и конусов использует серии сфер. Это отлично в том смысле, что это просто, и мы можем без особых усилий отслеживать много сфер относительно геометрии трассы. Однако, сферами довольно сложно изобразить длинные, плоские или тонкие фигуры, даже конусы. Кроме того, между сферами всегда будут дыры и итоговая общая форма получается бугристой, поэтому для другой машины или конуса нам нужен был набор плоскостей.

Проверка одного набора сфер объекта относительно плоскостей других объектов работала достаточно хорошо. К сожалению, когда порядок объектов менялся, это могло привести к непостоянству результатов. Так, например, конус из сфер хорошо работает, когда проверяется относительно машины из плоскостей, но не наоборот.

Таким образом, у нас были проблемы: мы не могли представить наши формы без использования большого количества сфер, из-за чего использовали два разных способа представления объектов, что приводило к проблемам асимметрии.

Более того, если бы смогли уменьшить нашу обработку столкновений до единого общего представления, столкновения между машинами стали бы более постоянными и не отличались от клиента к клиенту. Так бы мы немного исправили то, что все любят называть лаг-контактами (netcode).

Кроме того, мы всегда боролись с тем, что сферы проходили сквозь стены на высоких скоростях, и теперь конусы могли застревать в машинах. Мы хотели улучшений и в этой области.

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



Что уже работает?


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

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

Столкновения в iRacing не похожи на обычную физику бильярдного шара из компьютерных игр. Обычно удар в компьютерной игре упрощен, он считается мгновенным. Когда один объект отскакивает от другого, реакция происходит моментально и объекты, которые двигались навстречу друг другу, будут расходиться друг от друга, потеряв немного энергии.

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

Это - важный феномен, который iRacing реализует, обсчитывая физику с высокой частотой в 360 Гц и применяя вещь, известную как метод штрафов, для сил, участвующих в ударе. Штрафные силы по своей природе могут разнести факт удара на много кадров и позволяют нам смоделировать большее разнообразие столкновений разных материалов.

Другой важной для iRacing вещью является поверхность трассы - она должна быть плавной для езды, но также и достаточно детальной, чтобы включать все реальные кочки и ямы, которые захватывает наше лазерное сканирование.

Большинство игр для моделирования столкновений с трассой использует меши (mesh, множество треугольников, собранных в сетку произвольной формы - прим. переводчика) низкого разрешения. В iRacing наши поверхности определяются гладкими крупными отрезками дороги, на которые мы накладываем отдельную карту неровностей. Эта карта и содержит в себе все детали трассы в высоком разрешении.

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

Фигуры столкновений ГДК


Чтобы улучшить формы обсчета столкновений, мы решили заменить устаревший, но эффективный, подход со сферами и плоскостями на новую систему, которая бы использовала наборы выпуклых фигур.

Выпуклые фигуры - это хороший выбор, потому что мы по-прежнему можем эффективно их обрабатывать, а собирая их в наборы, мы можем очень точно повторить формы машины.

Для поддержки выпуклых фигур, мы реализовали алгоритм ГДК, который также сделал простым добавление новых фигур - например, нужных для наших шин. Давайте опустим детали алгоритма (алгоритм Гилберта-Джонсона-Кёрти, если вдруг кому-то захочется деталей - прим. переводчика) и просто посмотрим, как выглядят новые фигуры.

Ниже наша машина с новыми ГДК-фигурами.


С новым подходом мы теперь можем сталкивать один набор фигур с другим. Таким образом, обе машины используют одни и те же формы для столкновений, решая наши проблемы асимметрии и давая нам более постоянные результаты.

Другое свойство старых сфер - мы могли перемещать их, чтобы отразить последствия повреждений. Каждая сфера сдвигалась внутрь, чтобы приблизительно показать, как машина изгибалась или ломалась в конкретном месте.

С нашими выпуклыми фигурами мы можем улучшить и это. Мы можем изменять наши фигуры в зависимости от повреждений. На самом деле, мы можем контролировать изменения так, чтобы в каждой фигуре затрагивались только поврежденные области, давая нам больший контроль, чем сферы.

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

Контактные многообразия


К сожалению, физика соприкасающихся выпуклых форм не так проста, как физика сфер и плоскостей.

С нашей старой системой мы могли свести контакты каждой пары сфер/плоскостей к единственной точке, для которой потом рассчитывали силы столкновения и трения.

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

С другой стороны, с выпуклыми фигурами мы можем представить конус, используя всего две фигуры: параллелепипед для основания и пирамиду для верхушки.

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

Вместо того, чтобы дробить конус на отдельные части, как мы делали со сферами, мы предпочли определять, как его основание лежит на земле.

Это решено с помощью так называемого контактного многообразия. Многообразие сохраняет набор контактов, собранных за последние несколько кадров. Благодаря тому, что контакты сохраняются, со временем мы можем определить постоянный набор угловых точек, который будет поддерживать конус.

Картинка ниже показывает пару конусов и их контактные многообразия в состоянии покоя. Тот же подход используется для всех важных частей машины, когда они касаются земли, окружающих стен, других машин и объектов.


Контакты с трассой


К сожалению, когда дело доходит до расчетов с нашей особой поверхностью трассы, новые выпуклые фигуры не так просты и очевидны, как сферы.

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

Как упоминалось раньше, большинство игр представляет окружение в виде сетки треугольников низкого разрешения. Это представление более практично для ГДК-фигур, но и у него есть свои недостатки, которые предстояло решить.

В нашем случае нам нужен высокий уровень детализации. Чтобы достигнуть нужной нам точности, размеры треугольников такой сетки должны быть около полуметра или меньше. Для трассы вроде Нюрбургринга нам в итоге понадобится примерно 5 миллионов треугольников. Всего лишь хранение такого количества треугольников займет почти 100 мегабайт памяти.

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

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

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

Равномерность помогает нам поддерживать стабильную производительность независимо от того, на какой части трека находятся машины. С предыдущей системой крутые повороты или другие сложные зоны работали хуже из-за дополнительных деталей, в то время как сейчас во всех зонах мы имеем одинаковый уровень детализации и одинаковую производительность.

Вот скриншот одного из таких мешей трассы.


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

Одно из преимуществ подхода с мешами - он может применяться и для столкновения частиц эффектов. И когда некоторое время назад мы представили новые эффекты частиц, у нас появилась возможность использовать меши раньше, а не ждать завершения всей системы столкновений и повреждений. Так что меши уже там и используются.

Крепления


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

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

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

Более того, мы хотим возможность отделять некоторые части машин, когда они достаточно повреждены. И во многих случаях мы хотим, чтобы эти части оставались прицеплены к машине - например, когда капот открылся, но остался на петлях и должен хлопать вверх-вниз.

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

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

Когда фигуры определяют столкновение, они генерируют силы, распространяющиеся сквозь каждое крепление и наносящие соответствующие повреждения. Каждый полученный контакт постепенно повреждает крепления, из-за чего фигуры могут ломаться, а в конце концов, если возможно, и отваливаться.

Ниже вы можете увидеть картинку, показывающую нашу машину, с кубиками в местах креплений.


Отделение деталей


Еще нам необходимо точно моделировать последствия потери деталей. Для каждой части нам нужно определить массу, инерцию и их влияние на машину в целом - как когда они прикреплены на своем месте, так и когда они убраны.

У нас в iRacing есть довольно сложный решающий алгоритм для нескольких тел, который рассчитывает, как все соединенные части машины взаимодействуют с учетом всех внешних и внутренних сил, воздействующих на систему, на каждом шаге симуляции.

Система нескольких связанных тел крайне важна для того, как мы моделируем наши машины, и позволяет нам строить точное представление всей связанной геометрии - в том числе, подвески, трансмиссии и шасси.

Поскольку решателю нескольких тел приходится выполнять множество работы в реальном времени, наша система спроектирована так, чтобы заранее оптимизировать код для работы с частотой 360 Гц. К сожалению, поскольку мы заранее оптимизируем код, это предполагает, что расположение тел должно быть неизменным. Другими словами, мы не можем легко отсоединять или присоединять тела, составляющие машину.

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

После того, как деталь отваливается, мы заменяем ее новой самостоятельной частью, которая отдельно обрабатывает свои столкновения и физику, поэтому она может отскакивать и кувыркаться по дороге независимо от машины.

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

Теперь, когда все эти отдельные массы учитываются динамически, мы можем точно рассчитывать массы и энергию при больших столкновениях.

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


Липкие стены


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

С новой системой у нас были те же проблемы - они происходили из-за использования метода штрафов. Этот метод требует, чтобы сталкивающимся объектам было позволено пересекаться. Глубина такого пересечения затем используется для определения соответствующей силы столкновения. К сожалению, если объекты мягкие или движутся очень быстро, этот подход перестает работать. Если какие-то из объектов успевают пройти сквозь стену и частично оказаться с другой стороны - машина целиком застревает.

С нашими новыми фигурами мы видели бы эту проблему довольно часто - особенно для частей вроде панелей корпуса и капотов, которые тоньше, чем старые сферы.

Отчасти, именно из-за этой проблемы готовые компоненты чаще всего моделируют столкновения как мгновенные. Таким поступком они отстраняются от проблем, возникающих, когда объекты пересекаются на более долгое время.

Мы экспериментировали с разными методами решения этой заковыристой проблемы. В основном, мы пытались предсказать проявление проблемы и в этом случае вернуться к мгновенным импульсам столкновений. Однако, результаты никогда не были идеальными и движение в целом было просто неубедительным.

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

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

При глубоком столкновении центральная сфера и основная фигура разделятся. Сфера останется на поверхности или около нее, в то время как основная фигура продолжит двигаться вглубь. Таким образом, мы можем сохранить понимание поверхности для этой фигуры до тех пор, пока не наступит время отскочить от нее. Этот подход позволяет нам использовать метод штрафов, избегая при этом основных его проблем.

Настройка свойств


Построив новые фигуры для столкновений, расположив и соединив наш крепления, нам все еще нужно настраивать связанные с ними параметры.

Фигуры для столкновений имеют параметры, определяющие массу, материал, жесткость, демпфирование, трение и так далее. У креплений определяются материал и лимиты получаемых повреждений и поломки. А для настройки поведения пружин креплений существует еще больше параметров.

Все эти параметры должны быть тщательно определены и указаны для каждой машины. Эта работа досталась нашим инженерам транспортной динамики и это было огромным делом.

Чтобы облегчить работу и ускорить долгий процесс, мы разработали интерфейс для редактирования в реальном времени и назвали его Твикер. Используя Твикер, мы можем настраивать все эти параметры машины прямо во время симуляции и проверять такие вещи, как фигуры для столкновений и позиции креплений.

Твикер сделан с использованием популярной библиотеки Dear ImGui (компонент для создания графических интерфейсов в 3D-приложениях - прим. переводчика), которая позволяет нам быстро адаптировать интерфейс под наши нужды, когда инженеры находят новые и более быстрые способы работы.

Ниже - пример, показывающий Твикер в работе.


События столкновений/повреждений


До сих пор мы рассказывали о том, на что способны новые системы столкновений и повреждений. Но нам также нужно сообщить о результатах другим системам в iRacing.

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

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

Следующие шаги


Когда вся эта новая работа будет завершена, мы сможем начать строить на этом нашем новом фундаменте и добавлять еще больше улучшений.

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

На данный момент, нам нужно сосредоточиться на оставшейся работе. Мы будем заняты обновлением всех наших машин и всех объектов на трассах. Мы должны обновить все в сервисе iRacing, прежде чем сможем выпустить обновление, так как старая и новая системы не могут существовать параллельно из-за слишком большого количества изменений.

Также мы доделываем новые эффекты и звуки. После этого нам нужно будет оптимизировать и отладить все эти новые системы.

С учетом всего сказанного, достичь этого момента - просто захватывающе, и я рад, что могу поделиться этими деталями.

Спасибо.

Ричард.

PS. Мы работаем над видео, в котором будет показана большая часть обсуждаемого выше - надеемся выпустить его в течение пары недель или около того (оригинал опубликован 19 июня 2018 - прим. переводчика).
Обсудить на форуме | Нашли опечатку? Выделите ее и нажмите Ctrl+Enter

Комментарии 2

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent

Спам проверка: *