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.
Pour un monde immense sans zone, je choisirais soit un sommet à double précision, soit une virgule flottante avec de plus petits morceaux divisant la terre.
Chaque morceau aurait son propre système de coordonnées. Lorsque vous traversez la frontière pour chacun de ces morceaux, vous transformiez tout en ce système de coordonnées. C'est comme ça qu'ils font dans les sims de vol de toute façon.
Si vous avez de petites zones, je suppose que float sera suffisant.
la source
Je dirais qu'un emplacement réel est un vecteur de 3 flotteurs. Mais il y aurait également un index de zone associé au joueur. (Mais ne fait pas partie de l'emplacement car tout ce qui est géré par ce serveur de zone est dans la même zone et n'a donc pas besoin d'être dans la même structure de données.)
N'oubliez pas qu'il y a au moins 4 zones. Les 4 grands continents. Je ne pense pas que l'un d'entre eux soit à plus de 10 km d'un côté. Par exemple, ce blog avant la dernière extension calcule la totalité de la zone de voyage comme 41 miles carrés. Tous les champs de bataille, toutes les instances, se trouvent chacun dans leur propre zone et coordonnent également l'espace.
En utilisant l'API LUA, vous pouvez obtenir la position du joueur GetPlayerMapPosition () renvoie deux flottants chacun de 0 à 1 en proportion sur toute la carte du monde.
la source
Pour WoW, je m'attends à ce qu'ils utilisent un flottant simple x / y / z - mais par rapport à une «zone» spécifique
Cela aiderait à gérer les «zones en mouvement», par exemple les bateaux et les zeppelins
la source
Habituellement, les jeux en ligne tels que Wow, Tibia etc. Stockez le joueur pos. en utilisant trois variables X + Y + Z dans la méta-table du lecteur SQl. Runescape le fait sans le Z - de cette façon, le joueur est toujours rendu en haut en haut du maillage au sol.
la source
Un flotteur? Eh bien, un tableau de 3 flotteurs pour un jeu 3D. Au moins pour nous, nous utilisons les pieds comme unités, donc tout ce dont vous avez besoin est de 3-4 décimales pour être au point où le bruit de flottement n'est pas un problème. Si une grande zone n'est qu'à un mile ou deux d'un côté, ce n'est pas si grave. Quant au zonage transparent dans les MMO, c'est une toute autre question. Dans le grand schéma des problèmes difficiles dans un MMO, la position de stockage est assez faible sur la liste.
la source