A questão da precisão
Desde o início, a equipe de engenharia sabia que o mundo contínuo afetaria significativamente o design do mecanismo e do conteúdo, e o principal problema era a estabilidade numérica. Imagine dois personagens andando em formação a dois metros de distância, indo para o leste, longe da origem. Em algum momento, a distância um do outro é superada pela distância da origem, e os personagens parecerão estar "no mesmo local".
Com o ponto flutuante, quanto mais você se distancia da origem, mais precisão perde, o que pode causar todo tipo de problemas desagradáveis. As coisas não estão bem, rachaduras aparecem entre malhas adjacentes, o espaço começa a se quantificar e gatos e cães começam a viver juntos. O Dungeon Siege usa a FPU no modo de precisão única para os benefícios óbvios de desempenho e para corresponder à precisão nativa do hardware de vídeo. No entanto, mesmo se aumentássemos a precisão, ele nunca conseguiria resolver o problema porque o mundo estava planejado para ser e acabou incrivelmente grande.
O problema da precisão significava que não seria possível ter um espaço de coordenadas mundial unificado como a maioria dos outros jogos. Em vez disso, a solução foi segmentar o mundo contínuo em um conjunto de espaços de coordenadas independentes e alternar entre eles periodicamente para redefinir a precisão. Várias idéias foram testadas dentro dessas restrições e, finalmente, decidimos por uma variação de um sistema de portal padrão.
Nossa solução consiste em um sistema de coordenadas relacional baseado em nó, no qual cada parte da geometria (Nó Siege) tem seu próprio espaço de coordenadas e é ligada espacialmente à geometria vizinha através das portas que compartilha em comum com esses vizinhos. A disposição dos nós conectados por portas forma um gráfico contínuo que representa o mapa do mundo inteiro. Esse sistema de nós evoluiu ao longo do tempo a partir de seu objetivo original de manter a precisão da FPU para se tornar o principal método de subdividir o espaço com eficiência e a raiz de inúmeras otimizações.
Para encapsular o conceito de uma posição 3D em relação a um nó específico, o vetor tradicional (x, y, z) teve que ser aumentado com um ID do nó (x, y, z, nó) e representar um deslocamento da origem de um nó específico. Essa tupla de 4 está encapsulada como uma posição do nó de cerco, ou SiegePos. Posteriormente, adicionamos um SiegeRot (quaternion, nó) para lidar com comparações entre orientações entre nós.
A frase “não há espaço no mundo” tornou-se um mantra para a equipe, embora literalmente demorasse anos para que todos entendessem completamente o que isso significava.
Para um mundo imenso sem zona, eu optaria por um vértice de precisão dupla ou ponto flutuante com pedaços menores dividindo a terra.
Cada pedaço teria seu próprio sistema de coordenadas. Quando você cruza a fronteira para cada um desses blocos, você transforma tudo para esse sistema de coordenadas. É assim que eles fazem isso nos simuladores de voo.
Se você tem pequenas zonas, acho que flutuar será suficiente.
fonte
Eu diria que para localização real é um vetor de 3 carros alegóricos. Mas também haveria um índice de zona associado ao player. (Mas não faz parte do local, porque tudo tratado por esse servidor de zona está na mesma zona e, portanto, não precisa estar na mesma estrutura de dados.)
Lembre-se de que existem pelo menos 4 zonas. Os 4 principais continentes. Eu não acho que nenhuma delas tenha mais de 10 km de lado. Por exemplo, este blog antes da expansão mais recente calcula toda a área passível de viagem como 41 milhas quadradas. Todos os campos de batalha, todas as instâncias, estão cada um com sua própria zona e espaço de coordenadas.
Usando a API LUA, você pode obter a posição do jogador GetPlayerMapPosition () retorna dois carros alegóricos, cada um de 0 a 1 como uma proporção ao longo de todo o mapa do mundo.
fonte
Para WoW, espero que eles usem um float simples x / y / z - mas em relação a uma 'zona' específica
Isso ajudaria a lidar com 'zonas móveis', por exemplo, barcos e zepelins
fonte
Geralmente jogos online como Wow, Tibia, etc. Armazene o jogador pos. usando três variáveis X + Y + Z na meta-tabela SQl player. O Runescape faz isso sem o Z - dessa forma, o jogador é sempre renderizado no topo, no topo da malha do solo.
fonte
Um carro alegórico? Bem, uma série de 3 carros alegóricos para um jogo em 3D. Pelo menos para nós usamos pés como unidades, então tudo que você precisa é de 3 a 4 casas decimais para estar no ponto em que o ruído da bóia não é um problema. Se uma grande zona está a apenas uma milha ou duas de um lado, não é tão grande coisa. Quanto ao zoneamento transparente nos MMOs, isso é uma questão completamente diferente. No grande esquema de problemas difíceis em um MMO, a posição de armazenamento é bastante baixa na lista.
fonte