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.