Top.Mail.Ru

[Геодата] Геодата и координатная сетка. Основы.

[Скопировать ссылку]
admin Опубликовано 2024-9-25 01:25:47 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

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

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Всем привет.
5 ~: ?3 B& i2 {$ o) j6 S$ c& vХочу поделится информацией базовых принципах хранения и обработки геоданных, а также о том, как это связано с координатной сеткой.% C, [$ j+ ]! L+ C
Сразу скажу, я пишу этот мануал в разделе PTS сервера, но он одинаково справедлив(кроме описанной структуры хранения геоданных!) для любой сборки.% c: @( j! S1 {! b! C
0 p& }3 x' f  s0 O' a4 G5 {; U
Общая структура и описание:
7 n4 C+ r0 W) sИгровой мир в L2 описывается тремя координатами. XYZ.
9 |8 M: g; x5 B9 V7 @) d$ nОсь X это направление Запад-Восток(Уменьшение координаты X - это движение на Запад, следовательно увеличение X - движение на Восток)
; v) K9 J  D- }( L: ^2 YОсь Y это направление Север-Юг(Уменьшение координаты Y - это движение на Север, следовательно увеличение Y - движение на Юг)
4 h& r5 l0 s0 ^% O$ ?Ось Z это высота. Из-за особенностей хранения гео-данных на PTS сервере, высота ограничена диапазоном 16 битного значения (От -16384 до 16383)) L- P5 |. Y2 x) }
" e$ e7 ^- s, L4 m1 I% k
Координатная сетка очень плотно связана с геодатой. Далее в тексте, если специально не указано иное, то следует считать, что описания даются в плоскости XY.2 j4 z' q: X2 w) x
Игровой мир делится на Регионы. Обычный Регион представляет из себя квадрат, с размерами 32768 x 32768 точек
6 P6 C: }! w1 x. `, ^6 [Регион в свою очередь делится на 65535 Блоков(сетка 256х256). Таким образом, размер одного Блока 128 x 128 точек.
0 j  r& o4 b0 O3 F( E! G7 ]Блоки бывают трех основных типов(Плоский, Комплексный и Мультислойный). В чем их отличие и особенности я объясню ниже.
0 C7 j/ j7 e" |* m5 d# o( ZКомплексные и Мультислойные Блоки делятся еще на более мелкие элементы - Ячейки. Один Блок вмещает в себе 64 Ячейки в виде сетки 8 х 8. Следовательно одна Ячейка представляет из себя квадрат 16 х 16 точек." C# l7 ]$ \( B7 h1 L6 o$ @
Мельчайшим объектом мира L2 является Точка. Каждая Точка имеет координаты XYZ.( s% l* w4 J0 ~: X7 z7 N
1 q, D, ~; z3 ^/ n
Как хранятся и обрабатываются геоданные на PTS сервере:
7 Y4 o0 ^, D" P" g& s! b4 mДля хранения геоданных, PTS-сервер использует бинарные файлы, в формате X_Y_conv.dat, где X и Y это номера Региона.$ r% V( |8 i$ k1 A$ o) O* ~5 o3 v
Т.к бинарные файлы подразумевают хранение данных в виде массива байт, то для получения каких-то данных, в большинстве случаев происходит сбор чисел больших диапазонов из определенного количества байт.1 O3 X# j/ r* J2 d9 v
Первые 18 байт каждого файла геоданных содержат так называемый Заголовок:
. E& ~0 C1 G4 _, m( i# P0 байт - X региона
5 R6 D& d4 L3 ?# |0 [" C- Q1 байт - Y региона
1 q/ g& H" v- S# C. h+ a0 _2-5 байты остались для меня загадкой, я подозреваю что это два 16 битных значения, но их смысл не понятен, т.к они не изменяются.
3 d5 `9 `. P" a' ?0 [2 j, x9 [6-9 байты образуют 32 битное значение, которое хранит в себе количество Ячеек в регионе.
& W# S. H3 {6 N6 J10-13 байты образуют 32 битное значение, которое хранит в себе количество НЕ Мультислойных блоков в регионе) \2 `! ~' ?' P4 I& W0 T
14-17 байты образуют 32 битное значение, которое хранит в себе количество ПЛОСКИХ блоков в регионе.: w7 r; ~6 Q' b) M
) @5 Q% v8 v0 p5 q2 q
Дальше хранится информация о самих блоках региона по порядку от 0 до 65534 позиции.$ v2 U6 Z( X1 Z1 G
Для удобства восприятия, я буду считать восемнадцатый байт файла региона как нулевой по индексу.& q5 X+ `" E  u; A$ V0 W3 t5 x+ v
0 и 1 байты хранят 16 битное значение, которое указывает на тип блока.# L6 a* H: }0 \* d
0x00 - Это Плоский блок. Размер данных 4 байта.
( f3 r/ Y8 l7 I7 V2 d0x40 - Комплексный блок. Размер данных 128 байт.
* c( j- {) u, N& B0 LВСЕ остальные это Мультислойный блок(В этом случае, тип также указывает еще и на размер блока: Тип * 2 + 65)4 ]2 [; b1 v5 M/ m9 I7 g) P" P
, T! ^: ^$ F5 o
Как и какая информация хранится в Блоке?1 w! b0 C/ J/ F
Для этого нужно небольшое отступление. В мире L2 за возможность движения в определенном направлении, сквозь Ячейку, отвечает еще одна ее характеристика, условно обозначенная как NSWE. Это битовая маска в диапазоне от 0 до 15 включительно.5 z# d2 `* \4 V# G9 R
Что она означает? Это аббревиатура состоящая из первых букв сторон света: North South West East% \1 Z' |) p. G0 }/ V9 b

/ F+ D2 E0 v# e: D7 ?4 u5 S0 - Движение через ячейку запрещено.+ I# `9 B$ o( X9 F
1 - E (1 << 0) Движение на Восток X++ X. ~, |) H! p1 c2 f
2 - W (1 << 1) Движение на Запад X-: Z5 {5 }# {0 M5 u
3 - WE (W | E) X+ || X-
: x( W* _; e+ j1 f' P8 x& {) [4 - S (1 << 2) Движение на Юг Y+
$ N) y3 v! z1 a1 U5 n/ Y7 v5 - SE (S | E) X+ && Y+- e/ v4 g3 C" y' }3 C* c+ U& }. W( ?
6 - SW (S | W) X- && Y+/ d5 \5 v: p) a5 b$ z
7 - SWE (S | W | E) (X- || X+) && Y+% Z# D& H  r* ~# |
8 - N (1 << 3) Движение на Север Y-
7 N& f  p5 d1 {0 T  y9 - NE (N | E) X+ && Y-6 N5 k% n- V3 W2 h! f5 E' @
10 - NW (N | W) X- && Y-
9 [2 U  s7 l8 p7 u7 R1 S11 - NWE (N | W | E) (X- || X+) && Y-
) Y) K  e: S0 k- U* v$ k( Q* b12 - NS (N | S) Y- || Y++ x% ~; L* z, ^6 }9 ^- B' F
13 - NSE (N | S | E) (Y- || Y+) && X+
0 d' U3 s9 U: U) [; K" K5 n& N/ R8 U14 - NSW (N | S | W) (Y- || Y+) && X-* E1 T( J  b! y/ y
15 - NSWE (N | S | W | E) X- || X+ || Y- || Y+& u- p5 F' X; q5 E( g. M

