Проблема точности
С самого начала команда инженеров знала, что непрерывный мир существенно повлияет на дизайн движка и контента, и основной проблемой была численная стабильность. Представьте себе двух персонажей, идущих в строю в двух метрах друг от друга и направляющихся на восток от источника. В какой-то момент расстояние друг от друга перекрыто расстоянием от начала координат, и символы окажутся «в одном месте».
С плавающей точкой, чем дальше вы находитесь от начала координат, тем больше точности вы теряете, что может вызвать самые неприятные проблемы. Вещи не сортируются правильно, между соседними сетками появляются трещины, пространство начинает квантоваться, и кошки и собаки начинают жить вместе. Dungeon Siege использует FPU в режиме одинарной точности для очевидного выигрыша в производительности и соответствия исходной точности видеооборудования. Однако, даже если бы мы повысили точность, это в конечном итоге никогда не решило бы проблему, потому что мир был запланирован и стал невероятно большим.
Проблема точности означала, что невозможно создать единое мировое координатное пространство, как в большинстве других игр. Вместо этого решением было сегментировать непрерывный мир в набор независимых координатных пространств и периодически переключаться между ними для сброса точности. В рамках этих ограничений было опробовано множество идей, и в итоге мы остановились на варианте стандартной портальной системы.
Наше решение состоит из реляционной системы координат на основе узлов, в которой каждый кусок геометрии (осадный узел) имеет свое собственное координатное пространство и пространственно связан с соседней геометрией через двери, которые он разделяет с этими соседями. Расположение узлов, соединенных дверями, образует непрерывный график, представляющий всю карту мира. Эта система узлов с течением времени развивалась от своей первоначальной цели поддержания точности FPU, чтобы стать основным методом эффективного разделения пространства и корнем бесчисленных оптимизаций.
Чтобы инкапсулировать концепцию трехмерного положения относительно определенного узла, традиционный вектор (x, y, z) должен был быть дополнен идентификатором узла (x, y, z, node) и представлять смещение от начала координат конкретного узла вместо. Этот 4-кортеж инкапсулирован как позиция осады или SiegePos. Позже мы добавили SiegeRot (кватернион, узел), чтобы обрабатывать сравнения ориентаций между узлами.
Фраза «нет мирового пространства» стала мантрой для команды, хотя буквально потребовались годы, чтобы все поняли, что это значит.
Для огромного беззонального мира я бы выбрал вершину двойной точности или плавающую точку с меньшими кусками, разделяющими землю.
Каждый кусок будет иметь свою собственную систему координат. Когда вы пересекаете границу с каждым из этих кусков, вы преобразуете все в эту систему координат. Вот как они это делают в симуляторах полета.
Если у вас есть небольшие зоны, я думаю, поплавка будет достаточно.
источник
Я бы сказал, что для фактического местоположения это вектор из 3 поплавков. Но также будет индекс зоны, связанный с игроком. (Но не часть местоположения, потому что все, что обрабатывается этим сервером зоны, находится в одной зоне и, следовательно, не обязательно должно быть в одной структуре данных.)
Помните, что есть как минимум 4 зоны. 4 главных континента. Я не думаю, что кто-то из них находится на расстоянии более 10 км. Например, в этом блоге, посвященном последнему расширению, вся проезжая часть рассчитывается как 41 кв. Миль. Все поля битвы, все экземпляры, каждый со своей зоной и пространством координат.
Используя LUA API, вы можете получить положение игрока. GetPlayerMapPosition () возвращает два числа с плавающей точкой от 0 до 1 в виде пропорции по всей карте мира.
источник
Для WoW, я ожидаю, что они используют простое число с плавающей точкой x / y / z - но относительно определенной «зоны»
Это поможет обрабатывать «движущиеся зоны», например, лодки и дирижабли
источник
Обычно онлайн-игры, такие как Wow, Tibia и т. Д. Магазин игрока поз. используя три переменные X + Y + Z в мета-таблице игрока SQl. Runescape делает это без Z - таким образом, игрок всегда рендерится сверху на вершине наземной сетки.
источник
Поплавок? Ну, массив из 3 поплавков для 3D-игры. По крайней мере, для нас мы используем ноги в качестве единиц, поэтому все, что вам нужно, это 3-4 десятичных знака, чтобы быть в точке, где шум с плавающей точкой не является проблемой. Если большая зона находится всего в миле или двух на стороне, это не так уж и важно. Что касается прозрачного зонирования в MMO, это совсем другой вопрос. В общей схеме сложных проблем в MMO, позиция хранения в списке довольно низкая.
источник