La cuestión de la precisión
Desde el principio, el equipo de ingeniería sabía que el mundo continuo iba a afectar significativamente el diseño del motor y el contenido, y el problema central era la estabilidad numérica. Imagina dos personajes caminando en formación a dos metros de distancia en dirección este, lejos del origen. En algún momento, la distancia entre ellos se ve abrumada por la distancia desde el origen, y los personajes parecerán estar "en el mismo lugar".
Con coma flotante, cuanto más se aleje del origen, más precisión perderá, lo que puede causar todo tipo de problemas desagradables. Las cosas no se arreglan bien, aparecen grietas entre mallas adyacentes, el espacio comienza a cuantificarse y los gatos y los perros comienzan a vivir juntos. Dungeon Siege usa la FPU en modo de precisión simple para obtener los obvios beneficios de rendimiento y para igualar la precisión nativa del hardware de video. Sin embargo, incluso si aumentamos la precisión, en última instancia, nunca podría resolver el problema porque se planeó que el mundo fuera increíblemente grande.
El problema de precisión significaba que no sería posible tener un espacio mundial coordinado unificado como la mayoría de los otros juegos. En cambio, la solución fue segmentar el mundo continuo en un conjunto de espacios de coordenadas independientes y alternar entre ellos periódicamente para restablecer la precisión. Se probaron varias ideas dentro de estas limitaciones, y finalmente nos decidimos por una variación de un sistema de portal estándar.
Nuestra solución consiste en un sistema de coordenadas basado en nodos relacionales, en el que cada fragmento de geometría (Nodo de asedio) tiene su propio espacio de coordenadas, y está vinculado espacialmente a la geometría vecina a través de las puertas que comparte en común con esos vecinos. La disposición de los nodos conectados por puertas forma un gráfico continuo que representa todo el mapa mundial. Este sistema de nodos evolucionó con el tiempo desde su objetivo original de mantener la precisión de la FPU para convertirse en el método principal de subdividir el espacio de manera eficiente y la raíz de innumerables optimizaciones.
Para encapsular el concepto de una posición 3D con respecto a un nodo específico, el vector tradicional (x, y, z) tuvo que ser aumentado con una ID de nodo (x, y, z, nodo) y representar un desplazamiento desde el origen de un nodo específico en su lugar. Esta 4-tupla está encapsulada como una Posición de Nodo de Asedio, o SiegePos. Más tarde, agregamos un SiegeRot (quaternion, nodo) para manejar las comparaciones entre orientaciones entre nodos.
La frase "no hay espacio mundial" se convirtió en un mantra para el equipo, aunque literalmente les tomó años a todos entender lo que significaba.