Le problème de la précision
Dès le début, l'équipe d'ingénierie savait que le monde continu allait affecter de manière significative le moteur et la conception du contenu, et le principal problème était la stabilité numérique. Imaginez deux personnages marchant en formation à deux mètres l'un de l'autre en direction est loin de l'origine. À un certain point, la distance les uns par rapport aux autres est dépassée par la distance par rapport à l'origine, et les caractères semblent être «au même endroit».
Avec la virgule flottante, plus vous vous éloignez de l'origine, plus vous perdez de précision, ce qui peut provoquer toutes sortes de problèmes désagréables. Les choses ne se passent pas bien, des fissures apparaissent entre les mailles adjacentes, l'espace commence à se quantifier et les chats et les chiens commencent à vivre ensemble. Dungeon Siege utilise le FPU en mode simple précision pour les avantages évidents en termes de performances et pour correspondre à la précision native du matériel vidéo. Cependant, même si nous augmentions la précision, cela ne pourrait finalement pas résoudre le problème parce que le monde était prévu et a fini par être incroyablement grand.
Le problème de précision signifiait qu'il ne serait pas possible d'avoir un espace de coordonnées mondial unifié comme la plupart des autres jeux. Au lieu de cela, la solution consistait à segmenter le monde continu en un ensemble d'espaces de coordonnées indépendants et à basculer entre eux périodiquement pour réinitialiser la précision. Diverses idées ont été testées dans ces limites, et nous avons finalement opté pour une variante d'un système de portail standard.
Notre solution consiste en un système de coordonnées basé sur des nœuds relationnels, dans lequel chaque bloc de géométrie (nœud de siège) a son propre espace de coordonnées, et est lié spatialement à la géométrie voisine via les portes qu'il partage en commun avec ces voisins. La disposition des nœuds reliés par des portes forme un graphique continu qui représente la carte du monde entière. Ce système de nœuds a évolué au fil du temps à partir de son objectif initial de maintenir la précision des FPU pour devenir la principale méthode de subdivision efficace de l'espace et la racine d'innombrables optimisations.
Afin d'encapsuler le concept d'une position 3D par rapport à un nœud spécifique, le vecteur traditionnel (x, y, z) devait être complété par un ID de nœud (x, y, z, nœud) et représenter un décalage par rapport à l'origine d'un nœud spécifique à la place. Ce tuple 4 est encapsulé en tant que position de nœud de siège ou SiegePos. Plus tard, nous avons ajouté un SiegeRot (quaternion, nœud) afin de gérer les comparaisons entre les orientations à travers les nœuds.
L'expression «il n'y a pas d'espace mondial» est devenue un mantra pour l'équipe, même s'il a fallu des années à tout le monde pour comprendre ce que cela signifiait.