$ {& d. d: C% z2 _7 h9 p/ wТ.е условно, если у вас персонаж стоит в координате 12345, 6789, а вы кликаете в координату 12345, 9876 (т.е Y+) то пройти вы сможете только через те Ячейки, NSWE значение которых удовлетворит выражению:
4 I: K2 q$ `4 i0 J, V(NSWE & S) == S

' z8 v5 C+ w! y1 H
1 `; Z" `$ i5 `' n0 F3 ZВернемся к блоку. Что в нем хранится? Каждый тип Блока хранит данные по своему. Разберем их поочереди.
* t2 z: C" G0 s1 w! f7 GПлоский Блок - Т.к этот тип блока не делится на Ячейки, то значение проходимости общее для всех координат блока(и на PTS это всегда 15, т.е Плоский блок всегда проходим. Плоский блок НЕ ХРАНИТ NSWE). Мы знаем, что размер Плоского блока - 4 байта. Это два 16 битных значения. Каждое значение содержит в себе высоту этого блока в формате ( byte1 << 8 | byte0 & 0xff) & 0x0fff0)
! h) b! a8 K) `5 ]& MКомплексный Блок -
Т.к этот блок разделен на 64 ячейки, а общий размер блока 128 байт, то мы легко вычисляем, что каждая ячейка блока содержит два байта, которые в свою очередь собираются в 16 битное значение.
. C; m6 d8 b% V' m4 v. SКак из одного значения получить NSWE и высоту? Для этого нужно использовать следующую формулу:
# t9 Q$ J8 N2 [" f: W7 s; v' fВысота - ( ( byte1 << 8 | byte0 & 0xff) & 0x0fff0) >> 1 (т.е фактически деление пополам исходного значения)6 s8 j6 n0 t6 T, w1 w
NSWE - ( ( byte1 << 8 | byte0 & 0xff) & 0x0F) (т.е фактически мы берем младшие разряды числа)
/ _6 D3 W: o% L" R& U3 A. TМультислойный Блок - Представляет из себя по сути Комплексный блок, но каждая ячейка которого может содержать как одно, так и несколько значений-слоев(в каждом значении будет зашифрована собственная высота и NSWE)
: Z, q9 Z+ q4 ^5 z! `6 {; H8 h* v/ R' N  ~- I$ v
Как соотнести мировые координаты и конкретный блок в мире L2:
1 s# L3 g, X4 n8 u( R, R) a8 O+ X4 z; Q, p2 l  u
Центр мира L2 с координатами 0, 0 ВСЕГДА находится в квадрате 20_18. Следовательно этот регион мы можем обозначить как Нулевой Регион.6 Q2 L- B- t  T: }
ZERO_R_X = 20;
/ K5 l8 C" F( ~3 r: D6 N, EZERO_R_Y = 18;, H2 E& a6 K( }8 n
Из загруженных гео-данных, мы можем узнать минимальные и максимальные индексы Регионов. (R_X_MIN, R_Y_MIN, R_X_MAX, R_Y_MAX)
$ @1 C8 \# h% Y% i5 P5 L3 {Как мы помним - размер региона по каждой стороне 32768
$ R* O# D6 U- o$ |. D! F+ D0 n7 ?
0 [3 a/ d0 F( ^) {! P) W, Q8 |  M2 kИмея эти данные, мы можем расчитать координаты противолежащих углов Карты Мира по формулам:
- d! P* y8 D1 Q; E3 p+ OWORLD_MAP_MIN_X = (R_X_MIN - ZERO_R_X) * 32768, J! `" x# H- U$ z7 u8 }& ^
WORLD_MAP_MIN_Y = (R_Y_MIN - ZERO_R_Y) * 327680 z4 B* ?! u6 i
5 E: w1 G4 q; Q) c0 V! Q
WORLD_MAP_MAX_X = ((R_X_MAX - ZERO_R_X) + 1) * 32768
( M: S* ?. x+ E. z% cWORLD_MAP_MAX_Y = ((R_Y_MAX - ZERO_R_Y) + 1) * 32768) @* I4 ?, ]8 z. u4 K4 n
4 t% ~( b0 Z: {' w  R( M$ y/ p) t
Вот расчет для High-Five карты мира:
; R2 Z, l( J% z. }WORLD_MAP_MIN_X = (11 - 20) * 32768 = -294912, }5 F/ ~4 I  v5 d/ K
WORLD_MAP_MIN_Y = (10 - 18) * 32768 = -262144( W9 x8 r! l, G% a' h
WORLD_MAP_MAX_X = ((26 - 20) + 1) * 32768 = 2293769 N4 v6 h7 N9 B4 t; _4 f
WORLD_MAP_MAX_Y = ((26 - 18) + 1) * 32768 = 294912. V1 M! Q) x0 K( V5 u
$ w( e0 @* C1 L$ f' e' l' S8 j0 k& r
Т.е карта ХФ представляет из себя прямоугольник с вершинами в точках (-294912, -262144) и (229376, 294912)
+ |) y- L+ @* F! d2 |  I- h+ z8 M" n7 S* R% c) n
Теперь самое важное: Как получить блок(или даже ячейку) из координат?
: R3 J' r" x$ Y2 R5 l7 \Вот пошаговые действия для координат XY:
1 k) F8 |9 t  S+ n& l& @% h) C! o) m( D: Z, X0 z! h3 O
Шаг 1) Восстановим координаты региона из мировых
/ i& q5 Z4 Z" r% o+ m, AREGION_X = (x - WORLD_MAP_MIN_X >> 4) >> 11/ S5 y# b. y' ^: M$ b- L
REGION_Y = (y - WORLD_MAP_MIN_Y >> 4) >> 11! [1 p5 H" ]0 y6 B3 r; b( }9 B: @& N4 Y

2 O  u! H# z# p4 E3 |  mШаг 2) Определим позицию блока по X и Y внутри региона
1 \# u$ e6 T7 D' {& `( X1 t, SBLOCK_X = ((x - WORLD_MAP_MIN_X >> 4) >> 3) % 2566 b+ N; r  d6 k% B! S8 W+ _2 f
BLOCK_Y = ((y - WORLD_MAP_MIN_Y >> 4) >> 3) % 256
* Z7 S# p) {/ p3 h) W# Q- Y- m# W3 o' z' v4 \
Шаг 3) Если искомый блок не плоский, то мы можем получить так же и ячейку.
- `0 f! |9 m9 ?+ h* K6 v1 OCELL_INDEX = (((x - WORLD_MAP_MIN_X >> 4) % 8) << 3) + (((y - WORLD_MAP_MIN_Y >> 4) % 8) % 8)" i7 n7 s4 E" Y: T1 y$ }& b$ E
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.