0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
1 | |
Как избежать проблем с плавающей запятой на больших картах21.04.2024, 16:42. Показов 2002. Ответов 34
Всем привет!
Собственно, уже второй раз поднимаю этот вопрос. Первая тема носила теоретический характер. Я как бы слышал об этой проблеме, но не сталкивался с ней вживую. А вот теперь, когда настала пора собрать мои наработки в кучку, вижу, что проблема реально есть и я даже пока вообще не представляю как ее решить. Имеется карта размером 6000х6000 юнитов (6х6 км). Совсем небольшая карта, если в игре есть автомобиль. Центр координат в центре карты, т.е. если отойти на край карты, удаление от центра будет +/- 3000. И вот на этом удалении имеем вот это: Дрожание анимации персонажа начинается уже где-то при удалении от центра на чуть больше 1000 юнит. Чем дальше, тем хуже. Т.е. эффективная карта должна быть 2х2 км (с 0:0:0 в центре), чтобы не было такого дрожания. Но это же несерьезно в 2024 году. Я читал про джиттеринг и способы его решения методом переноса центра координат мира к игроку и т.д. Но, во-первых, все эти методы довольно старые, я нахожу статьи и видео 2019-2020 года. И они не идеальны, т.к. несут некоторые проблемы. К тому же незнание английского языка не способствует хорошему пониманию найденного материала (переводчик переводит, но как-то не так, как это хочет сказать автор). Вопрос к форумчанам. Если кто-то делал большие открытые миры, кто как решал проблему с джиттерингом плавающей запятой?
0
|
21.04.2024, 16:42 | |
Ответы с готовыми решениями:
34
Возможные проблемы значений с плавающей запятой на больших расстояниях от начала координат Смена структуры: как избежать проблем Как избежать сокращения для чисел с плавающей точкой? Как сложить числа с плавающей запятой |
391 / 301 / 102
Регистрация: 07.05.2017
Сообщений: 2,080
|
|
21.04.2024, 17:31 | 2 |
Слышал про вариант двигать мир вместо игрока, но мне кажется это жопный вариант. так как кодить и делать все нужно будет тоже умышленно шиворот на выворот.
самому интересно, что предложат профи. как бы ни другой движок
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
21.04.2024, 19:08 [ТС] | 3 |
Gammister, ну как-то же делают довольно большие карты в юнити... Возможно, да, используют "жопные" варианты, типа двигают мир вокруг игрока или просто время от времени перемещают центр мира к игроку. Но это ппц же не удобно. Даже я новичок, понимаю какой геммор будет с контролем интерактивных, динамичных и физических объектов. С сохранением и последующей загрузкой позиции и т.д.
PS: потестил немного и заметил, что проблема именно с персонажем. Все остальное (автомобиль, интерактивные объекты и прочее) работают идеально даже на удалении в 20000 юнит.
0
|
Просто Икс
686 / 228 / 46
Регистрация: 15.12.2009
Сообщений: 677
|
|
21.04.2024, 19:58 | 4 |
alexsecl, Clipping Planes в настройках камеры настроено?
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
21.04.2024, 20:04 [ТС] | 5 |
Mc X, стоит по умолчанию. Это же вроде на дальность отсечения рендеринга влияет только, нет?
0
|
Просто Икс
686 / 228 / 46
Регистрация: 15.12.2009
Сообщений: 677
|
|
21.04.2024, 20:23 | 6 |
alexsecl, Я наверное не верно понял твою проблему... :\
Если ты смотришь в "пол", то всеравно проблема остается?
0
|
391 / 301 / 102
Регистрация: 07.05.2017
Сообщений: 2,080
|
|
21.04.2024, 20:41 | 7 |
а контроллер откуда ? может простенький запилить для теста и попробовать ? у меня самописный есть, правда без рук, но проверю у себя сам для интереса. )
Добавлено через 50 секунд возможно костные анимации из за кинематики и подобных вещей могут капризно работать на больших отдалениях (как вариант). с миксамо ?
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
21.04.2024, 21:12 [ТС] | 8 |
Mc X, да, остается.
Да, базовые анимации с миксамо. И навешена еще инверсная кинематика для взаимодействия с объектами. Видимо, это и влияет. Думаю, если простенького персонажа (типа, из бесплатного актива от юнити) поставить, то таких проблем не будет. Вернее, будут, но уже на расстоянии в десятки тысяч юнит, а не через пару тысяч, как у меня Добавлено через 12 минут PS: хотя, если кинематика отключена, все равно персонажа колбасит. Добавлено через 8 минут PSS: сейчас запустил актив из ассет стора - NEO FPS, популярный шутан-контроллер от первого лица. Демо сцену перенес на 3000 юнит от нуля - такой же расколбас персонажа (чуть послабже чем у меня, но тоже заметный). Так что проблема не моего персонажа, а движка юнити в целом...
0
|
283 / 247 / 105
Регистрация: 26.10.2012
Сообщений: 763
|
|
22.04.2024, 08:36 | 9 |
Такая проблема действительно есть, но она проявляется в на порядок больших расстояниях. То есть как минимум на десятках километров. Я у себя на 6000 км подобного и не замечал.
В проекте нет больших трансформ иерархий (это когда один объект лежит на другом и так далее раз 30)? Нет множественных перерасчетов позиций (с соответствующей потерей точности)? Может скрипт работает некорректно, дрожание там оружия отключить забыли или физика параллельно свою лепту вносит? Базовые анимации с mixamo хитрым образом на прицел не влияют?
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 13:21 [ТС] | 10 |
Скелет персонажа можно же отнести к этому? Там куча костей, где каждая следующая кость является дочерней к предыдущей. Корень скелета (позвоночник) практически неподвижен. Но чем ближе к кисти руки, тем больше дрожание (позвоночник не дрожит, ключица почти не дрожит, плечо еле заметно дрожит, предплечье уже довольно заметно дрожит, ну и кисть уже конкретно колбасит).
Причем, если от моего персонажа отдалить камеру (сделать, типа, от третьего лица), то этого дрожания на фоне прочих анимаций персонажа, не заметно. А вот от первого лица, когда руки и оружие прямо перед камерой, дрожание заметно. Я уже испытал несколько активов из юнити стора. Neo FPS, Best FPS (оба от первого лица) и бесплатный актив от юнити Starter Assets - ThirdPerson (от третьего лица). Во всех трех активах начинается заметное дрожание персонажей на +2000 юнит от нуля. Чем дальше, тем хуже. В Starter Assets - ThirdPerson при игре этого дрожания не заметно, т.к. вид от третьего лица и камера довольно далеко от контроллера. Но оно есть. Стоит приблизить камеру в редакторе к руке и дрожание будет видно. Вот снял коротенький видосик с контроллером от юнити в новосозданной пустой сцене и перенесенной по Z на +5000 (чтобы на видео было заметно). https://disk.yandex.ru/i/RP1MNP0YsFlqtg Понятное дело, что если сделать вид от первого лица и поднять руки с оружием к камере, будет такая же тряска как и у моего контроллера. Причем это происходит только с персонажами, которые имеют анимированный скелет. Все прочие объекты на сцене ведут себя отлично. У меня есть автомобиль, иерархически довольно сложный объект с кучей дочерних объектов внутри, все отлично работает. Проблемы начинаются уже с пары-тройки десятков тысяч юнит от нуля. А вот с персонажами уже через пару тысяч. Кто-то может проверить у себя с этим бесплатным контроллером от юнити, будет ли такая же тряска на 3000-5000 от нуля? Есть еще шанс, что конкретно в моем редакторе какие-то настройки изменены и поэтому во всех сценах такое происходит.
0
|
283 / 247 / 105
Регистрация: 26.10.2012
Сообщений: 763
|
|
22.04.2024, 14:14 | 11 |
Посмотрите еще на Scale в импорте модели и в трансформах объектов.
Неадекватные значения типа 100 и 0.01 есть? Они также могут вносить вред.
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 14:29 [ТС] | 12 |
0
|
391 / 301 / 102
Регистрация: 07.05.2017
Сообщений: 2,080
|
|
22.04.2024, 14:41 | 13 |
значит мое предположение о костях все таки верно.
я еще не попробовал свой контроллер без костей от первого лица (не от юнити. свой. намного проще устроенный но не менее функциональный), но предполагаю что не будет такого. в общем я думаю нужно писать на офф. сайт юнити. но скорее всего они об этой проблеме конечно же знают. а вообще, особого уважения к их разрабам я не питаю, так как движок знаю уже лет 4 - 5. фиксить подобную фигню они обычно почему-то не спешат. сижу на нем, потому что привык. как-то так.))
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 15:07 [ТС] | 14 |
Я с юнити работаю всего 4 месяца, а у меня подгорело уже несчислимое количество раз из-за косяков самого движка)
Конкретно вот эта проблема с дрожанием на расстоянии от нуля, очень старая проблема. На буржуйских форумах я нахожу посты с этой проблемой аж от 2012 года! В подавляющем большинстве случаев проблема решается двумя способами. Первый способ - это двигать мир вокруг персонажа, который всегда в 0,0,0. Например, игра Raft построена по этому способу. И второй способ - перемещение всего мира с персонажем, чтобы персонаж был ближе к 0.0.0. Например, персонаж доходит до отметки в 2000 юнит по любой оси и переносится вместе со всем миром к 0,0,0. Все это хорошо, но я даже потестить не могу, т.к. тупо не знаю с чего начать. Не нашел ни одного туториала (плохо ищу, видимо), где с нуля разъяснялось бы как сделать систему пермещения мира. В какой-то старой буржуйской теме от 2015 года прочитал что, можно весь мир сделать дочерним по отношению к пустому объекту. И этот объект время от времени двигать, чтобы персонаж был ближе к нулю. Че, реально это может так просто работать?
0
|
283 / 247 / 105
Регистрация: 26.10.2012
Сообщений: 763
|
||||||
22.04.2024, 16:01 | 15 | |||||
Это не косяк движка, а особенность архитектуры видеокарт заточенных под массовое использование Float32 чиcел.
Точность Float32 - 7 знаков, она и в UnrealEngine, и в CryEngine, и в Африке будет 7 знаков. Под double архитектура видеокарт (особенно мобилок) массово не рассчитана. Есть костыли типа https://docs.unity3d.com/Packa... ering.html Я думаю у вас кривая миксамо анимация рассчитанная не на путешествие, а на показ моделей. Если там много всяких костей, то это значит там просходит много матричных преобразований, а это потеря точности. Вводите свой тип
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 16:32 [ТС] | 16 |
Хм... а как это будет работать со статичными объектами, в частности с навигационной сеткой, которую используют нпс и враги?
0
|
391 / 301 / 102
Регистрация: 07.05.2017
Сообщений: 2,080
|
|
22.04.2024, 18:14 | 17 |
первое, что приходит на ум, держать мир в одном пустом объекте и при действиях игрока двигать и поворачивать не трансформ контроллера, а мира со знаком минус. как бы зеркально. грубо, но понятно. с остальным помозговать нужно. я в спейс шутере сейчас такое же реализовываю. двигаю мир вместо шатла. просто объекты в мире вместо position и rotation использую localPosition и localRotation , так как движения внутри иерархии происходят относительно родителей. пока вроде работает. дальшу будет видно.
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 18:47 [ТС] | 18 |
Gammister, я сейчас пытался мини-сцену сделать со смещением мира (контроллер на 0.0.0 всегда), на первый взгляд вроде все работает, террейн с объектами смещается, все ок. Но... Я использую шейдеры, в частности шейдер, который оставляет на песке следы от ног и колес. Использую тесселяцию для объема следов. Партиклы. Все это смещается вместе с рендер-камерой персонажа. Покопаюсь еще, но, мне кажется, что не будет этот метод нормально работать в моем случае, слишком много компонентов, которые лучше не двигать..
Добавлено через 16 минут PS: почитал документацию к активу Neo FPS. Автор актива затрагивает эту тему и в пакет у него включен инструмент для смещения начала координат (Origin Shift). В документации у него есть небольшой ликбез на эту тему и методы решения. Приложу переведенный кусок, может, кому интересно будет: Кликните здесь для просмотра всего текста
NeoFPS содержит систему под названием origin shift, которая периодически изменяет положение мира и его содержимого, чтобы точка зрения игрока оставалась на определенном расстоянии.
Это используется в больших игровых мирах, чтобы компенсировать визуальные и физические ошибки, которые увеличиваются с увеличением расстояния от точки отсчета. Что такое точность с плавающей точкой. Для хранения позиций трансформации в Unity используются 32-битные значения с плавающей точкой. Стандартное значение с плавающей запятой использует 1 бит для представления знака числа (+ или -), 8 бит для представления знака числа (+ или -). (+ или -), 8 бит для представления экспоненты и 23 бита для представления мантиссы. Вы можете представить себе экспоненту как положение десятичной точки в ряду цифр числа, представленного мантиссой. Например, мантисса равна 1, а экспонента (по основанию 10) 3 означает, что конечный результат равен 1000. Справа от значения мантиссы находятся 3 нуля. Мантисса, равная 1, и экспонента, равная - 4 означает, что конечный результат равен 0,0001.Слева от значения в мантиссе 4 нуля (включая один перед десятичной точкой). Если бы максимальное значение мантиссы равнялось 999, то это означало бы, что если вы хотите представить значение больше 1000 с помощью экспоненты, то в мантиссе не осталось бы достаточно цифр, чтобы представить все, что находится справа от десятичной точки. Если ваше число представляет метры, то к этому моменту вы теряете точность см и мм. Современные (IEEE 754) плавающие числа, очевидно, имеют гораздо большую точность, чем в приведенном выше примере, но все же наступает момент, когда вы теряете точность до миллиметра, и удивительно, как рано проявляется этот эффект. Влияние неточности плавающей точки также усугубляются при выполнении большого количества математических операций, например при вычислении мирового положения из иерархии локальных позиций. Поскольку в NeoFPS оружие персонажа масштабируется, чтобы избежать обрезания декораций, а затем помещается прямо перед камерой, вы увидите, что вершины сетки оружия начинают "плавать" уже на расстоянии 500 м от начала координат. Чем дальше, тем хуже. Если вы когда-нибудь выпадали за пределы карты в игре и позволяли своему персонажу продолжать падать, то вы могли вы могли наблюдать такой эффект, когда персонаж в конце концов превращается в шар из беспорядочных полигонов. К сожалению, из-за того, как Unity работает с иерархиями сцен и представляет трансформации, эта проблема практически неизбежна. Однако есть несколько способов смягчить эту проблему. HDRP вводит мод, который центрирует мир по отношению к камере при рендеринге, что может значительно уменьшить эффект визуального плавания, однако это не помогает при физических столкновениях. Еще одним популярным решением является простой скрипт смещения корня, которым поделились на ныне не существующей вики unity. Оригинальный скрипт с плавающим началом из вики сканировал все корневые объекты в сцене, когда происходило смещение начала координат. Этот подход прост и не требует особых настроек для работы. Однако у него есть главный недостаток - он работает только с базовыми трансформациями. Вы можете адаптировать его для проверки компонентов объекта и применять специализированное поведение, но это добавит много накладных расходов на вызовы GetComponent() и вызовет другие проблемы с расширяемостью. Решение NeoFPS по смещению начала координат использует подписчиков, прикрепленных к объектам в мире. Это позволяет им специализироваться на том если у вас есть новые компоненты, которые требуют уникального решения, вы можете просто создать пользовательский компонент на базе IOriginShiftSubscriber и подписаться на систему смещения начала координат с его помощью. Примером причины, по которой вы может потребоваться специализация для компонентов, которые рассчитывают скорость, используя дельты положения от одного кадра к другому. Они должны компенсировать тот факт, что они только что переместились на сотни метров каждый раз, когда смещается точка отсчета, или получить 1000 м/с скорость в следующем кадре.
0
|
391 / 301 / 102
Регистрация: 07.05.2017
Сообщений: 2,080
|
|
22.04.2024, 20:11 | 19 |
полезная инфа. спасибо !
0
|
0 / 0 / 0
Регистрация: 18.01.2024
Сообщений: 88
|
|
22.04.2024, 20:27 [ТС] | 20 |
Gammister, в активе Neo FPS есть демо сцена с использованием авторской системы сдвига мира к нулю. Потестил по быстрому - довольно интересная система. Предусмотрены отдельные скрипты для различных компонентов. Актив платный, конечно, но можно и "пробную" версию найти на просторах.
0
|
22.04.2024, 20:27 | |
22.04.2024, 20:27 | |
Помогаю со студенческими работами здесь
20
Как следить за числом с плавающей запятой? Как не округлять числа с плавающей запятой? Как проверить введение числа с плавающей запятой Как получилась мантисса числа с плавающей запятой Как сравнить два числа с плавающей запятой? VS считает тип с плавающей запятой как целый Как сложить числа в формате с плавающей запятой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins
В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
|
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang
Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
|
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
|
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
|
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
|
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
|
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента!
4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве).
Первое вводное занятие. . .
|
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
|
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений
Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
|
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
|
UserScript для подсветки кнопок языков программирования в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения:
/ / ==UserScript==
/ / @name CF_DefaultLangSelect
/ / . . .
|
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
|