Застрял в текстурах? Вам сюда! (По быстрому) Привет, реакторчане! Хочу немного рассказать про 3d, ра

песочница 

Застрял в текстурах? Вам сюда! (По быстрому)

Привет, реакторчане! Хочу немного рассказать про 3d, разработку игр и контента, создаваемого  для неё.


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

 Для полной картины, думаю, стоит начать с самого начала - создания 3d модели и текстурирования. 

 За основу возьмем  одну из простых фигур - куб. 3D модель, как многие уже знают, состоит из вершин (vertex)  в трехмерном пространстве, соединенных гранями (edge) . Эти вершины и грани образуют полигон . Есть несколько типов полигонов: треугольный (tris), четырехугольный (quads) и ngone - полигон в котором более 4-х вершин. (рис1)


песочница

                                                                                                      рис1.


   Теперь, для текстурирования нашего объекта , нам необходимо создать UV развертку. Давайте сделаем это на примере картонной коробки, которую вы развернули на полу. Uv развертка - это ваша модель, развернутая в двумерном пространстве. Т.е все полигоны нашего объекта будут расположены в одних UV координатах (плоскости). (рис2). 


песочница

                                                                                 

                                                                                                    рис2.

Наша модель готова к текстурированию! Разберемся что же такое текстура, в которой все застревают!? Текстура - это всего лишь 2d картинка (растровое изображение), используемое для придания фактуры и детализации нашей 3d модели, накладываемое по uv развертке и не более того. Обычно используют текстуру размером 1x1 т.е. 2048х2048. Пример: Рис3.  


песочница

                                                                                                      Рис3. 


    Теперь о главном!  Так почему же объекты в играх застревают друг в друге, проваливаются сквозь пол, и отталкивают в космос?! Во всем виноваты коллайдеры (collider) и физика движка. Что же такое коллайдер?  Если проще, то коллайдер - это такая же сетка из вершин и граней с помощью которой, физический движок просчитывает столкновения между объектами. Только эта модель не отображается. Есть несколько основных типов коллайдеров: Box collider,Sphere Collider, Mesh collider и другие (рис4) . Чем они проще (чем меньше полигонов ), тем быстрее движок просчитывает их взаимодействие. Из названий первых двух понятно, что эти коллайдеры представляют собой куб и сферу, а третий это сетка, которая в точности повторяет наш объект или её более упрощенный вариант. 

 Рассмотрим два первых вида на модели чайника, из известной программы 3dmax в не менее  известном движке Unity.

                                                                                                   

                     

/
/
\ /
\ /
Box collider
Sphere Collider,песочница

                                                                                                         Рис4.


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

                                                                                              Пример.

                                    

песочница


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

                                                                                          Пример.


песочница


Так из-за чего тогда происходят застревания? - Из за ошибок в просчете физики. А если точнее, то из-за скорости её просчета. Если говорить простым языком, то проверка столкновений (и не только) объектов в игре производится несколько раз за определенное время. И если один объект попадает в другой, в промежутке между просчетами, получается знакомый нам эффект застревания.


Подробнее



/ / \ / \ / Box collider Sphere Collider


песочница
Еще на тему
Развернуть

Отличный комментарий!

Для совсем поверхностного объяснения - сойдет.

Но если вдаваться в вопрос то это некорректно.

tl;dr, т.е. если лень читать, - объект не просто попал внутрь другого т.к. скорость слишком большая - он просто вылетит либо назад, либо вперед (за уровень). Застревание происходит потому что произошла какая-то дичь и движок охуел.

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

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

Первый значит следующее - объект в кадре 1 был в точке А, в кадре 2 по расчетам получился в точке Б. При просчете движения считается функция движения между А и Б, и если объект в какой-либо точке движения (читай - в точке формулы, с определенной точностью) прошел через препятствие - он будет вытоклнут назад, иначе (недостаточная точность) он просто не поймет что там было препятствие и окажется за ним.

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

В любых современных движках, даже в юнити, такого сорта застревание, а именно то что называется "ааа пацаны в текстурах застрял", чаще обычно происходит не из-за косяков физики. Вертексная физика не имеет решений для такого сорта проблем (это выльется в уход в рекурсию) и в качестве крайнего средства выталкивает объекты друг из друга - т.е. никогда не вываливается в случай застревания в случае "коллайдер+коллайдер". Проблемы с этим видеть со всякими трупами в халфе или еще где-то где рэгдолл дохлого противника дергается как больной т.к. физика пытается вытолкнуть отдельные коллайдеры рэгдолла и сталкивается с противоречиями, например, с проблемами обратной кинематики (объекты из множества костей с сочленениями и неразрывными связями между ними) или с пачкой коллайдеров (куча камней с зачем-то сделанными отдельными коллайдерами стоят скопом и физика не понимает куда вытолкнуть объект - между ними ил наружу).

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

Также указанный пример с толканием чайника - хорош как иллюстрация, но опять-таки использует фундаментально неверный костыль. Толкая в плеймоде (игра запущена в редакторе юнити) чайник изменяются его математические координаты, т.е. в юнити - transform. Это _не является физическим просчетом_ и физика считает это как "телепортацию" - т.е. в каждом кадре внезапно обнаруживает что чайник без видимой причины изменил местоположение, хотя к нему не было приложено силы, и перерасчитывает _всю_ физику. Если его протолкнуть в превью через коллайдер, читай - тянуть достаточно сильно - он пролетит насквозь, при этом он не сделал бы это под воздействием реальной силы, указанной через физический движок, т.к. сработала бы экстраполяция/интерполяция, в зависимости от его настроек. Это также дико негативно влияет на производительность.

Также: сферическая модель коллайдера, как и цилиндрическая, не является мешем или вообще структурой, состоящей из полигонов. Физика расчитывает ее в виде формул, исходящих из радиуса, т.к. это проще и точнее для физических расчетов коллизий между двумя телами, поэтому объяснение этих моделей столкновений через вершины (вертексы) и полигоны также не верно (как и для box коллайдера, который описывается как центр+ширина/высота и использует их формулы вместо вертексов). Хорошим примером является физика колес, которая также есть в юнити, и именно поэтому коллайдеры, отличные от коробки-сферы-цилиндра являются глючными, тормозными и не рекомендуются к использованию т.к. физике сложно их математически обсчитать.

Одним из банальных примеров того что даже в архаичной физике не происходит застреваний на основе скорости является первый дум и спидраннерский трюк Void Glide - если объект движется настолько быстро что в первом кадре просчета находится строго "до", а во втором - строго "после" препятствия, то он вылетает наружу (и можно выйти за пределы уровня), т.к. там использовалась исключительно экстраполяция между начальной и конечной точкой без учета интерполяции и физика считалась по игровым тактам.

Извините за простыню.
Tharifas Tharifas 29.05.202008:05 ссылка
+37.8
Комментарии 26 28.05.202005:22 ссылка 111.9
Клёвая тема
dad1909 dad1909 28.05.202014:43 ответить ссылка 2.0
Когда задолбался активировать ак, и решил что-то годное запилить в чистилище! Я бы даже лайк поставил. Если мог бы...
GAnt GAnt 28.05.202015:44 ответить ссылка 0.0
Чувак рассказал комплекс проблемы. Что есть объекты, что есть коллайдеры, что движки просчитывают именно их взаимодействие, что они отталкиваются друг от друга. И далее пояснил, что ошибки возникают из-за скорости просчета, отсюда и идёт застревание, т.к. не успели просчитать, и объект застрял в другом, вместо того, чтобы оттолкнуться.
Я всей этой хуйни не знал, мне было интересно.
Так че ты доебался?
Mustos Mustos 29.05.202006:43 ответить ссылка 29.7
а ещё чувак запилил этот пост для выхода из чистилища
так что чувак молодец
Чё уж там. Тогда сразу бы "На всё воля Божья!".
Пили еще.
Таким понятным для картошки языком я б почитал.
Для совсем поверхностного объяснения - сойдет.

Но если вдаваться в вопрос то это некорректно.

tl;dr, т.е. если лень читать, - объект не просто попал внутрь другого т.к. скорость слишком большая - он просто вылетит либо назад, либо вперед (за уровень). Застревание происходит потому что произошла какая-то дичь и движок охуел.

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

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

Первый значит следующее - объект в кадре 1 был в точке А, в кадре 2 по расчетам получился в точке Б. При просчете движения считается функция движения между А и Б, и если объект в какой-либо точке движения (читай - в точке формулы, с определенной точностью) прошел через препятствие - он будет вытоклнут назад, иначе (недостаточная точность) он просто не поймет что там было препятствие и окажется за ним.

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

В любых современных движках, даже в юнити, такого сорта застревание, а именно то что называется "ааа пацаны в текстурах застрял", чаще обычно происходит не из-за косяков физики. Вертексная физика не имеет решений для такого сорта проблем (это выльется в уход в рекурсию) и в качестве крайнего средства выталкивает объекты друг из друга - т.е. никогда не вываливается в случай застревания в случае "коллайдер+коллайдер". Проблемы с этим видеть со всякими трупами в халфе или еще где-то где рэгдолл дохлого противника дергается как больной т.к. физика пытается вытолкнуть отдельные коллайдеры рэгдолла и сталкивается с противоречиями, например, с проблемами обратной кинематики (объекты из множества костей с сочленениями и неразрывными связями между ними) или с пачкой коллайдеров (куча камней с зачем-то сделанными отдельными коллайдерами стоят скопом и физика не понимает куда вытолкнуть объект - между ними ил наружу).

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

Также указанный пример с толканием чайника - хорош как иллюстрация, но опять-таки использует фундаментально неверный костыль. Толкая в плеймоде (игра запущена в редакторе юнити) чайник изменяются его математические координаты, т.е. в юнити - transform. Это _не является физическим просчетом_ и физика считает это как "телепортацию" - т.е. в каждом кадре внезапно обнаруживает что чайник без видимой причины изменил местоположение, хотя к нему не было приложено силы, и перерасчитывает _всю_ физику. Если его протолкнуть в превью через коллайдер, читай - тянуть достаточно сильно - он пролетит насквозь, при этом он не сделал бы это под воздействием реальной силы, указанной через физический движок, т.к. сработала бы экстраполяция/интерполяция, в зависимости от его настроек. Это также дико негативно влияет на производительность.

Также: сферическая модель коллайдера, как и цилиндрическая, не является мешем или вообще структурой, состоящей из полигонов. Физика расчитывает ее в виде формул, исходящих из радиуса, т.к. это проще и точнее для физических расчетов коллизий между двумя телами, поэтому объяснение этих моделей столкновений через вершины (вертексы) и полигоны также не верно (как и для box коллайдера, который описывается как центр+ширина/высота и использует их формулы вместо вертексов). Хорошим примером является физика колес, которая также есть в юнити, и именно поэтому коллайдеры, отличные от коробки-сферы-цилиндра являются глючными, тормозными и не рекомендуются к использованию т.к. физике сложно их математически обсчитать.

Одним из банальных примеров того что даже в архаичной физике не происходит застреваний на основе скорости является первый дум и спидраннерский трюк Void Glide - если объект движется настолько быстро что в первом кадре просчета находится строго "до", а во втором - строго "после" препятствия, то он вылетает наружу (и можно выйти за пределы уровня), т.к. там использовалась исключительно экстраполяция между начальной и конечной точкой без учета интерполяции и физика считалась по игровым тактам.

Извините за простыню.
Tharifas Tharifas 29.05.202008:05 ответить ссылка 37.8
А поподробнее про HAVOC можно? Я видел только что в 2019.3 они его прикрутили как альтернативную физику для DOTS проектов, не могу найти ничего про отказ от PhysX
Хм, чет у меня было ощущение что они переходят. Похоже что для DOTS и в виде альтернативы, да.
Подробнее сам не знаю, не щупал.
Когда комментарий намного корректнее чем сам пост.)))

Чутка позанудствую.
Кроме интерполяционного и экстраполяционного, в Юнити по дефолту используется другой метод.
Он близок к описанному "интерполяционному", но не имеет сглаживания по числу кадров физики. За счет сглаживания включенная интерполяция более ресурсоемка, чем дефолтный метод, и слегка "запаздывает", т.к. использует накопление данных за нек. "кадров" физики.

Экстраполяция в Юнити вообще реализована "так себе", очень низкая точность. Ни разу не сталкивался с ситуациями, когда целесообразно было бы ее использование.
Fosgen Fosgen 29.05.202010:15 ответить ссылка 1.8
ну вот, очередной день без деградации
Лови Тех Артиста !
Заебали, я сюда деградировать захожу.
Ого!Вот такое бы еще почитать. Подпишусь пожалуй.
Во всем виноваты коллайдеры (collider) и физика (с)

Чертовы ученые! Так и знал, что коллайдер построили, чтобы я в текстуры проваливался.
_Astral_ _Astral_ 29.05.202009:24 ответить ссылка 4.4
От ты Америку открыл. Лучше б написал как с этим бороться. Может быть мамкины кодеры перестали бы косячить. А то даже НЕ в инди хватает такого.
sepofowa sepofowa 29.05.202009:35 ответить ссылка -2.1
Словно вне инди кодят богоподобные существа, ага. Зачастую инди - пет проекты тех же кодеров.
Vulpo Vulpo 29.05.202010:22 ответить ссылка 0.8
Как раз чем больше проект, тем проще в нем лажануть так что не заметят.

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

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

И тут ничего не поделать, разработка игры, занятие дорогое, и издатель просто не станет тратить миллионы на полирования без конца уровней.
Немного занудства.
Полигоны от четырех сторон и более это исключительно 3D редакторская абстрация. В классическом пайплайне рендера (без реймарчинга) видеокарта оперирует исключительно треугольниками, отрезками и точками.
bad_news bad_news 29.05.202010:20 ответить ссылка 0.6
Забавно слышать это выражение про застревание от коллег-моделлеров.
>Есть несколько типов полигонов: треугольный (tris), четырехугольный (quads) и ngone - полигон в котором более 4-х вершин.
с таким подходом можно выделить только один тип ngone-полигон с n вершинами, где n >= 3
Интересно как в ирл просчитываются взаимодействия, тоже с упрощениями когда нужно ?
Но ведь ngone имеет смысл только в контексте редактора, а в игре это всё треугольники.
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
Вагктд News
• ВД® @50pets
Читать
V
В Мельбурне опоссум пытался пролезть на кухню ночью,но оказался слишком толстым. Хозяин дома разломал стену, чтобы расширить дыру, пока его жена кормила зверя виноградом чтобы успокоить ЫТ1у/2РЬук8В
подробнее»

спасение песочница застрял застрял в текстурах жирный опоссум поссум

Вагктд News • ВД® @50pets Читать V В Мельбурне опоссум пытался пролезть на кухню ночью,но оказался слишком толстым. Хозяин дома разломал стену, чтобы расширить дыру, пока его жена кормила зверя виноградом чтобы успокоить ЫТ1у/2РЬук8В